CPU中的核与进程,线程间的关系讲解(操作系统基础概念)
CPU中的内核
概念
CPU内核(Die)是CPU中间的核心芯片,由单晶硅制成,用来完成所有的计算、接受/存储命令、处理数据等,是数字处理核心。
各种CPU核心都具有固定的逻辑结果,一级缓存,二级缓存、执行单元、指令级单元和总线接口等逻辑单元都会有科学的布局。
单核和多核的区别
通俗意义上讲,CPU单核就是一个人做同一件事,多核就是多个人同时做同一件事情。
我们知道线程是CPU调度的基本单位,对于单核CPU来说,同一时刻下,只能有一个线程在占用CPU资源进行执行。多个线程之间的切换依靠CPU的调度算法来进行调度。这种多线程间的执行叫做并发执行。
而对于多核CPU来说,每个核心都存在相同的L1、L2、L3缓存结构,相当于每个核心都可以做之前单核下的事情。因此,在同一时刻下,多核CPU就可以同时运行多个线程(同时运行的线程个数取决于CPU核心数),这种多线程间的执行就不是并发了,而是真正的并行执行了。当然,单个核心下执行的线程切换仍然是并发执行的。
CPU多核缓存结构示意图如下所示:
由以上特性可知,单核和多核处理器在性能方面的特点如下:
- 与具有更高时钟频率的多核处理器相比,单核处理器的速度更低
- 与单核处理器相比,多核处理器具有更高的效率和更低的能耗
- 多核共享内存,而单核则完全独立使用内存
- 多核允许线程并行执行,启用指令级并行。
进程和线程的区别与联系
进程是操作系统中资源分配的基本单位。进程是操作系统对正在运行程序的一种抽象,可以将进程看作程序的一次运行。
线程:线程是操作系统中CPU调度执行的基本单位。一个线程是一个“执行流”,每个线程之间都可以按照顺序执行自己的代码,多个线程“同时”执行多份代码。
进程的运行不仅仅需要CPU,还需要很多其他资源,如内存啊,显卡啊,GPS啊,磁盘啊等等,统称为程序的执行环境,也就是程序上下文。
在这里就出现了并发的概念,调度器切换CPU给不同进程使用的速度非常快,于是在使用者看来程序是在同时运行,这就是并发,而实际上CPU在同一时刻只在运行一个进程。
CPU进程无法同时刻共享,但是出现一定要共享CPU的需求呢?此时线程的概念就出现了。线程被包含在进程当中,进程的不同线程间共享CPU和程序上下文。(共享进程分配到的资源)
单CPU进行进程调度的时候,需要读取上下文+执行程序+保存上下文,即进程切换。
由于共享了程序执行环境,这个线程切换比进程切换开销少了很多。在这里依然是并发,唯一核心同时刻只能执行一个线程。也就是上面讲的CPU单核和多核的区别。
如果这个CPU是多核的话,那么进程中的不同线程可以使用不同核心,真正的并行出现了。
线程是CPU调度和分配的基本单位,一定要和 进程是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位 区别清楚。有句话说CPU只能看到线程,可以这么理解,假设我是CPU,我闭着眼,操作系统调度器将一个进程分配给我之后,我拿到进程睁开眼,我看到的是什么?我看到的是进程中的很多线程,那么我现在能调度和分配的是什么?进程?不行,因为我看不到其他进程,何来调度分配,只能调度我看到的那些线程,如果我是4核的话,把线程ABCD分配到核心1234,其他的线程依然要等待分配,至于等待多久,如何分配,暂不在本文讨论范围。于是线程是CPU调度和分配的基本单位。
最后说一下操作系统内存管理模块这里做的事:在这之前,程序员需要为每个程序安排运行的空间,这里的空间指的是内存的物理地址,但是这么的问题就是,每个程序都要协商如何使用同一内存的不同空间,而且程序员还要关心底层内存分配问题。解决办法就是,提出进程的概念,每个进程用一样的虚拟地址空间,CPU上增加了MMU模块负责转换虚拟地址和物理地址,虚拟地址经过操作系统和MMU之后,虚拟地址会映射到不同的物理地址,不同的进程就能获得各自独立的物理内存空间。
另外在有的操作系统里,进程不是调度单位,线程是最基本的调度单位,调度器只调度线程,不调度进程,如VxWorks。
总结:
资源空间: 进程是资源分配的基本单位,每个进程都会有独立的资源空间。而一个进程中包含多个线程,这些线程共享进程所分配的资源。
地址空间: 同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
健壮性: 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
资源消耗: 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
执行过程: 每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
调度单位: 进程是系统进行资源分配和调度的基本单位,线程是CPU调度的基本单位。