首页 > 代码库 > 实现多线程切换和调度实验介绍

实现多线程切换和调度实验介绍

本系列文章旨在记录完成一个小型用户级线程创建、切换与调度框架的过程,并不能代替操作系统为我们提供的线程框架。

为什么要写这样的东西呢?目的很简单,仅仅在于学习操作系统中的进程或线程切换与调度原理。所以,请不要把代码试图用到你的工程或者项目中,出了问题也不要来找我啊。

如果你发现该项目中存在的问题或 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 使用自己的编写的多线程框架创建线程

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    实现多线程切换和调度实验介绍