调度员如何运作?

时间:2011-01-24 13:14:25

标签: operating-system scheduling

我最近开始了我的操作系统课程。据我所知,调度程序的工作是保存当前进程的上下文并加载下一个要运行的进程的上下文。但它是如何做到的呢?当进程被抢占时,一旦加载和执行调度程序(因为它也是程序),寄存器中的先前进程的上下文,PSW等将丢失。在加载自身之前如何保存上下文?

4 个答案:

答案 0 :(得分:19)

简单的答案是现代处理器提供架构扩展,提供可以在硬件中交换的几组寄存器,因此X任务可以保留其全套寄存器。

更复杂的答案是调度程序在被中断触发时接收中断时运行的程序的完整寄存器集(程序计数器除外,它可能是通过相互传播的) -agreed-upon'volatile'寄存器或某些此类)。因此,必须仔细编写调度程序以将寄存器库的当前状态存储为触发时的第一操作。简而言之,调度员本身没有直接的背景,因此不会遇到同样的问题。

这是尝试简单描述调度员调用期间发生的事情:

  1. 当前具有上下文的程序正在处理器上运行。寄存器,程序计数器,标志,堆栈基础等都适用于该程序;除了操作系统原生的“保留寄存器”或其他类似情况外,程序中没有任何关于调度程序的信息。
  2. 触发调度程序功能的定时中断。此时发生的唯一事情(在vanilla架构案例中)是程序计数器立即跳转到BIOS中断中列出的任何PC地址。这开始执行调度程序的“dispatch”子程序;其他所有内容都保持不变,因此调度程序会查看以前执行的程序的寄存器,堆栈等。
  3. 调度程序(与所有程序一样)具有一组在当前寄存器集上运行的指令。这些指令的编写方式使得它们知道先前正在执行的应用程序已经将其所有状态都置于其后。调度程序中的前几条指令会将此状态存储在内存中。
  4. 调度程序确定下一个拥有cpu的程序应该是什么,获取所有先前存储的状态并用它填充寄存器。
  5. 调度程序跳转到现在在cpu上建立完整上下文的任务中列出的相应PC计数器。
  6. To(over)简化总结;调度程序不需要寄存器,只需将当前的cpu状态写入预定的内存位置,从预定的内存位置加载另一个进程的cpu状态,然后跳转到该进程停止的位置。

    这会让它更清楚吗?

答案 1 :(得分:1)

它通常不会以丢失当前进程信息的方式加载。

通常,这是在当前进程的上下文中发生的中断。

因此,在为下一个进程加载该信息之前,调度程序(或调度程序)可以将所有相关信息保存在某种任务控制块中。

这包括寄存器内容,堆栈指针等。

值得注意的是,下一个进程的上下文包括它在调度程序中断本身的状态,以便当它从中断返回时,它将进入一个完全不同的进程。

答案 2 :(得分:0)

Dispatcher模块将CPU控制权交给短期调度程序选择的进程;这包括: 切换环境, 切换到用户模式, 跳转到用户程序中的适当位置以重新启动该程序

答案 3 :(得分:0)

操作系统的主要职责是控制进程的执行。这包括确定执行模式和为进程分配资源。

进程可能处于以下两种状态之一:

  1. 正在运行或
  2. 未运行
  3. 当操作系统创建新进程时,它会为进程创建进程控制块,并将该进程进入系统进入“未运行”状态。存在的进程是OS已知的并且正在等待执行的机会。

    有时,当前正在运行的进程将被中断,操作系统的调度程序部分将选择其他一些进程来运行。

    在执行过程中缺少资源时,它会被阻止。提供这些资源后,它重新进入就绪状态,然后进入运行状态。从准备状态到运行状态的转换由调度员完成。 Dispatcher调度该过程。