协程和线程以及进程之间的关系(2020届HR面经)

一、进程

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

[2]进程间通信(IPC):管道(Pipe)、命名管道(FIFO)、消息队列(Message Queue) 、信号量(Semaphore) 、共享内存(Shared Memory);套接字(Socket)。

二、线程
[1]线程:有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。

三、进程/线程之间的亲缘性
[1]亲缘性:是进程/线程只在某个cpu上运行(多核系统)。
[2]使用CPU亲缘性的好处:设置CPU亲缘性是为了防止进程/线程在CPU的核上频繁切换,从而避免因切换带来的CPU的L1/L2 cache失效,cache失效会降低程序的性能。

四、协程
[1]协程:是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
[2]子程序:或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。
[3]协程在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。

def A():
print '1'
print '2'
print '3'
断开的
def B():
print 'x'
print 'y'
print 'z'

[4]假设由协程执行:在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A,结果可能是:1 2 x y 3 z。
[5]协程的特点:在于是一个线程执行,那和多线程比,协程有何优势?
(1)极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;
(2)不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

五、进程与线程以及协程的理解
[1]:进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
[2]:线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
[3]:协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
[4]:进程和其他两个的区别还是很明显的。
[5]:协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。

猜你喜欢

转载自blog.csdn.net/N1314N/article/details/91868984