Ada*_*son 2 process scheduling kernel interrupt linux-kernel
据我了解,内核不是一个进程,而是一组可以从另一个进程的运行时调用的处理程序(或者内核本身通过计时器或类似的东西?)
如果程序遇到一些需要长时间同步处理才能再次开始运行的异常处理程序(例如,遇到需要读取磁盘的页面错误),内核如何识别应该切换上下文?为了实现这一点,似乎需要运行另一个进程?
内核是否会通过间歇性检查处于此状态的进程来生成处理此问题的进程?调用长时间运行的同步处理程序的进程是否让内核知道它应该切换上下文直到处理程序完成(例如磁盘读取完成)?
“内核不是进程。”
这是纯粹的术语。(术语很重要。)内核不是进程,因为根据定义,进程存在于用户空间中。但是内核确实有线程。
“如果程序遇到一些需要长时间同步处理才能再次开始运行的异常处理程序(例如,遇到需要磁盘读取的页面错误)”。
如果用户进程执行引用未映射内存页的机器指令,则:
处理器生成陷阱并转换到ring 0/supervisor 模式。(这发生在硬件中。)
陷阱处理程序是内核的一部分。假设内存页确实必须从磁盘调入,它会将进程置于不可中断睡眠状态(这意味着它将进程CPU状态保存在进程表中,并修改进程表中进程条目中的状态字段)进程),找到一个受害者内存页面,启动 I/O 以将受害者和请求页面中的页面换出,并调用调度程序(内核的另一部分)将用户空间上下文切换到另一个准备运行的进程。
最终,I/O 完成。这会产生一个中断。作为对中断的响应,处理器调用一个处理程序并转换到 ring 0/supervisor 模式。(这发生在硬件中。)
中断处理程序是内核的一部分。它清除正在等待内存页面的进程的等待 I/O 状态并将其标记为准备运行。然后它调用调度程序将用户态上下文切换到准备运行的进程。
一般来说,内核运行:
响应硬件陷阱或中断;这包括定时器中断。
响应来自用户进程的显式系统调用。
大多数时候,处理器处于环 3/用户模式并执行来自某个用户进程的指令。当用户态进程进行系统调用(例如,因为它想做一些输入/输出操作)或硬件产生陷阱(无效的内存访问,除以零,等等)或者当从硬件接收到中断请求时(I/O 完成、定时器中断、鼠标移动、数据包到达网络接口等)
要回答标题中的问题,“内核调度程序如何知道如何抢占进程”:内核处理定时器中断。如果,当定时器中断到来时,schduler通知当前运行用户级进程已经耗尽其量子那么该过程被放在在运行队列的末尾和另一个进程正在恢复。(通常,调度程序会注意确保所有准备运行的用户级进程公平地接收处理器时间。)