什么是可重入内核?
可重入内核:在内核模式下,可重入内核允许进程(或更准确地说,它们相应的内核线程)放弃 CPU。它们对其他进入内核模式的进程没有影响。在单处理器系统的情况下,可以一起调度多个处理器系统。
例子:
光盘读取就是一个例子。当用户程序请求读取磁盘时,调度程序会将 CPU 委托给另一个进程(内核线程),直到磁盘控制器发出中断指示数据可访问并且我们的线程可以恢复。这个进程仍然可以访问I/O,比如用户输入,这需要内核函数。系统保持响应,并且减少了由于 IO 延迟而浪费的 CPU 时间。原始函数(无论请求的数据)将在不可重入内核中被阻止,直到完成磁盘读取。
如果计算机程序或例程可以在其先前的调用完成之前再次安全地调用,则称它是可重入的(即它可以安全地同时执行)。可重入的计算机程序或例程:
- 不能有任何静态(或全局)的非常量数据。
- 不得将地址返回给静态(或全局)非常量数据。
- 它只能与调用者提供的数据一起使用。
- 锁不应该用来保护单例资源,一个只被引用一次的变量
- 它不能更改自己的代码(除非在自己独特的线程存储中执行)。
- 不可调用不可重入的计算机程序或例程。
如果使用锁来确保只有一个进程可以运行不可重入函数,那么不可重入函数仍然可以被可重入内核执行。即使当前进程在内核模式下运行,硬件中断也可以暂停它(允许 Ctrl+c 等停止执行)。
内核控制路径:内核为了处理系统调用而执行的一组指令。通常,指令是按顺序执行的,但有些活动会迫使 CPU 交错控制路由。在用户模式下,会进行以下系统调用:调度程序选择一个新进程来运行并打开它。代表两个独立的进程,执行两个控制路径。