在广泛的层面上,在linux系统调用期间发生以下情况。
它主要是1但是有点2。
从用户模式应用程序的角度来看,系统调用自己是同步发生的。 然而,通常情况下,系统调用并不具备需要返回的内容,因此会使进程处于休眠状态。 这并不总是发生; 一些简单的系统调用实际上完成了同步。 但是,有些需要等待长时间运行的I / O任务才能完成。
内核有中断处理程序和内核线程异步处理的东西。 一个例子是你的硬盘驱动器中断了系统,以表明它最终检索到你正在阅读的文件。 其中一个异步事件可能会出现并唤醒您的进程,现在系统调用已经返回到用户空间了。
所以看起来整个过程同步发生,但这只是一个幻想。
为了使处理器进入内核(或另一个提升)模式,它必须通过中断或异常来实现。 因为你在问系统调用,所以我们正在处理异常。
[由于过分简单化的风险,特别是英特尔的奇怪…]任何硬件异常(例如,访问冲突,除以零,页面错误)导致处理器进入内核模式。 每个例外都有一个由处理器定义的号码。 发生异常时,处理器将调度到异常处理程序。 通常,处理器具有定义异常处理程序数组的位置和长度的寄存器。 当异常#2发生时,CPU调用数组中的第三个处理程序(0,1,2)。
处理器不可变的有触发异常的指令,例如调试和系统调用。
要进行系统调用,需要调用一个处理器指令,该指令会导致发送到执行系统调用的异常处理程序的异常。 在系统调用结束时,处理程序从异常/中断指令调用特殊返回,将处理器返回到用户模式。
因此,你的#1基本上是正确的。
你的#2在大多数操作系统中是完全错误的。 中断和异常由当前正在执行的进程处理(Linux使用不同的术语,但在功能上是相同的)。
如果您的进程读取到磁盘,则在等待响应时可能会挂起。 当中断发生时,另一个进程将会运行,表示您的磁盘I / O已完成。 该进程将处理您的I / O的中断。 然后,它会将您的I / O请求排入您的进程,并将进程状态设置为可运行。 下一次您的进程计划运行,它可以拿起其完成的I / O请求。