这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记
进程,一个运行的程序(代码)就是一个进程。保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统,所有进程间数据不共享,开销大。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。
线程, 有时被称为轻量级进程 (Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。不能独立存在,依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。
进程 vs 线程
- 根本区别:进程是对运行时程序的封装,是系统资源调度和分配的基本单位 线程是进程的子任务,CPU调度和分配的基本单位,实现进程内并发
- 所处环境:在操作系统中能同时运行多个进程,在同一个进程中有多个线程同时执行
- 内存分配:系统在运行的时候会给每个进程分配不同的内存空间,但是不会给线程分配,多个线程共享同一进程内的资源
- 开销方面:每个进程都有自己独立的代码和数据空间,因此进程之间的切换会有较大的开销。 但是线程在进程的地址空间内部运行,因此同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,因此线程之间的切换开销小。
- 包含关系:线程是进程的一部分,没有线程的进程叫做单线程进程,有多个线程的进程叫做多线程进程
- 多进程适合在CPU密集操作(CPU操作指令比较多,如位多的的浮点运算) 多线程适合在IO密性型操作(读写数据操作比多的的,比如爬虫)
协程(Coroutines) ,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
协程拥有自己的寄存器上下文和栈。 协程调度时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。协程的特点在于是一个线程执行。
协程 vs 多线程
- 极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;
- 不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。