慢速系统调用(slow system calls)和快速系统调用(fast system calls)之间的区别

慢速系统调用(slow system calls)和快速系统调用(fast system calls)之间的区别

概述

         慢速系统调用(slow systemcalls)和快速系统调用(fast system calls)相关的名词在系统I/O资料里经常出现。因此了解这些名词的定义对理解系统I/O的架构非常有帮助。

系统调用实际上有三种情况

快速系统调用

    一些系统调用立即返回。 “立即”意味着他们只需要一点处理器时间。 他们可以持续多长时间(除了实时系统)没有硬性限制,但是这些调用一经预定足够长时间就会返回。这些调用通常称为非阻塞。

    非阻塞调用的示例是只读取系统状态的一些调用,或者对系统状态进行简单更改。 根据具体情况,某些系统调用可能是阻塞的或非阻塞的; 例如,如果文件是支持非阻塞读取的管道或其他类型,并且设置了O_NONBLOCK标志,则读取永不阻止。一些系统调用可能需要一段时间才能完成,但不是永远的。典型的例子是睡眠。

慢速系统调用

有些系统调用在某些外部事件发生之前不会返回。 例如,读取阻塞文件描述符时调用阻塞,等等。常见的慢系统调用有:

•在读某些类型的文件时,如果数据并不存在则可能会使调用者永远阻塞(管道、终端设

备以及网络设备)。

•在写这些类型的文件时,如果不能立即接受这些数据,则也可能会使调用者永远阻塞。

•打开文件,在某种条件发生之前也可能会使调用者阻塞(例如,打开终端设备,它要等

待直到所连接的调制解调器回答了电话)。

• pause(按照定义,它使调用进程睡眠直至捕捉到一个信号 )和w a i t。

•某种i o c t l操作。

•某些进程间通信函数(socket)

特殊情况

    例如,磁盘读取(从常规文件读取)通常被认为是非阻塞的,因为它不会等待另一个进程; 它只是等待磁盘,通常只需要一点时间来回答,但不会永远占用(所以上面的情况2)。

    但是从内核的角度来看,这个过程必须等待磁盘驱动程序完成,所以它肯定是一个缓慢的系统调用。

总结

“快速”和“慢速”系统调用的区别接近于非阻塞与阻塞,但这次是从内核实施者的角度来看。

快速系统调用是已知能够在不阻塞或等待的情况下完成的系统调用。当内核遇到快速系统调用时,它知道它可以立即执行系统调用,并保持相同的进程调度。

另一方面,慢速系统调用可能需要等待另一个任务完成,因此内核必须准备暂停调用进程并运行其他任务。

参考资料

[1]. https://en.wikipedia.org/wiki/System_call

[2].《Unix高级编程》


猜你喜欢

转载自blog.csdn.net/xiangguiwang/article/details/79865328