上篇日志最后给出了一个最简单的人工调度系统。在实际应用中,人工的调度很常见,但更为普遍的是操作系统自动的任务调度。这篇日志介绍一种最常见的自动调度,即时间片轮转法,在上一节的程序的基础上,添加一些函数,用C语言实现。
1.时间片轮转调度
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。算法的模型如右图所示。
但是现在为了简单起见,我们可以把模型设置的尽量简单:没有任务优先级,不考虑任务的等待,阻塞等等形式。所有的任务一旦创建,就是就绪的,等待系统的调度。调度时,简单的按照任务号的顺序依次调度。
2.时钟粒度与定时器中断
我们在使用单片机时,一般是用单片机的时钟周期(或者是指令周期)作为程序中最小的时间单位。在使用操作系统后,这种方法无疑太细致了些。如果把这个最小的时间单位划分的更大一点的话,管理起来会更方便。我们可以用定时器T0来做这种划分:每10000个时钟周期,定时器T0溢出一次。如果用12M晶振的话,这个时间正好是10ms。操作系统就把这个时间作为它的最小时间单位。换句话说,操作系统