调度员如何运作?

Ter*_*nal 16 operating-system scheduling

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

Mar*_*nna 19

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

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

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

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

总结到(过)简化; 调度程序不需要寄存器,它所做的就是将当前的cpu状态写入预定的内存位置,从预定的内存位置加载另一个进程的cpu状态,然后跳转到该进程停止的位置.

这会让它更清楚吗?