什么是可重入内核?
更简单的解释:
内核可重入性
如果内核不可重入,一个进程只能在用户模式下被挂起。尽管它可以在内核模式下被挂起,但这仍然会阻止所有其他进程的内核模式执行。原因是所有内核线程共享同一内存。如果执行在它们之间任意跳跃,则可能导致数据损坏。
可重入内核使进程(或者更精确地说是相应的内核线程)在内核模式下放弃CPU。 它们不会阻止其他进程也进入内核模式。典型的用例是IO等待。 进程想要读取文件。 它调用内核函数以此为基础。 在内核函数内部,请求磁盘控制器获取数据。 获取数据需要一些时间,当时函数被阻塞。 对于可重入内核,调度程序将把CPU分配给另一个进程(内核线程),直到来自磁盘控制器的中断指示数据可用并且可以恢复我们的线程。该进程仍然可以访问需要内核函数的IO(例如用户输入)。 系统保持响应,并减少因IO等待而浪费的CPU时间。
这在今天的桌面操作系统中基本是标准。
内核抢占
内核抢占不会改善系统的整体吞吐量。相反,它旨在提高响应性。
这里的想法是通常情况下,内核函数只被硬件原因中断:外部中断或IO等待情况,在这种情况下,它自愿放弃对调度程序的控制。与此相反,抢占内核也像中断用户模式进程一样中断和挂起内核函数。 这使得系统更具响应性,例如处理鼠标输入的进程即使在内核中执行繁重的工作时也会被唤醒。
内核级别的抢占使内核开发变得更加困难:内核函数不能仅由中断处理程序(这是一个受控环境)自愿挂起,而且还可以由任何其他进程通过调度程序挂起。 必须小心避免死锁:线程锁定资源A但需要资源B时被另一个锁定资源B再需要资源A的线程中断。
对我的先占说明进行适度的怀疑。 我乐意接受任何纠正。
Does not hold static data over successive calls
Does not return a pointer to static data; all data is provided by the caller of the function
Uses local data or ensures protection of global data by making a local copy of it
Must not call any non-reentrant functions