首页 > 运维 > 进程、线程和协程三者之间的区别和联系
2013
04-16

进程、线程和协程三者之间的区别和联系

一、进程、线程、协程

1,进程

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

2,线程(thread)(内核级线程

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

3,协程(用户级线程)

    协程是一种用户态的轻量级线程,又称微线程。协程调度完全由用户控制,相当于子程序。


4,区别

  1、资源方面:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其他进程不可见

  2、通信:进程间通信IPC,进程间可以直接读写进程数据段进行通信——需要进程同步和互斥手段辅助,以保证数据的一致性,线程通信主要通过共享内存

  3、调度和切换:线程上下文切换比进程上下文切换要快的多

  4、对于 进程线程,都是有内核进行调度,有 CPU 时间片的概念,进行 抢占式调度(有多种调度算法),对于 协程(用户级线程),这是对内核透明的,是由用户程序自己控制,通常只能进行 协作式调度,需要协程自己主动把控制权转让出去之后,其他协程才能被执行到。


进程优点:

    1. 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响

进程缺点:

  1. 在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。多进程的程序要比多线程的程序健壮,但在进程创建、切换、撤销时,耗费资源较大,效率要差一些。

  2. 进程间通信(IPC)较为复杂和耗时


线程优点:

1.线程的出现是为了减少任务切换的消耗,提高系统的并发性,实现让一个进程也能执行多个任务

线程缺点:

1.线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉

2.线程没有自己的系统资源,只有运行时不可缺少的资源,但是同一进程的各线程可以共享进程所拥有的系统资源。对于某些独占资源存在锁机制,处理不当会出现死锁。


协程优点:

1.协程执行效率高。因为子程序切换不是线程切换,由程序自身控制,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。

2.协程不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好,所以执行效率比多线程高很多。


5.场景

多进程:

密集CPU任务,需要重复利用CPU多核资源(大量的并行计算)


多线程:

密集IO任务(网络IO,磁盘IO,数据库IO)


协程:

当程序中存在大量不需要CPU的操作时


最高效的组合:利用多核CPU最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能


6.进程/线程之间的亲缘性
  

亲缘性的意思是进程/线程只在某个cpu上运行(多核系统),比如:

使用CPU亲缘性的好处:设置CPU亲缘性是为了防止进程/线程在CPU的核上频繁切换,从而避免因切换带来的CPU的L1/L2 cache失效,cache失效会降低程序的性能。


二、小结


核心只有一个,线程是操作系统调度,协程是用户态调度。协程不必须是语言集成,例如C语言可以用setjmp/longjmp实现,也可以自己通过改变esp指针换栈实现协程。 协程本身跟高吞吐没任何关系,基于io多路复用+回调就可以实现高并发和高吞吐。引入协程是为了将回调逻辑变成线性同步逻辑。


本文》有 0 条评论

留下一个回复