什么是可重入内核

29

什么是可重入内核?

4个回答

25

更简单的解释:

内核可重入性

如果内核不可重入,一个进程只能在用户模式下被挂起。尽管它可以在内核模式下被挂起,但这仍然会阻止所有其他进程的内核模式执行。原因是所有内核线程共享同一内存。如果执行在它们之间任意跳跃,则可能导致数据损坏。

可重入内核使进程(或者更精确地说是相应的内核线程)在内核模式下放弃CPU。 它们不会阻止其他进程也进入内核模式。典型的用例是IO等待。 进程想要读取文件。 它调用内核函数以此为基础。 在内核函数内部,请求磁盘控制器获取数据。 获取数据需要一些时间,当时函数被阻塞。 对于可重入内核,调度程序将把CPU分配给另一个进程(内核线程),直到来自磁盘控制器的中断指示数据可用并且可以恢复我们的线程。该进程仍然可以访问需要内核函数的IO(例如用户输入)。 系统保持响应,并减少因IO等待而浪费的CPU时间。

这在今天的桌面操作系统中基本是标准。

内核抢占

内核抢占不会改善系统的整体吞吐量。相反,它旨在提高响应性。

这里的想法是通常情况下,内核函数只被硬件原因中断:外部中断或IO等待情况,在这种情况下,它自愿放弃对调度程序的控制。与此相反,抢占内核也像中断用户模式进程一样中断和挂起内核函数。 这使得系统更具响应性,例如处理鼠标输入的进程即使在内核中执行繁重的工作时也会被唤醒。

内核级别的抢占使内核开发变得更加困难:内核函数不能仅由中断处理程序(这是一个受控环境)自愿挂起,而且还可以由任何其他进程通过调度程序挂起。 必须小心避免死锁:线程锁定资源A但需要资源B时被另一个锁定资源B再需要资源A的线程中断。

对我的先占说明进行适度的怀疑。 我乐意接受任何纠正。


对我来说,第一段很难理解。请使用简短的句子使其更加清晰易懂。 - Abhinav

12
所有Unix内核都是可重入的,这意味着多个进程可以同时在内核模式下执行。当然,在单处理器系统中,只有一个进程可以进展,但是许多进程可以在内核模式下被阻塞,等待CPU或某些I/O操作的完成。例如,在代表进程向磁盘发出读取请求之后,内核让磁盘控制器处理并恢复执行其他进程。当设备满足读取时,中断会通知内核,因此前一个进程可以恢复执行。
一种提供可重入性的方法是编写函数,使其仅修改本地变量而不修改全局数据结构。这样的函数称为可重入函数。但是,可重入内核不仅限于这种可重入函数(尽管某些实时内核是这样实现的)。相反,内核可以包括不可重入的函数,并使用锁定机制来确保仅有一个进程可以同时执行不可重入函数。
如果发生硬件中断,可重入内核能够挂起当前正在运行的进程,即使该进程处于内核模式中也能做到。这种能力非常重要,因为它提高了发出中断的设备控制器的吞吐量。一旦设备发出中断,它会等待CPU确认。如果内核能够快速响应,则设备控制器将能够在CPU处理中断时执行其他任务。
现在让我们看看内核的可重入性及其对内核组织的影响。内核控制路径表示内核执行处理系统调用、异常或中断的一系列指令。
在最简单的情况下,CPU按顺序从第一个指令到最后一个指令依次执行内核控制路径。但是,当发生以下事件之一时,CPU会交错执行内核控制路径:
用户模式下正在执行的进程调用系统调用,相应的内核控制路径验证请求无法立即满足,然后调用调度程序选择要运行的新进程。因此,发生了进程切换。第一个内核控制路径未完成,CPU恢复执行其他内核控制路径。在这种情况下,这两个控制路径代表两个不同的进程被执行。当CPU在运行内核控制路径时,如果出现异常情况(例如:访问不存在于RAM中的页面),CPU会暂停第一个控制路径的执行并启动适当的过程。在本例中,这种类型的过程可以为进程分配一个新页面,并从磁盘读取其内容。当程序终止后,第一个控制路径可以恢复执行。在这种情况下,两个控制路径代表同一个进程执行。
当CPU在开启中断的内核控制路径上运行时发生硬件中断。第一个内核控制路径被中断,CPU开始处理另一个内核控制路径以处理中断。当中断处理程序终止时,第一个内核控制路径将恢复。在这种情况下,两个内核控制路径在同一个进程的执行环境中运行,并且总系统CPU时间归属于该进程。但是,中断处理程序不一定代表进程操作。
当CPU在启用内核抢占的情况下遇到中断,而另一个优先级更高的进程可运行时,第一个内核控制路径就会被中断,CPU将开始运行另一个代表更高优先级进程的内核控制路径。只有内核编译时启用了内核抢占支持才会发生这种情况。
这些信息可以在以下链接中获取:http://jno.glas.net/data/prog_books/lin_kern_2.6/0596005652/understandlk-CHP-1-SECT-6.html,更多信息请参阅http://linux.omnipotent.net/article.php?article_id=12496&page=-1

4
抱歉,看起来这一段和《深入理解Linux内核》的1.6.3节完全相同。我只是不理解这些陈述。 - Pwn
只是一样的..我已经提到了这个信息,是从理解内核中获取的。 - joe

3

内核是操作系统的核心部分,直接与硬件交互并调度进程运行。

进程调用内核函数执行任务,如访问硬件或启动新进程。因此,某些时间段内,进程将执行内核代码。如果多个进程可以同时执行内核代码,则称内核为可重入的。 "同时" 可以意味着两个进程实际上正在同时执行内核代码(在多处理器系统上),也可以意味着一个进程在执行内核代码时被中断(例如因为正在等待硬件响应),而另一个已经被调度运行的进程也调用了内核。

可重入内核提供更好的性能,因为内核没有争用。不可重入的内核需要使用来确保没有两个进程同时执行内核代码。


1
可重入函数是指可以被多个任务同时使用,而不会出现数据损坏的函数。相反,非可重入函数是指除非通过使用信号量或在代码的关键部分禁用中断来确保对函数的互斥访问,否则不能由多个任务共享。可重入函数可以随时被中断并在稍后恢复,而不会丢失数据。可重入函数要么使用局部变量,要么在使用全局变量时保护其数据。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接