许式伟的架构课
许式伟
七牛云 CEO
84945 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 89 讲
许式伟的架构课
15
15
1.0x
00:00/00:00
登录|注册

11 | 多任务:进程、线程与协程

高性能网络服务器的需求
用途
用户态线程
同一软件内的多任务需求
UNIX 的 fork API
隔离单位
协程
线程
进程
分时系统
多核技术
进程的通讯机制
执行体的设计
操作系统内核的设计思想
多任务需求的复杂性
完备的协程库
协程库的不足
协程
线程
进程
任务的抽象
物理层面的多任务
结语
架构师的批判性思维
协程与 goroutine
进程与线程
多任务与执行体
多任务:进程、线程与协程

该思维导图由 AI 生成,仅供参考

你好,我是七牛云许式伟。
到现在为止,我们已经介绍了操作系统的存储管理:内存与外存;也已经介绍了输入与输出设备的管理。
当然,考虑到输入与输出设备属于人机交互范畴,我们主要会留到下一章 “桌面软件开发” 去详细介绍,这一章,我们仅概要地回顾输入与输出设备的需求演进过程。
CPU + 存储 + 输入与输出,软件开发最基础的内容基本上就都覆盖到了。 今天开始,我们就来聊一聊多任务。

多任务与执行体

多任务的需求是随处可见的。常见的场景,比如我们想边工作边听音乐;又或者我们需要跑一个后台监控程序,以报告随时可能发生的异常。
那么,怎么才能做到多任务?
我们先从物理层面看。最早期的 CPU 基本上都是单核的,也就是同一时间只能执行一条指令。尽管如此,大家可能都听过 “摩尔定律”,简单地说就是,每隔一年半到两年,同样的钱能买到的计算力能够翻一倍。
这当然不是什么严谨的物理学定律,更多的是一定历史时期下的经验之谈。早期 CPU 工艺的发展,基本上是通过提高电子元器件的密集程度实现的;但是电子元器件大小总归有个极限,不可能无限小下去。
那么怎么办?不能更小的话,那就横向多铺几个,一颗 CPU 多加几颗核心。这样多核技术就出现了。多核的意思是说,单核速度我提不上去了,多给你几个,价格一样。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了多任务处理的概念及其在计算机系统中的实现方式。首先介绍了多核技术和分时系统,解释了多核处理器和时间片轮转如何实现多任务。随后讨论了进程、线程和协程的概念及其在操作系统中的作用和区别。文章指出了协程的重要性,特别是在高性能网络服务器中的应用。作者批判性地思考了多任务需求的复杂性,对操作系统内核中的设计思想进行了分析和反思。最后,文章提出了一些问题,鼓励读者进行深入思考和讨论。整体而言,本文对多任务处理进行了深入浅出的介绍,对于想要了解计算机系统中多任务处理的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《许式伟的架构课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(96)

  • 最新
  • 精选
  • 对于协程的概念没有理解,协程不也是走系统调用吗?走系统调用不就是走到了系统内核态呢?后面任务调度,cpu执行指令

    作者回复: 协程不走系统调用。协程切换只是寄存器的保存和恢复,所以可以在用户态下自己来实现。

    2019-05-21
    3
    43
  • Linuxer
    有一个疑问:协程属于用户态的线程,它跟线程之间怎么对应呢?协程之间也需要切换,那线程切换的那些成本它一样有啊,没想明白它的优势在哪

    作者回复: 从单位时间成本来说,有一定优势但也不会特别大。主要少掉的代价是从用户态到内核态再回到用户态的成本。这种差异类似于系统调用和普通函数调用的差异。因为高性能服务器上io次数实在太多了,所以单位成本上能够少一点,积累起来也是很惊人的。

    2019-05-21
    5
    32
  • Barry
    有一个小建议,能否再每篇文章的最后面预告一下,下一篇要讲的主题。这样我们跟着主题先思考,等看文章的时候就可以看到作者和自己的想法有什么出入和补充。更有利于吸收

    作者回复: 挺好的建议,多谢。下一节我们讲 “进程内协同:同步、互斥与通讯”。

    2019-05-21
    32
  • 老师,可以这样理解吗?因为时代背景久远,当初操作系统设计的线程,不太适应现在巨流量的互联网时代,在网络IO请求过高的情况下,性能开销太大,所以才出现了协程的概念,还有一些线程池的手段来弥补这个问题

    作者回复: 应对方式有两种:一种是经典的线程池+异步io,一种是基于协程的同步io。后者背后的原理也是线程池+异步io,只不过加上了协程的语法糖了。

    2019-07-29
    3
    22
  • 孙梦华🙄🙄
    操作系统所有涉及系统调用的方法都在内核空间,包括磁盘读写,内存分配回收,网络接口读写数据,这些都是web应用巨频繁使用的。 如果是多线程,线程在进行io操作时需要从用户态切换到内核态,等待io的过程中要进行内核态线程的切换,然后再从内核态回到用户态,时间和空间的开销都很大。 go实现的协程里面,如老师讲的,是用户态执行体和独立的io子系统,相当于用户空间的线程和内核空间的线程分隔开,互不进出,用户态的线程执行到io操作时,通过epoll的形式登记一个io请求,内核线程执行完io请求以后其实逻辑上是调用用户态的回调方法,然后这里go把这种反人类的异步回调模式,给我们程序员封装起来了。 是不是可以这样理解啊

    作者回复: 是这样,理解到位

    2021-04-02
    20
  • youyui
    想了解下协程如何操作寄存器切换CPU上下文的,有没有什么好的资料可以学习下

    作者回复: https://github.com/Tencent/libco

    2019-05-29
    3
    20
  • 王聪 Claire
    您好,问一下epoll的意义在于让线程数量变少,是指等待执行的线程变少了吗?是因为都登记然后才能执行的机制吗?还是其他原因呢?谢谢。

    作者回复: 如果用同步 io,那么每个并行 io 必然需要需要一个线程。epoll 在于让 io 等待都发生在相同的地方,相当于线程做了多路 io 复用。

    2019-05-24
    3
    17
  • 钱晟龙🐲龍🐉
    老师,我一直有个问题没理解到,计算机在做IO的时候会不会使用CPU,如果会怎样使用的? 阻塞IO阻塞的时候,也就是IO进行时,它对应的线程是否已经放弃了CPU的执行权? 或者老师建议我查阅什么书籍。。

    作者回复: 1、https://m.baidu.com/sf_edu_wenku/view/3210fec818e8b8f67c1cfad6195f312b3169ebe8 2、是的,执行权会转移

    2019-05-29
    11
  • 王棕生
    我理解: 线程是CPU调度的基本单位,进程是资源(包括CPU计算资源)分配的基本单位;操作系统在决定谁来使用CPU的时候,操作系统不会去关注进程,而是关注线程,只有要切换到其它进程的线程时,才会关注进程。 比如:进程p1有三个线程t1 t2 t3,进程p2有三个线程t4 t5 t6, 操作系统关注的是这6个线程的调度,比如从t1切换到t2,从t2切换到t3,当从t3切换到t4的时候,发现t4是属于另一进程的,这个时候就会不知线程要调度,进程也要调度。 麻烦许老师点评一下,这样理解是否准确?

    作者回复: 我们想一下进程的本质是什么。我们以内存资源为例,内存在不同进程中的逻辑地址与物理地址的映射表不同,更具体来看其实就只是几个寄存器的值的差异而已。所以实际上,并不存在线程调度和进程调度的区别,线程调度了,寄存器变了,进程也就切换了。

    2020-05-06
    2
    10
  • 13601994625
    理论上协程可以做到的优化,线程都可以做到。为什么不在操作系统层去解决这个问题呢?

    作者回复: 但是操作系统太多了,语言适配操作系统易,反过来难

    2019-06-19
    8
收起评论
显示
设置
留言
96
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部