进程线程和协程

从前有个座山,山上有座庙,庙里有个老和尚,一天,老和尚对小和尚说,从前有个座山,山上有个厂....

嗯,是的没错,我们的故事就从这里开始,这个工厂大家都叫它中央处理器(CPU),只要按下开机键,这个工厂就开始干活了,工厂的老板叫大雄,我们都管它叫操作系统。

工作模式

大雄负责整个工厂的指挥和工作安排,工厂各种资源,都是由操作系统(OS)去调度的,毕竟老板最大嘛,要听老板的指挥才行。

单进程单线程

那么光有工厂是不能干活的,我们还需要一个生产车间,这个生产车间我们称之为进程(Process),进程拥有一系列生产所需要的资源,光有资源不行,还得有人来干活呀!于是大雄聘请了爱搞事的胖虎(主线程 - Main thread)来干活,这就是最基础的单进程,单线程模型。

单进程多线程

为了提高生产效率,只有胖虎一个人干活,是不行滴,于是大雄任命胖虎为工头,并招聘了几个新的员工来干活(子线程),大雄只需要安排这几个人干活就行了,这就是单进程多线程模型,于是就有了下面的场景:

生产车间一号
    ├─ 管理员胖虎 (主线程)
        ├─ 召唤员工001 ... > 开始干活 
        ├─ 召唤员工002 ... > 开始干活

多进程多线程

因为生产工具是有限的,房间也不够大,于是大雄又搞出来一个新的生产车间来提高生产效率,这就叫做多进程,多线程模型:

生产车间一号
    ├─ 管理员胖虎 (主线程)
        ├─ 召唤员工001 ... > 开始干活 
        ├─ 召唤员工002 ... > 开始干活 
生产车间二号
    ├─ 管理员小夫 (主线程)
        ├─ 召唤员工001 ... > 开始干活 
        ├─ 召唤员工002 ... > 开始干活

工作逻辑

现在我们已经有了两个进程(车间),但是大雄还是觉得不够快,继续再搞新的生产车间是非常不划算的(即新建进程的成本是非常高的),作为一个老板,剥削员工是基本技能,经过观察,大雄发现,这都是因为爱搞事的胖虎瞎几把安排导致的

同步逻辑

每个车间只有一个工作台,同时只能一个人在上面干活,胖虎是这么安排的:每个人可以使用工作台30分钟,时间到了就要换下一个人上去干活,以此类推,现在是员工001号的干活时间,他需要去仓库拿一些原料,需要10分钟左右,在这期间工作台是空着的,但是也没人上去干活(发生了同步阻塞,正在等待001进行I/O操作),因为生产这个东东,步骤都是一样的,那么事情就会变成下面这样子:

> 第一个30分钟(请求001) 员工001 占用了10分钟工作台 去仓库拿东西用掉了10分钟,回来继续干活10分钟
> 第二个30分钟(请求002) 员工002 占用了10分钟工作台 去仓库拿东西用掉了10分钟,回来继续干活10分钟

异步逻辑

我们可以发现,每一个周期(即30分钟),都有10分钟被浪费掉了(离开工作台的时间),胖虎就想了个办法,喊别人(异步进程TaskWorker)去拿东西啊,不要浪费时间,先干别的事情:

第一个30分钟(请求001) 员工001 占用了10分钟工作台 ↓ 你拿任你拿,我干我的活,继续干活10分钟 -> 任务搞定
                                     ↓ 投递异步任务 ↓                   ↑  ↑
                            马仔001 :   去仓库拿东西,好了叫我 (异步回调)    ↑

这样去拿东西这个时间,就省下来了,胖虎非常开心,虽然多请了几个马仔(异步进程TaskWorker),马仔可以大家一起用的嘛,这波不亏!

协程逻辑

经过大家的协商,在等待的时候工作台是可以被其他人使用的,生产流程就变成了这样子:

> 员工001 占用了10分钟工作台 开始去仓库拿东西 并说: 现在我要出去了(协程挂起) 工作台给你们先干活
> 员工002 因为001挂起 所以可以去工作台上干活了 占用了10分钟工作台 然后开始去仓库拿东西 (协程挂起)
> 员工001 此时001已经拿到东西回来了(协程唤醒) 工作台又空出来了 又可以接着把剩下10分钟干完了

因为这个流程,不需要任何人去安排,谁需要出去的时候,就可以主动告诉大家,我要出去一下(挂起),现在我不用工作台了,你们可以先干活,所以协程相当于是用户态可以自行调度的线程

results matching ""

    No results matching ""