Python线程、进程、协程结合资料的个人理解

1. 首先要理解几个概念:CPU核心,CPU线程,用户态线程、内核线程、线程、进程、协程

  1. CPU核心: 核心数为一个物理CPU拥有的运算单元数量,例如8核,即一个CPU有8个核心,拥有8个独立的运算单元。一个运算单元有一套寄存器,一般还有L1,L2的私有缓存,可以独立执行一个任务(一般是线程),所以一个核心同一时刻只能运行一个线程,不论这个线程是哪个进程的。每隔一定时间,大概几十毫秒,就会切换线程,即切换任务(可能是同一个进程的线程,也可能是另外一个进程的线程,如果是其它进程的线程,会切换CR3,CR3我暂时理解为进程的上下文、状态切换,例如放在也表里的指针数据等等)

  2. CPU线程: 一般来说,一个物理核心就是一个独立的运算单元,一个物理核心(运算单元)同时最多运行一个线程,也就是一个线程数。但是英特尔的超线程技术,可以实现一个核心同时执行多个线程,则产生了逻辑核心数的说法:就是我们说的8核16线程,一个核心能跑二个线程,核心数是8,线程数就是16。
    可以同时执行两个线程是有条件的,CPU在执行一条机器指令时,并不会完全地利用所有的CPU资源,而且实际上,是有大量资源被闲置着的。超线程技术允许两个线程同时不冲突地使用CPU中的资源。比如一条整数运算指令只会用到整数运算单元,此时浮点运算单元就空闲了,若使用了超线程技术,且另一个线程刚好此时要执行一个浮点运算指令,CPU就允许属于两个不同线程的整数运算指令和浮点运算指令同时执行,这是真的并行。所以并不是一定能同时运行两个,需要调度的。

  3. 用户态线程、内核线程: (这部分摘抄,还没有理解,后续更新) 知乎链接1知乎连接2
    用户线程: 指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。
    内核线程: 由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。

    为什么这里需要了解到用户线程和内核线程?用户线程,程序开发者可以自己控制线程的状态,比如阻塞、挂起、排队,内核线程用户无法控制状态,只有内核运行后告知结果,比如遇到阻塞了,就把这个线程挂起来,去执行其他的线程了(线程所在的进程就会因为这个线程被阻塞了,而被内核认为这个线程所在的进程有了阻塞,根据调度机制就会运行下一个应该被运行的线程,这个后面切换的线程就可能是其他进程下的线程了)。这里就衍生出来了协程,在协程中,用户可以通过await手动阻塞,然后让当前线程直接执行其他的任务,当阻塞完成后,通过信号驱动来切换当前线程的状态,可以继续执行下去,减少了内核态遇到阻塞切换线程时切换上下文的操作,从而增加效率,线程的执行顺序就遵循系统的调度算法了。

  4. 线程、进程、协程

    • 线程:cpu执行任务的最小单元
    • 进程:cpu进行分配资源时的最小单元
    • 协程:是通过代码能力,实现单个线程内的任务调度技巧。

    多进程和多线程体现的是操作系统的能力,而协程体现的是程序员的流程控制能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值