进程、线程与协程
- 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处理多进程就行是一个进程一个核心。
线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
协程
协程是属于线程的。协程的程序是在线程里面跑的。因此协程又称作微线程和纤程等。
协程没有线程的上下文切换消耗。协程的调度是用户手动切换的,因此更加灵活,不会出现执行一半的代码被强制中断,无需原子操作锁。
协程的特点在于是一个线程
执行,那和多线程比,协程有何优势?
极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;
不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。