进程、线程与协程
- 2020.06.16
进程
直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,既不共享堆,也不共享栈,上级挂靠单位是
操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。

因此进程的创建和销毁都是相对于操作系统的资源,所以是一种比较昂贵的操作。
进程主要有三种状态:
等待态: 等待某个事件的完成。就绪态: 等待系统分配处理器以便运行。运行态: 占有处理器正在运行。
进程是抢占式的争夺CPU运行自身,而CPU单核的情况下同一时间只能执行一个进程的代码,但是多进程的实现则是通过CPU飞快的切换不同进程,因此看起来就像是多个进程在同时进行。
TIP
由于进程间是隔离的,各自拥有自己的内存和资源,因此相对于线程比较安全,所以不同进程之间的通信只能通过IPC(Inter-Process Communication)进行通信共享。
IPC的通信主要涉及到如下,这里不进行详细的解释:
管道(Pipe)命名管道(FIFO)消息队列(Message Queue)信号量(Semaphore)共享内存(Shared Memory)套接字(Socket)。
线程
线程从属于进程,共享进程的内存地址空间,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位

进程和线程的区别与联系
区别
进程是系统分配资源的最小单位, 线程是CPU调度的最小单位。
不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等;线程所维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等;在创建或撤消
进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
联系
线程是进程内部的资源,共享进程的内存地址空间,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
由于默认进程内只有一个线程,所以多核CPU处理多进程就行是一个进程一个核心。
线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
协程
协程是属于线程的。协程的程序是在线程里面跑的。因此协程又称作微线程和纤程等。
协程没有线程的上下文切换消耗。协程的调度是用户手动切换的,因此更加灵活,不会出现执行一半的代码被强制中断,无需原子操作锁。

协程的特点在于是一个线程执行,那和多线程比,协程有何优势?
极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;
不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。