7

我对操作系统的工作原理毫无疑问。

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

4

1 回答 1

9

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

以下是发生的步骤:

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

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

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

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

  5. 调度程序跳转到进程中没有执行的最后一条指令的地址。

  6. N 个时钟周期后,发生中断,操作系统将其识别为由 PIT 引起,并注册为由调度程序处理。

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

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

所以基本上你的问题:

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

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

于 2012-08-02T01:50:55.457 回答