进程与线程
本文以范围从大到小介绍CPU核,CPU逻辑线程,程序进程,程序线程
1.CPU的多核多线程(逻辑线程)
中央处理器(CPU,central processing unit)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。CPU 自产生以来,在逻辑结构、运行效率以及功能外延上取得了巨大发展。(form baidu)
拥有几个运算器的cpu就是几核cpu,以我的笔记本举例,R74800H版本的CPU,8核16线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQHbUCAZ-1596803529217)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\1596799684812.png)]
这里的8核,指CPU上面有8个运算器,这里的核是物理核。
这里的16线程是指,通过超线程技术实现的8物理核→16虚拟核。每个物理核心在超线程技术的支持下,可以虚拟出两个逻辑核心(两个线程)。
在操作系统看来,拥有八个虚拟核心,和真正的物理八核一样可用。但是,超线程技术无非是每个物理核心在运算时,多级流水线有时候会有空闲,多虚拟出来的核心就是利用空闲的流水线搭建的“虚拟核心”。
比如,某CPU一个核心拥有16级流水线,大多数时候流水线只用到了8~12级就完成了运算任务,剩下的流水线处于空闲,导致了CPU运算资源的闲置浪费。如果将一个物理核心的16级流水线划分为两段,每段8级流水线虚拟出一个逻辑核心(一个线程),就可以让操作系统以及应用软件为它们同时分配并行运算任务,这样可以让各级流水线都忙起来别闲着,尽量压榨CPU的运算性能潜力,提高性能。
对于高密度运算任务来说,有时候16级流水线耗尽了都忙不过来,根本没有空余的流水线可供调取,这时超线程技术就无米下锅,起不到提升性能的目的了。
2.程序进程,线程
资源分配给进程,同一进程的所有线程共享该进程的所有资源;
处理机分给线程,即真正在处理机上运行的是线程;
线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
每个程序进程可以理解为一种搭载在运算核心上的资源区,每个资源区至少一个线程工人。一个运算核心上面可以搭载多个不同服务,只要算的过来。
若进程数超过核数,进程将分时使用CPU资源。但因为CPU运转速度极快,我们会感到所有进程同时运行。当然,核数越多,这种感觉越明显。
python在调用Process类时会默认使用不同的虚拟核心并行运行不同的进程,但是如果进程数大于虚拟核数,多出的进程就会进入某一个已经有进程运行的虚拟运算器的工作队列,这时系统再使用调度算法,使该虚拟运算器下的进程并发运行。
调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;
并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;
拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等;线程所维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等;
系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
3.父进程与子进程
如果某一父进程fork出了子进程,子进程是父进程的资源副本。