慕课18原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”
很多人对于写程序都不陌生,但是大部分都是写一个应用程序或是驱动程序,这些程序都有意个特点,那就是以为自己“独占“了整个计算机或是单片机,但是实际上一个处理器可能“同时“运行着多个程序,那么计算机是如何同时处理多个任务却能让每个任务都以为计算机是在单独为其服务的呢?这就要说到操作系统内核的任务调度功能了!
接下来我们就通过一些简单的代码来看看,内核是怎样实现这一功能的!
一、问题分析
1、首先我们从整体上来了解一下其工作的原理。
计算机之所以看上去能够同时处理多个任务,是因为计算机快速的在多个任务处理中切换,也就是说假如有3个任务,计算机先运行任务1,运行了时间安长度T后去运行任务2,运行了时间T后去运行任务3,接着T时间长度后又运行任务一(不考虑任务的优先级问题),这样在3T的时间长度内,每个任务都运行了一次,当时间长度T足够小,比如说几毫秒、几微秒,小到不能察觉,就像频率足够大是的脉冲图像一样。这就有了3个任务同时运行的错觉。
2、了解了工作原理后,我们就有了几个需要解决的问题:
(1)、设定一个固定的时间长度,经过这个固定的时间计算机转向下一个任务。
(2)、完成任务的交接,保存当前任务的状态,以备下一次接着运行,并将接下来要运行的任务状态恢复到计算机中继续运行。
下面就一一解决这些问题!
二、程序实现
1、PCB.h
在PCB.h 文件中之定义了两个结构体,Thread和PCB,在Thread中定义了两个变量,分别用于在任务切换时保存任务的堆栈指针寄存器的值和指令指针寄存器的值,在PCB结构体中则定义了其他一些任务运行状态的变量,如进程的ID号、进程的堆栈空间、指向下一个任务的进程控制块的指针等。
2、设置一个系统定时器
linux中定时器的方案很多种,可以参看