Operating system 调度器是如何工作的?

Operating system 调度器是如何工作的?,operating-system,scheduling,Operating System,Scheduling,我最近开始学习操作系统课程。据我所知,dispatcher的工作是保存当前进程的上下文,并加载下一个要运行的进程的上下文。但它是如何做到这一点的呢?当进程被抢占时,一旦调度器被加载并执行(因为它也是一个程序),寄存器、PSW等中先前进程的上下文就会丢失。它将如何在加载自身之前保存上下文 它通常不会以丢失当前进程信息的方式加载 通常,它是在当前进程的上下文中发生的中断 因此,调度器(或调度器)可以在为下一个进程加载信息之前,将所有相关信息保存在某种类型的任务控制块中 这包括寄存器内容、堆栈指针等

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

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

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

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

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


值得注意的是,下一个进程的上下文包括其处于dispatcher中断本身的状态,因此,当它从中断返回时,这是一个完全不同的过程。

简单的答案是,现代处理器提供了架构扩展,提供了可以在硬件中交换的多个寄存器组,因此多达X个任务可以保留其完整的寄存器集


更复杂的答案是,当被中断触发时,调度器接收到中断时运行的程序的完整寄存器集(程序计数器除外,该计数器可能通过双方商定的“易失性”寄存器或类似寄存器传播)。因此,必须仔细编写调度器,将寄存器组的当前状态存储为触发后的第一个操作。简言之,调度器本身没有直接上下文,因此不会遇到相同的问题

下面尝试对调度程序调用期间发生的情况进行简单描述:

  • 当前具有上下文的程序正在处理器上运行。寄存器、程序计数器、标志、堆栈基等均适用于该程序;除了操作系统本机的“保留寄存器”或类似的东西之外,程序对调度器一无所知
  • 调度程序功能的定时中断被触发。此时发生的唯一一件事(在普通架构的情况下)是程序计数器立即跳到BIOS中断中列出的任何PC地址。这将开始执行调度程序的“调度”子例程;其他所有内容都保持不变,因此调度器可以看到先前执行的程序的寄存器、堆栈等
  • dispatcher(与所有程序一样)有一组对当前寄存器集进行操作的指令。这些指令的编写方式使它们知道先前执行的应用程序已将其所有状态抛在后面。dispatcher中的前几个指令将把该状态存储在内存中的某个位置
  • 调度器确定下一个拥有cpu的程序应该是什么,获取它以前存储的所有状态,并用它填充寄存器
  • 调度器跳转到任务中列出的相应PC计数器,该任务现在已在cpu上建立其完整上下文
  • 概括地(过度)简化;调度器不需要寄存器,它所做的只是将当前cpu状态写入预定内存位置,从预定内存位置加载另一个进程的cpu状态,然后跳到该进程停止的位置


    这是否更清楚?

    调度程序模块将CPU控制权交给短期调度程序选择的进程;这包括: 切换上下文, 切换到用户模式,
    跳转到用户程序中的正确位置以重新启动该程序操作系统的主要职责是控制进程的执行。这包括确定执行模式和为流程分配资源

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

  • 运行或
  • 不跑
  • 当操作系统创建一个新进程时,它会为该进程创建一个进程控制块,并将该进程输入系统,使其处于非运行状态。操作系统已知该进程存在,正在等待执行的机会

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


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

    是否应该将其移动到superuser.com?杰希伦:不,我不这么认为。这是关于操作系统调度器的内部工作,而不是关于操作系统的使用。“当被中断触发时,接收在中断时运行的程序的完整寄存器集”……你是说有某种硬件支持发送此信息,而调度器没有代码来传输寄存器值吗(如mov指令等)?不。让我编辑我的答案,以获得更多的细节和清晰性。是的,绝对!!!这是一个很好的解释。现在我也得到了paxdiablo想要传达的信息:)“简单的答案是,现代处理器提供了架构扩展,提供了几个可以在硬件中交换的寄存器库”:什么现代处理器提供这种功能,哪些操作系统使用这种功能?AFAIK通常在软件中通过简单地存储和重新加载内存中的寄存器来完成。x86-32具有硬件任务切换功能,可以自动完成此过程(尽管仍然没有任何独立的体系结构寄存器库),但我相信x86-64放弃了此功能,因为它不值得花费成本。嗯。我