操作系统:进程调度程序是否在单独的进程中运行

suj*_*ith 7 operating-system scheduler

我对操作系统的工作方式几乎没有疑问.

调度程序:调度程序是否在单独的进程中运行(与任何其他进程一样).在交换新进程时究竟发生了什么(我知道处理器寄存器和内存表已更新,我的问题是它们是如何更新的.我们可以编写一个程序来更新寄存器(sc,pc)以指向不同的处理).

Dou*_*gvj 8

进程计划可以在一个单独的进程中运行,但是这样的设计效率非常低,因为你必须从一个进程交换到调度进程(然后必须对内核进行多次系统调用)然后返回到新进程,而不是将调度程序放在内核中,您不需要系统调用,也不需要多次交换上下文.因此,调度程序通常位于内核的专有领域.

以下是发生的步骤:

  1. 调度程序确定哪个进程将在下一个时隙中运行(通过各种不同的算法).

  2. 调度程序告诉内存管理单元(MMU)使用页表来运行下一个进程(这通过将寄存器设置为指向表来完成).

  3. 调度程序对可编程中断定时器(PIT)进行编程,以在N个时钟周期后产生中断.

  4. 调度程序从进程上次运行时恢复寄存器的状态(或将它们设置为新进程的默认值)

  5. 调度程序跳转到过程中未执行的最后一条指令的地址.

  6. 在N个时钟周期之后,发生中断并且操作系统将其识别为由PIT引起的,PIT被注册为由调度器处理.

  7. 调度程序保存寄存器的状态(包括堆栈指针等)并抓取中断发生位置的程序计数器(并将其保存为下次跳转到的地址),然后返回步骤1.

这只是它如何完成的一个例子,许多低级细节都是特定于体系结构的.基本上所有寄存器(程序状态)都可以保存到RAM中的任何位置(比如表示每个都有寄存器空间的进程的结构链表等),虚拟地址空间(由页表定义)可以任意换掉了.

基本上你的问题是:

"我们可以编写一个程序来更新寄存器以指向不同的进程吗?"

简单地说,但答案是正确的.我们当然可以.