Operating system 调度器是如何工作的?
我最近开始学习操作系统课程。据我所知,dispatcher的工作是保存当前进程的上下文,并加载下一个要运行的进程的上下文。但它是如何做到这一点的呢?当进程被抢占时,一旦调度器被加载并执行(因为它也是一个程序),寄存器、PSW等中先前进程的上下文就会丢失。它将如何在加载自身之前保存上下文 它通常不会以丢失当前进程信息的方式加载 通常,它是在当前进程的上下文中发生的中断 因此,调度器(或调度器)可以在为下一个进程加载信息之前,将所有相关信息保存在某种类型的任务控制块中 这包括寄存器内容、堆栈指针等Operating system 调度器是如何工作的?,operating-system,scheduling,Operating System,Scheduling,我最近开始学习操作系统课程。据我所知,dispatcher的工作是保存当前进程的上下文,并加载下一个要运行的进程的上下文。但它是如何做到这一点的呢?当进程被抢占时,一旦调度器被加载并执行(因为它也是一个程序),寄存器、PSW等中先前进程的上下文就会丢失。它将如何在加载自身之前保存上下文 它通常不会以丢失当前进程信息的方式加载 通常,它是在当前进程的上下文中发生的中断 因此,调度器(或调度器)可以在为下一个进程加载信息之前,将所有相关信息保存在某种类型的任务控制块中 这包括寄存器内容、堆栈指针等
值得注意的是,下一个进程的上下文包括其处于dispatcher中断本身的状态,因此,当它从中断返回时,这是一个完全不同的过程。简单的答案是,现代处理器提供了架构扩展,提供了可以在硬件中交换的多个寄存器组,因此多达X个任务可以保留其完整的寄存器集
更复杂的答案是,当被中断触发时,调度器接收到中断时运行的程序的完整寄存器集(程序计数器除外,该计数器可能通过双方商定的“易失性”寄存器或类似寄存器传播)。因此,必须仔细编写调度器,将寄存器组的当前状态存储为触发后的第一个操作。简言之,调度器本身没有直接上下文,因此不会遇到相同的问题 下面尝试对调度程序调用期间发生的情况进行简单描述:
这是否更清楚?调度程序模块将CPU控制权交给短期调度程序选择的进程;这包括: 切换上下文, 切换到用户模式,
跳转到用户程序中的正确位置以重新启动该程序操作系统的主要职责是控制进程的执行。这包括确定执行模式和为流程分配资源 过程可能处于以下两种状态之一:
在执行过程中,当进程缺少资源时,它会被阻塞。提供这些资源后,它将重新进入就绪状态,然后进入运行状态。从就绪状态到运行状态的转换由dispatcher完成。Dispatcher调度进程。是否应该将其移动到superuser.com?杰希伦:不,我不这么认为。这是关于操作系统调度器的内部工作,而不是关于操作系统的使用。“当被中断触发时,接收在中断时运行的程序的完整寄存器集”……你是说有某种硬件支持发送此信息,而调度器没有代码来传输寄存器值吗(如mov指令等)?不。让我编辑我的答案,以获得更多的细节和清晰性。是的,绝对!!!这是一个很好的解释。现在我也得到了paxdiablo想要传达的信息:)“简单的答案是,现代处理器提供了架构扩展,提供了几个可以在硬件中交换的寄存器库”:什么现代处理器提供这种功能,哪些操作系统使用这种功能?AFAIK通常在软件中通过简单地存储和重新加载内存中的寄存器来完成。x86-32具有硬件任务切换功能,可以自动完成此过程(尽管仍然没有任何独立的体系结构寄存器库),但我相信x86-64放弃了此功能,因为它不值得花费成本。嗯。我