系统调用期间的用户模式和内核模式切换

在广泛的层面上,在linux系统调用期间发生以下情况。

  1. 用户模式进程被提升到内核模式并执行内核代码(中断服务程序),然后返回到正常模式。 换句话说,就是消耗CPU的用户进程。
  2. 有一个内核进程始终以内核模式运行。 用户模式处理调度任务(以系统调用的forms)到内核进程。 内核进程完成作业并将结果返回给用户模式进程。 换句话说,用户进程在这段时间内是空闲的,而内核进程是一个耗费CPU的进程。
  3. 别的东西。

它主要是1但是有点2。

从用户模式应用程序的角度来看,系统调用自己是同步发生的。 然而,通常情况下,系统调用并不具备需要返回的内容,因此会使进程处于休眠状态。 这并不总是发生; 一些简单的系统调用实际上完成了同步。 但是,有些需要等待长时间运行的I / O任务才能完成。

内核有中断处理程序和内核线程异步处理的东西。 一个例子是你的硬盘驱动器中断了系统,以表明它最终检索到你正在阅读的文件。 其中一个异步事件可能会出现并唤醒您的进程,现在系统调用已经返回到用户空间了。

所以看起来整个过程同步发生,但这只是一个幻想。

为了使处理器进入内核(或另一个提升)模式,它必须通过中断或异常来实现。 因为你在问系统调用,所以我们正在处理异常。

[由于过分简单化的风险,特别是英特尔的奇怪…]任何硬件异常(例如,访问冲突,除以零,页面错误)导致处理器进入内核模式。 每个例外都有一个由处理器定义的号码。 发生异常时,处理器将调度到异常处理程序。 通常,处理器具有定义异常处理程序数组的位置和长度的寄存器。 当异常#2发生时,CPU调用数组中的第三个处理程序(0,1,2)。

处理器不可变的有触发异常的指令,例如调试和系统调用。

要进行系统调用,需要调用一个处理器指令,该指令会导致发送到执行系统调用的异常处理程序的异常。 在系统调用结束时,处理程序从异常/中断指令调用特殊返回,将处理器返回到用户模式。

因此,你的#1基本上是正确的。

你的#2在大多数操作系统中是完全错误的。 中断和异常由当前正在执行的进程处理(Linux使用不同的术语,但在功能上是相同的)。

如果您的进程读取到磁盘,则在等待响应时可能会挂起。 当中断发生时,另一个进程将会运行,表示您的磁盘I / O已完成。 该进程将处理您的I / O的中断。 然后,它会将您的I / O请求排入您的进程,并将进程状态设置为可运行。 下一次您的进程计划运行,它可以拿起其完成的I / O请求。