深入理解Linux内核(绪论二)

本文详细解释了Unix内核的可重入特性,探讨了内核控制路径如何处理系统调用、异常和中断,以及进程在用户态和内核态下的地址空间管理,包括私有栈和共享内存的使用情况。
摘要由CSDN通过智能技术生成

可重入内核

所有Unix内核都是可重入的(reentrant),这意味着若干个进程可以同时在内核态下执行。当然,在单处理器系统上只有一个进程在真正执行,但是有许多进程可能在等待CPU或某一I/O操作完成时在内核态下被阻塞。例如,当内核代表某一进程发出一个读磁盘请求后,就让磁盘控制器处理这个请求并且恢复执行其他进程。当设备满足了读请求时,有一个中断就会通知内核,从而以前的进程可以恢复执行。
内核控制路径(kernel control path)表示内核处理系统调用、异常或中断所执行的指令序列。
在最简单的情况下,CPU从第一条指令到最后一条指令顺序地执行内核控制路径。然而,当下述事件之一发生时,CPU交错执行内核控制路径。

  • 运行在用户态下的进程调用一个系统调用,而相应的内核控制路径证实这个请求无法立即得到满足。然而,内核控制路径调用调度程序选择一个新的进程投入运行。结果,进程切换发生。第一个内核控制路径还没完成,而CPU又重新开始执行其他的内核控制路径。在这种情况下,两条控制路径代表两个不同的进程在执行。
  • 当运行第一个内核控制路径时,CPU检测到一个异常(例如,访问一个不在RAM中的页)。第一个控制路径被挂起,而CPU开始执行合适的过程。在我们的例子中,这种过程能给进程分配一个新页,并从磁盘读它的内容。当这个过程结束时,第一个控制路径可以恢复执行。在这种情况下,两个控制路径代表同一个进程在执行。
  • 当CPU正在运行一个启用了中断的内核控制路径时,一个硬件中断发生。第一个内核控制路径还没执行完,CPU开始执行另一个内核控制路径来处理这个中断。当这个中断处理程序终止时,第一个内核控制路径恢复。在这种情况下,两个内核控制路径运行在同一进程的可执行上下文中,所花费的系统CPU时间都算给这个进程。然而,中断处理程序无需代表这个进程运行。
  • 在支持抢占式调度的内核中,CPU正在运行,而一个更高优先级的进程加入就绪队列,则中断发生。在这种情况下,第一个内核控制路径还没有执行完,CPU代表高优先级进程又开始执行另一个内核控制路径。只有把内核编译成支持调度之后,才可能出现这种情况。

进程地址空间

每个进程运行在它的私有地址空间。在用户态下运行的进程涉及到私有栈、数据区和代码区。当在内核态运行时,进程访问内核的数据区和代码区,但使用另外的私有栈。
因为内核是可重入的,因此几个内核控制路径(每个都与不同的进程有关)可以轮流执行。在这种情况下,每个内核控制路径都引用它自己的私有内核栈。
尽管看起来每个进程访问一个私有地址空间,但有时进程之间也共享部分地址空间。在一些情况下,这种共享由进程显式地提出;在另外一些情况下,由内核自动完成共享以节约内存。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值