从计算机原理理解 进程 | 线程 | 协程

从计算机原理理解 进程 | 线程 | 协程

在这里插入图片描述

程序是什么?
例如QQ.exe或者PowerPoint.exe就是一个程序
进程是什么?
是程序双击启动后加载到内存的那部分内容,是系统资源分配的基本单元
线程是什么?
是程序执行的基本单元,也是操作系统(OS)能调度的最小单元
程序如何开始运行?
双击QQ.exe,那么其相关的文件、资源被加载到内存,内存上会为其分配一个空间,装着这个程序的指令和数据,然后程序从main线程开始执行,假如说这个程序里的一个线程里面有一个指令a=3+2,那么3和2会被放到CPU的Register(寄存器)里,然后ALU(数学逻辑单元)会进行运算,运算后会将结果写回内存的a的地址上,PC(程序计数器)会指向下一条需要执行的指令
线程如何进行调度?
通过(OS)操作系统,如linux里面有线程调度器
线程切换(context switch)的概念是什么?
CPU对原线程进行保存现场(到cache),然后执行新线程,完后进行恢复现场,继续执行原线程的这个么一个过程
协程是什么
协程存在线程中,是比线程更轻量化的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。协程相当于在线程内部实现了CPU的原理,拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈

在这里插入图片描述

什么时候用进程、线程、协程
进程:因为存在GIL锁的原因,每个解析器只能同时执行一个线程,所以python下想要充分利用多核CPU,就用多进程,因为每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行、所以多核的情况下,考虑进程数与 CPU核心数相同的多进程
线程:不过特殊情况(特指IO密集型任务,如网络、硬盘读写)下,线程会比进程效率高。因为遇到IO任务能通过OS调度切换到其他线程继续执行,充分利用时间。
协程:目前主流语言基本上都选择了多线程作为并发设施,与线程相关的概念是抢占式多任务(Preemptive multitasking),而与协程相关的是协作式多任务。不管是进程还是线程,每次阻塞、切换都需要陷入系统调用(system call),先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程(线程)。而且由于抢占式调度执行顺序无法确定的特点,使用线程时需要非常小心地处理同步问题,而协程完全不存在这个问题(事件驱动和异步程序也有同样的优点)。因为协程是用户自己来编写调度逻辑的,CPU不用去考虑怎么调度、切换上下文,这就省去了CPU的切换开销,所以协程在一定程度上又好于多线程。
参考资料
https://www.bilibili.com/video/BV1vv411k7L3?p=3
https://blog.csdn.net/zheng199172/article/details/88800275
https://blog.csdn.net/bandaoyu/article/details/90583629?utm_source=app

猜你喜欢

转载自blog.csdn.net/m0_50685012/article/details/112973673
今日推荐