当在用户空间中执行的进程发出system call
或触发exception
时,它进入内核空间并且内核开始代表进程执行。据说内核正在process context
中执行。类似地,当发生中断时,内核在interrupt context
中执行。我研究了kernel thread
中的内核执行,其中内核进程在后台运行。
我的问题是:
内核是否在其他任何环境中执行?
假设用户空间中的进程从不执行系统调用或触发异常或没有发生中断,内核代码是否会执行?
答案 0 :(得分:3)
内核定期运行,它设置一个定时器以某个预定频率(100 Hz(Linux 2.4 / x86),1000Hz(早期Linux 2.6 / x86),250Hz(较新的Linux 2.6 / x86))触发中断。
内核需要执行此操作才能执行抢占式多任务处理。 OTOH,仅执行协作式多任务操作的操作系统(Windows 3.1,经典Mac OS)不需要执行此操作,并且仅响应来自正在运行的任务的某些调用来切换任务(这可能导致挂起整个系统的失控任务)。
请注意,优化使用此计时器需要付出一些努力:当没有可运行的任务时,较新的Linux会更智能,它会在未来尽可能地设置计时器,以使CPU能够更长时间地睡眠,并保留功率(CONFIG_NOHZ
内核配置选项)。运行powertop
将显示每秒唤醒的次数,这在空闲系统上可以远低于您对传统实现所期望的每秒250次唤醒。
答案 1 :(得分:0)
假设用户空间中的进程从不执行系统调用或触发异常或没有发生中断,内核代码是否会执行?
假设您有一个运行以下代码的进程p
:while(1);
。此代码永远不会调用内核,也不会导致任何错误。 (它可能之前设置了alarm(3)
,导致将来传递信号,或者它可能超过setrlimit(2)
CPU限制,在这种情况下内核将提供这个过程的信号。)
或者,如果另一个进程通过p
发送kill(2)
信号,内核也会将该信号传递给进程。
信号传递将导致信号处理程序运行,不执行任何操作(如果信号被忽略或屏蔽),或采取默认信号操作(可能无效或终止)。
当然,可以中断流程执行,以便处理器可以处理中断;或者优先级较高的流程可以抢占它。