一直以来,我们学习线程切换与调度,都是通过阅读操作系统书籍或 Linux 源码甚至反汇编 Window 内核代码。无论怎样,这些东西都很抽象,学习起来十分困难。

另外,随着现代化编程语言逐渐流行,C++20 的正式发布,都离不开用户态线程这些基础知识。再比如 Golang 的 Goroutine,腾讯公司的开源的 libco,百度的 BRPC 中的 bhtread,如果想深刻理解它们,都需要扎实的基本功。

本次 Chat 会带你循序渐近的掌握下面的知识点:控制流切换原理上下文切换线程设计调度函数的封装与代码模块化线程的主动切换时间片轮转调度

本文实验环境:ubuntu 16.04 32 位操作系统(读者请务必提前安装好);挑选一个你自己觉得好用的虚拟机软件,比如 VMWare;请把你的虚拟机环境配置成单核 CPU。

学习时间:大于 5 小时

为什么使用 32 位系统?因为方便初学者学习,能更快速的掌握原理。

图1 用户态线程运行示例

需要注意的是,上面的代码,并没有使用操作系统为我们提供的pthread系列函数,thread_create和thread_join函数都是自己纯手工实现的。唯一使用操作系统的函数就是设置时钟,因此会有时钟信号产生,这一步是为了模拟时间片轮转算法而做的。

本场 Chat 作者——Allen()

百度高级研发工程师,CSDN 博客专家。目前从事智能交互式对话系统云端开发。负责过大流量、高并发等业务场景。

扫码查看完整 Chat 原文

进入读者圈与作者深度交流

本场 Chat 关键点总结:理解“栈切换”的本质掌握指令执行与栈的关系掌握上下文是如何切换的理解主动切换,知道主动切换可能会发生在哪些地方理解什么是时间片对于不主动让出 cpu 的线程,是如何切换到其它进程的

这一整篇文章里,我们完成了线程切换与线程调度的框架,在此基础上,我们还可以做更多有关线程的东西,比如线程的同步与互斥,还有更多的线程状态。理解了本文之后,更深入的学习对你来说已经不是难事了!

相关文章