我有一个关于 linux 调度程序和其他一些类似的内核系统调用的一般问题。
Linux调度程序是否被视为一个“进程”,并且对调度程序的每次调用都需要像另一个进程一样进行上下文切换?
假设我们有一个时钟滴答声,它会中断当前正在运行的用户模式进程,现在我们必须调用调度程序。对调度程序本身的调用是否会引发上下文切换?调度程序是否有自己的一组寄存器和 U 区以及每次调用时都必须恢复的内容?
上述问题也适用于许多其他系统调用。在上下文切换方面,内核进程的行为是否与常规进程类似,唯一的区别是它们拥有更多的权限和对 CPU 的访问权限?
我问这个是因为上下文切换开销非常昂贵。调用调度程序本身会引发上下文切换以恢复调度程序状态,然后调度程序调用另一个进程来运行,然后再次调用另一个上下文切换,这听起来很奇怪。
这是一个非常好的问题,除了硬件了解操作系统和任务调度程序的概念这一事实之外,答案是“是”。
在硬件中,您会发现仅限于“管理程序”模式的寄存器。无需过多介绍内部 CPU 架构的细节,就有“用户模式”和“管理程序模式”的基本程序执行寄存器的副本,后者只能由操作系统本身访问(通过内核设置的控制寄存器,表示当前是否正在运行内核或用户模式应用程序)。
所以你所说的“上下文切换”是交换/重置的过程用户模式寄存器(指令寄存器、堆栈指针寄存器等)等,但系统寄存器不需要被换出,因为它们与用户寄存器分开存储。
例如,x86 中的用户模式堆栈是 USP - A7,而管理程序模式堆栈是 SSP - A7。因此内核本身(包含任务调度程序)将使用主管模式堆栈和其他主管模式寄存器来运行自己,在运行时将主管模式标志设置为1,然后执行上下文切换在用户模式硬件上在应用程序之间交换并将超级用户模式标志设置为 0。
但在操作系统和任务调度的想法之前,如果您想做一个多任务系统,那么您必须使用您在问题中概述的基本概念:每 x 个周期使用硬件中断调用任务调度程序,然后将应用程序换成任务计划程序,然后换入新应用程序。但在大多数情况下,计时器中断将是您实际的任务调度程序本身,并且它会经过大量优化,以使其不再是上下文切换,而更像是一个简单的中断处理程序例程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)