教程:纯手工实现多线程
本系列文章旨在记录完成一个小型用户级线程创建、切换与调度框架的过程,并不能代替操作系统为我们提供的线程框架。
为什么要写这样的东西呢?目的很简单,仅仅在于学习操作系统中的进程或线程切换与调度原理。所以,请不要把代码试图用到你的工程或者项目中,出了问题也不要来找我啊。
如果你发现该项目中存在的问题或 bugs,请不要吝啬,及时联系我,因为我也只是一个学习者,希望共同进步。
[注]
- 阅读本系列文章需要的基础:简单的汇编语言基础,知道 call、ret 的工作原理。
- 实验环境:32 位 linux 系统 + gcc 编译器。
- QQ讨论群:610441700
- 项目代码 gitos 托管地址(支持国产^_^):http://git.oschina.net/ivan_allen/Thread
重要提示: 请不要忘记给项目点 star 啊!!!还有一点,代码中可能存在 bug,请不要忘记在博客后面评论。
应该说一直以来,我们学习线程切换与调度,都是通过阅读操作系统书籍或 Linux 源码甚至反汇编 Window 内核代码。无论怎样,这些东西都很抽象,学习起来十分困难。
本系列文章,准确的说是实验指导书吧,会带你循序渐近的掌握下面的知识点:
- 控制流如何切换
- 完成一个简单的暴力跳转
- 封装 create_thread 函数
- 抽取调度函数
- 模块化项目
- 封装阻塞类函数,以 sleep 函数为代表
- 时钟与时间片概念
- 为线程添加时间片
- 时间片轮转+优先级调度
注意上面不是目录,只是我们将要遇到的一些关键节点。最后,我们实现的效果应该是下面这个样子:
图1 最终的效果
客户端完整代码见图 2.
需要注意的是,上面的代码,并没有使用操作系统为我们提供的 pthread 系列函数,thread_create 和 thread_join 函数都是自己纯手工实现的。唯一使用操作系统的函数就是设置时钟,因此会有时钟信号产生,这一步是为了模拟时间片轮转算法而做的。
接下来,废话不多说了,开启新篇章吧《控制流切换原理》;
图 2 使用自己的编写的多线程框架创建线程 #百度##C++工程师#