操作系统原理:任务调度与状态机解析

需积分: 9 0 下载量 38 浏览量 更新于2024-08-20 收藏 346KB PPT 举报
"状态机示例-自己编写操作系统之任务调度器讲解" 在这个示例中,我们探讨了如何构建一个简单的任务调度器,这在操作系统的设计中至关重要。任务调度器是多任务并行执行的核心机制,它使得多个任务能够看似同时进行,实际上是在CPU的快速切换中交替执行。这里通过两个状态机的实例——键盘扫描和显示扫描来解释这一概念。 首先,状态机的运用是一种有效的编程技巧,用于跟踪和控制程序的不同阶段。在键盘扫描的状态机中,`ks_step`变量作为状态指示器,根据它的值,程序会执行相应的代码块。当`ks_step`依次变化,代表键盘扫描的不同步骤,如读取键盘的第一行、第二行和第三行,最后回到第一行,形成一个循环。 同样的,显示扫描的状态机用`disp_step`来管理数码管的显示,依次输出第1个、第2个和第3个数码管的数字,然后回到第1个,形成一个循环。这两个状态机在`main()`函数中的`while(1)`无限循环内被调用,每次只执行一个片段,然后返回,这样CPU就可以转而处理其他任务。 多任务并行的演变过程是从单任务顺序执行发展到多任务并行执行。最初的简单顺序执行方式是逐一完成任务,但如果一个任务耗时过长,会导致其他任务无法响应外部事件。为了提高效率,改进方法是利用任务之间空闲的延时期间,比如在延时处插入其他任务的片段。这样,键盘扫描和显示扫描的任务片段可以交替执行,避免了资源的浪费。 进一步的改进是引入任务调度器,将任务分解为更小的片段,由主程序统一调度。这样,任务不再是以完整函数的形式存在,而是变成了逻辑上的概念,由一系列的小片段组成。尽管这种方法提高了资源利用率,但仍然存在一定的局限性,比如任务片段的执行顺序通常是固定的。 在操作系统中,任务调度器的工作原理是保存每个任务的上下文(程序流折断点信息),在合适的时候恢复这些上下文,使任务能够从上次离开的地方继续执行。这涉及到对堆栈的修改,因为堆栈包含了函数调用时的局部变量和指令指针。任务调度器通过这种方式实现了子函数对父函数执行流程的控制,即由任务调度器决定何时执行哪个任务的哪个片段。 总结来说,这个示例通过状态机展示了简单的任务调度概念,以及如何通过状态指示器和上下文切换来实现多任务并行。这种机制在现代操作系统中广泛使用,使得计算机能够高效地处理多个并发任务。