慢系统调用和快系统调用的区别

Kay*_*Kay 13 system-programming system-calls

慢系统调用和快系统调用有什么区别?我了解到如果进程捕捉到一些信号,慢系统调用会阻塞,因为捕捉到的信号可能会唤醒被阻塞的系统调用,但我不能完全理解这种机制。任何例子将不胜感激。

Gil*_*il' 20

事实上,系统调用分为三个等级。

  1. 一些系统调用会立即返回。“立即”意味着他们唯一需要的是一点处理器时间。它们可以花费多长时间没有硬性限制(实时系统除外),但是这些调用一旦被安排足够长的时间就会返回。
    这些调用通常称为非阻塞。非阻塞调用的例子是电话,只是读一些系统状态,或做一个简单的改变系统状态,如getpidgettimeofdaygetuidsetuid。某些系统调用根据情况可以是阻塞的或非阻塞的;例如,read如果文件是管道或其他支持非阻塞读取的类型并且设置了O_NONBLOCK标志,则从不阻塞。
  2. 一些系统调用可能需要一段时间才能完成,但不是永远。一个典型的例子是sleep
  3. 某些系统调用在某些外部事件发生之前不会返回。据说这些调用是阻塞的。例如,read在阻塞文件描述符上调用是阻塞的,wait.

“快”和“慢”系统调用之间的区别接近于非阻塞与阻塞,但这一次是从内核实现者的角度来看的。众所周知,快速系统调用能够在不阻塞或等待的情况下完成。当内核遇到快速系统调用时,它知道它可以立即执行系统调用并保持相同进程的调度。(在一些具有非抢占式多任务处理的操作系统中,快速系统调用可能是非抢占式的;这在普通的 unix 系统中不是这种情况。)另一方面,慢速系统调用可能需要等待另一个任务完成,因此内核必须准备暂停调用进程并运行另一个任务。

有些案例有点灰色地带。例如,磁盘读取(read从常规文件)通常被认为是非阻塞的,因为它不等待另一个进程;它只是在等待磁盘,这通常只需要一点时间来回答,但不会永远(所以这是上面的情况 2)。但是从内核的角度来看,该进程必须等待磁盘驱动程序完成,所以这绝对是一个缓慢的系统调用。