我对linux调度程序和其他一些类似的内核系统调用有一个一般性的问题。
linux调度程序是否被视为“进程”,并且每次对调度程序的调用都需要上下文切换,就像它只是另一个进程一样?
假设我们有一个时钟滴答声,它打断了当前正在运行的用户模式进程,现在我们必须调用调度程序。对调度程序的调用本身会引起上下文切换吗?调度程序是否具有自己的寄存器和U区域集,并且每次调用时都必须还原?
所述问题适用于许多其他系统调用。在上下文切换方面,内核进程的行为是否像常规进程一样,唯一的区别是它们具有更多的权限和对cpu的访问权?
我问这个是因为上下文切换的开销很昂贵。听起来很奇怪,调用调度程序本身会引起上下文切换以恢复调度程序状态,然后调度程序调用另一个进程来运行,并再次调用另一个上下文切换。
最佳答案
这是一个很好的问题,答案是肯定的,除了硬件知道操作系统和任务计划程序的概念。
在硬件中,您会发现限于“管理程序”模式的寄存器。在不过多介绍内部CPU架构的情况下,有一个用于“用户模式”和“管理员模式”的基本程序执行寄存器的副本,后者只能由OS本身访问(通过操作系统中的标志访问)。内核设置的控制寄存器,用于说明内核或用户模式应用程序当前是否正在运行。
因此,您所说的“上下文切换”是交换/重置用户模式寄存器(指令寄存器,堆栈指针寄存器等)等的过程,但是系统寄存器不需要被交换掉,因为它们已存储除了用户。
例如,x86中的用户模式堆栈是USP-A7,而 super 用户模式堆栈是SSP-A7。因此,内核本身(包含任务调度程序)将使用 super 用户模式堆栈和其他 super 用户模式寄存器运行自身,在运行时将 super 用户模式标志设置为1,然后在用户模式硬件上执行上下文切换以在应用程序并将 super 用户模式标志设置为0。
但是在考虑操作系统和任务调度之前,如果您想做一个多任务系统,则必须使用问题中概述的基本概念:每x个周期使用硬件中断调用任务调度器,然后将应用换为任务计划程序,然后换成新的应用。但是在大多数情况下,计时器中断将是您实际的任务调度程序本身,并且将对其进行大量优化,以使其更少的上下文切换和更多的简单中断处理程序例程。