11 | 多任务:进程、线程与协程
该思维导图由 AI 生成,仅供参考
多任务与执行体
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了多任务处理的概念及其在计算机系统中的实现方式。首先介绍了多核技术和分时系统,解释了多核处理器和时间片轮转如何实现多任务。随后讨论了进程、线程和协程的概念及其在操作系统中的作用和区别。文章指出了协程的重要性,特别是在高性能网络服务器中的应用。作者批判性地思考了多任务需求的复杂性,对操作系统内核中的设计思想进行了分析和反思。最后,文章提出了一些问题,鼓励读者进行深入思考和讨论。整体而言,本文对多任务处理进行了深入浅出的介绍,对于想要了解计算机系统中多任务处理的读者具有很高的参考价值。
《许式伟的架构课》,新⼈⾸单¥68
全部留言(96)
- 最新
- 精选
- 奕对于协程的概念没有理解,协程不也是走系统调用吗?走系统调用不就是走到了系统内核态呢?后面任务调度,cpu执行指令
作者回复: 协程不走系统调用。协程切换只是寄存器的保存和恢复,所以可以在用户态下自己来实现。
2019-05-21343 - Linuxer有一个疑问:协程属于用户态的线程,它跟线程之间怎么对应呢?协程之间也需要切换,那线程切换的那些成本它一样有啊,没想明白它的优势在哪
作者回复: 从单位时间成本来说,有一定优势但也不会特别大。主要少掉的代价是从用户态到内核态再回到用户态的成本。这种差异类似于系统调用和普通函数调用的差异。因为高性能服务器上io次数实在太多了,所以单位成本上能够少一点,积累起来也是很惊人的。
2019-05-21532 - Barry有一个小建议,能否再每篇文章的最后面预告一下,下一篇要讲的主题。这样我们跟着主题先思考,等看文章的时候就可以看到作者和自己的想法有什么出入和补充。更有利于吸收
作者回复: 挺好的建议,多谢。下一节我们讲 “进程内协同:同步、互斥与通讯”。
2019-05-2132 - 饭老师,可以这样理解吗?因为时代背景久远,当初操作系统设计的线程,不太适应现在巨流量的互联网时代,在网络IO请求过高的情况下,性能开销太大,所以才出现了协程的概念,还有一些线程池的手段来弥补这个问题
作者回复: 应对方式有两种:一种是经典的线程池+异步io,一种是基于协程的同步io。后者背后的原理也是线程池+异步io,只不过加上了协程的语法糖了。
2019-07-29322 - 孙梦华🙄🙄操作系统所有涉及系统调用的方法都在内核空间,包括磁盘读写,内存分配回收,网络接口读写数据,这些都是web应用巨频繁使用的。 如果是多线程,线程在进行io操作时需要从用户态切换到内核态,等待io的过程中要进行内核态线程的切换,然后再从内核态回到用户态,时间和空间的开销都很大。 go实现的协程里面,如老师讲的,是用户态执行体和独立的io子系统,相当于用户空间的线程和内核空间的线程分隔开,互不进出,用户态的线程执行到io操作时,通过epoll的形式登记一个io请求,内核线程执行完io请求以后其实逻辑上是调用用户态的回调方法,然后这里go把这种反人类的异步回调模式,给我们程序员封装起来了。 是不是可以这样理解啊
作者回复: 是这样,理解到位
2021-04-0220 - youyui想了解下协程如何操作寄存器切换CPU上下文的,有没有什么好的资料可以学习下
作者回复: https://github.com/Tencent/libco
2019-05-29320 - 王聪 Claire您好,问一下epoll的意义在于让线程数量变少,是指等待执行的线程变少了吗?是因为都登记然后才能执行的机制吗?还是其他原因呢?谢谢。
作者回复: 如果用同步 io,那么每个并行 io 必然需要需要一个线程。epoll 在于让 io 等待都发生在相同的地方,相当于线程做了多路 io 复用。
2019-05-24317 - 钱晟龙🐲龍🐉老师,我一直有个问题没理解到,计算机在做IO的时候会不会使用CPU,如果会怎样使用的? 阻塞IO阻塞的时候,也就是IO进行时,它对应的线程是否已经放弃了CPU的执行权? 或者老师建议我查阅什么书籍。。
作者回复: 1、https://m.baidu.com/sf_edu_wenku/view/3210fec818e8b8f67c1cfad6195f312b3169ebe8 2、是的,执行权会转移
2019-05-2911 - 王棕生我理解: 线程是CPU调度的基本单位,进程是资源(包括CPU计算资源)分配的基本单位;操作系统在决定谁来使用CPU的时候,操作系统不会去关注进程,而是关注线程,只有要切换到其它进程的线程时,才会关注进程。 比如:进程p1有三个线程t1 t2 t3,进程p2有三个线程t4 t5 t6, 操作系统关注的是这6个线程的调度,比如从t1切换到t2,从t2切换到t3,当从t3切换到t4的时候,发现t4是属于另一进程的,这个时候就会不知线程要调度,进程也要调度。 麻烦许老师点评一下,这样理解是否准确?
作者回复: 我们想一下进程的本质是什么。我们以内存资源为例,内存在不同进程中的逻辑地址与物理地址的映射表不同,更具体来看其实就只是几个寄存器的值的差异而已。所以实际上,并不存在线程调度和进程调度的区别,线程调度了,寄存器变了,进程也就切换了。
2020-05-06210 - 13601994625理论上协程可以做到的优化,线程都可以做到。为什么不在操作系统层去解决这个问题呢?
作者回复: 但是操作系统太多了,语言适配操作系统易,反过来难
2019-06-198