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