什么是可重入内核

时间:2009-07-22 08:26:43

标签: linux operating-system linux-kernel

什么是可重入内核?

4 个答案:

答案 0 :(得分:23)

更简单的回答:

内核重入

如果内核不可重入,则进程只能在用户模式下暂停。虽然它可以在内核模式下暂停,但仍会阻止所有其他进程上的内核模式执行。原因是所有内核线程共享相同的内存。如果执行会在它们之间任意跳转,则可能会发生损坏。

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

这对于今天的桌面操作系统来说非常标准。

内核抢先

内核抢占无助于系统的整体吞吐量。相反,它寻求更好的响应能力。

这里的想法是,通常内核函数只会被硬件原因中断:外部中断或IO等待情况,它会自动放弃对调度程序的控制。先发制人的内核也可以中断和挂起内核函数,就像在用户模式下中断进程一样。该系统响应更快,如处理鼠标输入,即使在内核中完成大量工作也会被唤醒。

内核级别的抢占使得内核开发人员更难:内核函数不能只是自愿挂起,也不能由中断处理程序(在某种程度上是受控环境)暂停,而是由于调度程序而导致的任何其他进程。必须注意例如避免死锁:线程锁定资源A但是需要资源B被另一个锁定资源B的线程中断,但是需要资源A.

用一点点解释我的先发制人。我很高兴任何更正。

答案 1 :(得分:11)

所有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

答案 2 :(得分:3)

kernel是操作系统的核心部分,它直接与硬件和schedules进程直接连接。

进程调用内核函数以执行访问硬件或启动新进程等任务。因此,在某些时间段内,进程将执行内核代码。如果多个进程可以同时执行内核代码,则内核称为 reentrant 。 “同时”可能意味着两个进程实际上同时执行内核代码(在多处理器系统上)或者一个进程在执行内核代码时被中断(因为它等待硬件响应,例如)并且计划运行的另一个进程也调用了内核。

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

答案 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