分类:linux| 发布时间:2025-01-22 20:53:00
Unix内核提供了一个执行环境,应用程序可以在其中运行。 因此,内核必须实现一组服务和相应的接口。应用程序通过这些接口进行交互,通常不会直接与硬件资源交互。
所有 Unix 内核都是可重入的。 这意味着多个进程可以同时在内核模式下执行。 当然,在单处理器系统上,只有一个进程可以进行处理,但许多进程可以在内核模式下被阻塞,等待 CPU 或某些 I/O 操作的完成。 例如,在代表某个进程发出对磁盘的读取请求后,内核会让磁盘控制器处理该请求,并恢复执行其他进程。 中断会在设备完成读取时通知内核,这样前一个进程就可以恢复执行。
提供可重入性的一种方式是编写函数,使其只修改局部变量而不改变全局数据结构。 这样的函数称为可重入函数。然而,可重入内核不仅限于这种可重入函数(尽管某些实时内核是通过这种方式实现的)。 相反,内核可以包含不可重入的函数,并使用锁机制确保一次只有一个进程可以执行不可重入函数。
如果发生硬件中断,可重入内核能够暂停当前正在运行的进程,即使该进程在内核模式下。 这一能力非常重要,因为它提高了发出中断的设备控制器的吞吐量。 一旦设备发出中断,它会等待直到 CPU 确认。 如果内核能够快速响应,设备控制器就能够在 CPU 处理中断的同时执行其他任务。
现在让我们来看一下内核的可重入性及其对内核组织结构的影响。 内核控制路径指的是内核为处理系统调用、异常或中断而执行的指令序列。
在最简单的情况下,CPU会顺序地从第一条指令执行到最后一条指令来执行内核控制路径。然而,当以下事件发生时,CPU会交错执行内核控制路径:
每个进程都在其私有地址空间中运行。 一个在用户模式下运行的进程会引用 私有栈、数据和代码区域。 当在内核模式下运行时,进程会访问内核的数据和代码区域,并使用另一个私有栈。
由于内核是可重入的,多个内核控制路径(每个与不同的进程相关)可能会依次执行。 在这种情况下,每个内核控制路径引用其自己的私有内核栈。
虽然每个进程看似都有访问私有地址空间的权限,但有时地址空间的某些部分是由多个进程共享的。 在某些情况下,这种共享是由进程显式请求的;在其他情况下,内核会自动进行共享,以减少内存使用。
如果同一个程序,例如一个编辑器,需要多个用户同时使用,该程序只会加载到内存一次,其指令可以由所有需要它的用户共享。 当然,它的数据不能共享,因为每个用户将有各自的数据。 这种共享地址空间是由内核自动完成的,以节省内存。
进程还可以共享它们地址空间的某些部分,作为一种进程间通信的方式,System V 引入了 “共享内存”技术,并且 Linux 支持该技术。
最后,Linux 支持 mmap()
系统调用,该调用允许将文件的某一部分或块设备上存储的信息映射到进程地址空间的某一部分。
内存映射可以作为数据传输的替代方式,替代常规的读写操作。
如果多个进程共享同一个文件,则该文件的内存映射会被包含在每个共享该文件的进程的地址空间中。