概述
最近接触一些进程、线程、协程、相关的东西,总是容易搞混淆,或者出错,专门想总结下这块的几个概念的问题!
进程
- 进程之间不共享任何状态
- 进程的调度由操作系统完成
- 每个进程都有自己独立的内存空间
- 进程间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量、管道、事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低
-
由于是独立的内存空间,上下文切换的时候需要保存先调用栈的信息、cpu各寄存器的信息、虚拟内存、以及打开的相关句柄等信息,所以导致上下文进程间切换开销很大,通讯麻烦。
线程
- 线程之间共享变量,解决了通讯麻烦的问题
- 对于变量的访问需要锁
- 线程的调度主要也是有操作系统完成
- 一个进程可以拥有多个线程,但是其中每个线程会共享父进程像操作系统申请资源,这个包括虚拟内存、文件等,由于是共享资源,所以创建线程所需要的系统资源占用比进程小很多,相应的可创建的线程数量也变得相对多很多。
- 线程时间的通讯除了可以使用进程之间通讯的方式以外还可以通过共享内存的方式进行通信,所以这个速度比通过内核要快很多。
-
另外在调度方面也是由于内存是共享的,所以上下文切换的时候需要保存的东西就像对少一些,这样一来上下文的切换也变得高效。
协程
- 协程的调度完全由用户控制
- 一个线程可以有多个协程,用户创建了几个线程,然后每个线程都是循环按照指定的任务清单顺序完成不同的任务,当任务被堵塞的时候执行下一个任务,当恢复的时候再回来执行这个任务,
- 任务之间的切换只需要保存每个任务的上下文内容,就像直接操作栈一样的,这样就完全没有内核切换的开销
- 可以不加锁的访问全局变量,所以上下文的切换非常快;
- 另外协程还需要保证是非堵塞的且没有相互依赖,协程基本上不能同步通讯,多采用一步的消息通讯,效率比较高。
--------------------------------------------------
注:
1、在阮一峰老师的博客中关于进程、线程的简单解释:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
来源:oschina
链接:https://my.oschina.net/u/560358/blog/664139