线程、进程和协程区别联系

进程

每个进程都有自己独立的地址空间,有自己的堆;还有进程状态的转换(就绪状态、运行状态、等待状态)。
操作系统是以进程为单位分配系统资源的,如cpu、内存啊,进程是资源分配的最小单位。

线程

线程是轻量级进程,是操作系统调度(CPU调度)的最小单位。
线程的状态:
新建---->就绪<----->运行<----->死亡
在运行状态中又细分为,等待阻塞、同步阻塞、其他阻塞。
等待阻塞:线程等待系统通知才能继续运行
同步阻塞:线程被同步锁锁上
其他阻塞:睡眠等待系统IO完成

线程和进程区别和联系

  1. 调度上,线程是调度和执行的基本单位,进程是资源分配的基本单位
  2. 并发性上,进程可并发执行,一个进程内的多次线程也可以并发执行
  3. 拥有资源,线程共享进程的资源空间,进程是拥有资源的基本单位,线程可以访问隶属于进程的资源。线程其实也有自己的资源就不是系统资源,是一些如运行栈,同步调度信息,待处理信号集等。
  4. 系统开销,在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
  5. 处理机分配给线程,真正运行在cpu上的是线程

协程

线程、进程和协程区别联系_第1张图片
协程是比线程更轻量的存在,协程不是被操作系统内核所管理的,而是由程序来控制的,即在用户态执行,这样的好处是不会像线程那样消耗资源。
协程在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。

def A():
    print '1'
    print '2'
    print '3'

def B():
    print 'x'
    print 'y'
    print 'z'

假设由协程执行,在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A,结果可能是:1 2 x y 3 z。

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

协程的特点在于是一个线程执行,那和多线程比,协程有何优势?

极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;

不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

引入协程是为了将回调逻辑变成线性同步逻辑。

你可能感兴趣的:(面经)