进程、线程、协程到底是个什么东西?

进程、线程、协程到底是个什么东西?

一、前言

​ 不管是上大学课程《操作系统》,还是找工作面试,还是日常工作大家交流中,都离不开进程和线程,有些同学可能还会听说过协程。那他们到底是什么呢?他们之间有什么关系呢?跟着我一起往下看吧!

二、计算机组成及操作系统

​ 在讲进程之前,我们先回顾一下计算机的组成。

  1. 中央处理器(CPU):是计算机的核心,负责一些运算和控制

    CPU有两大核心部件,ALU(算数逻辑单元)和CU(逻辑控制单元),其中ALU负责一些运算,包括算数运算(加减乘除)、逻辑运算(与或非)及关系运算(大小等于);CU负责各个逻辑部件的协调工作,充当一个指挥官的角色。CPU中也有寄存器,只不过容量极小,负责缓存一些计算的中间结果。

  2. 主存储器:存储数据

    分为RAM和ROM。RAM,随机存储器,掉电数据丢失,就是俗称的内存;ROM,只读存储器,掉电数据不丢失,就是俗称的磁盘。

  3. IO:各种输入输出设备(鼠标、键盘、显示器、网卡、声卡、显卡等)

有了这些计算机的硬件支持,我们就可以做各种各样的事情了。如果我们手动来控制CPU和内存,那我们可能要写各种底层指令,而且肯定会出现各种各样的bug。操作系统在计算机硬件的基础之上,封装了硬件的实现细节,对上层抽象了一层更方便的系统调用指令,这就是操作系统。

在多任务系统中,操作系统接管了所有硬件资源并持有对硬件控制的最高权限。在操作系统中执行的程序,都以进程的方式运行在更低的权限中。所有的硬件资源,由操作系统根据进程的优先级以及进程的运行状况进行统一的调配。

三、进程

​ 有了操作系统,我们就能够在上面实现程序了。比如通过一个QQ来实现聊天功能。那QQ程序怎么启动起来呢,操作系统把QQ程序丢在一个容器里并把它执行起来,而这个容器就是进程。那进程跟程序之间又是什么关系呢?

  • 程序是死的(只是在磁盘中的一堆指令代码),进程是活的(会占用CPU、内存、文件资源、IO等)
  • 进程是程序的运行实例

四、线程

维基百科:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

一个进程有多个线程,拿QQ为例子,需要有一个线程监听键盘的输入并转换为文字,需要有一个线程负责拉取对方发来的消息等。从操作系统的角度来看:

  • 进程是最小的资源管理分配单元
  • 线程是最小的执行单元

无论是进程还是线程都是需要操作系统来控制的。拿线程来举例,线程有多个执行状态:初始化、可运行、运行中、阻塞、销毁 五种状态。这五种状态的转化关系如下:

线程状态转化图.png

线程的状态转化是由操作系统内核中的TCB(thread control block)线程控制块来改变的,需要耗费一定的CPU资源。

总结一下,进程是一个程序的运行实例,它管理着各种资源;一个进程有多个线程,线程才是具体的执行单元,他们共享着进程中的部分资源,同样有着私有资源(PC程序计数器、执行栈等),线程间默认通过共享内存进行交互,线程间同步通过锁/信号量等进行互斥操作。由于线程切换需要在操作系统在内核/用户态间的切换才能改变状态,导致线程切换本身会非常耗费资源。

五、协程

​ 协程,又称微线程,纤程。英文名Coroutine。比线程更加轻量级,就像一个进程有多个线程一样,一个线程可以有多个协程。

举一个廖雪峰老师给的例子:

def a():
    print 1
    print 2
def b():
    print 'A'
    print 'B'

当我们调用a、b这两个函数时,肯定会先后打印1 2 A B,如果我想打印1 A B 2 或者 1 A 2 B呢? 显然通过多线程时不能控制的。这样我们就可以通过协程来处理。通过程序自身的逻辑来实现流程跳转,相比于线程中断,有点像CPU中断,不需要通过操作系统的介入,效率极高。

python语言本身支持协程,通过yield关键字来实现。

def a():
    print 1
    yield
    print 2
    yield
def b():
    print 'A'
    print 'B'
generator=a()
next(generator)
b()
generator.send('')

该语句就会打印:

1
A
B
2
  1. 通过调用a()生成一个执行器
  2. 通过next触发执行器执行a并打印1
  3. 调用b打印AB
  4. 通过send像执行器发送信号继续执行并打印2

整个流程是由一个线程执行,通过一些语法来控制执行流程,不涉及到锁,不涉及到线程切换,是通过关键字来辅助ab协作工作,所以叫做协程

ES6中引入了for..of..,它本身是一个语法糖,原理是通过引入迭代器(iterator)来实现,而迭代器就是通过协程来实现的。而在ES7中引入了更加直观的async/await`。

java本身不支持协程,但可以通过三方库来实现,例如QuasarAkka等。

下一篇我们通过jsjava不同的实现来进一步了解协程。

参考文献:

  1. wiki 进程
  2. 阮一峰 <<进程与线程的一个简单解释>>
  3. 漫画:什么是协程?
  4. 了解协程
  5. 廖雪峰 协程
  6. 协程与事件循环
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341