主要内容总结:
介绍:系统调用是用户应用与操作系统内核的接口,“快”“慢”系统调用的区分影响与信号处理等的交互及系统性能,本文将探讨其差异等方面。
核心定义:
- 快系统调用:能立即完成,返回快,无需调用进程阻塞或睡眠,仅需 CPU 处理时间,如
getpid()
等。 - 慢系统调用:可能需等待外部事件或资源,可能阻塞进程,使内核挂起进程直到操作完成,如
read()
等。
- 快系统调用:能立即完成,返回快,无需调用进程阻塞或睡眠,仅需 CPU 处理时间,如
- 信号交互机制:慢系统调用被信号中断时,内核会中断系统调用,进程提前返回,执行信号处理程序,系统调用通常返回
EINTR
错误。
- 代码演示:通过
read()
从管道与信号处理交互的示例代码,展示慢系统调用与信号处理的机制,包括编译运行方法及预期输出,还展示了磁盘 I/O 的相关示例及输出。 系统调用类别详细:
- 非阻塞系统调用(快):返回快,只需 CPU 时间,如信息检索、简单状态改变等操作。
- 潜在阻塞系统调用(中):需一定时间完成,有最大持续时间,如
sleep()
等。 - 无限阻塞系统调用(慢):直到外部事件发生才返回,如各种 I/O 相关的系统调用。
内核实现细节:
- 快系统调用实现:用户代码调用后,内核验证参数并执行操作,直接在调用进程上下文中完成,调用线程不释放 CPU。
- 慢系统调用实现:内核验证参数后,若资源/事件不可用,将进程置于等待队列,当事件发生时唤醒进程继续执行,返回前检查信号。
- 内核中的信号处理:信号生成时内核设置信号待处理位图,系统调用或中断返回前内核检查信号,自动系统调用重启由
SA_RESTART
标志控制。 实际应用与最佳实践:
- 信号处理程序设计要简洁安全,根据需求决定是否使用
SA_RESTART
。 - 处理
EINTR
错误,编写EINTR
安全的系统调用函数。 - 考虑使用非阻塞 I/O 提高响应性,或使用异步 I/O 处理高并发应用。
- 信号处理程序设计要简洁安全,根据需求决定是否使用
- 低级别系统调用实现理解:以
getpid()
和read()
为例,展示快系统调用简单直接,慢系统调用需处理数据可用性、等待与信号等。 - 现代操作系统中的系统调用分类:包括完全同步(快)、异步、带超时阻塞、无限阻塞、可重启等系统调用类别。
- 系统调用处理的演进:从传统阻塞 I/O 到各种先进的 I/O 处理机制,如非阻塞 I/O、I/O 多路复用、信号驱动 I/O、异步 I/O 及 I/O Uring 等。
- 总结与实践建议:快系统调用立即返回,慢系统调用可能阻塞并可被信号中断,最佳实践包括正确处理
EINTR
、使用SA_RESTART
等。 - 结论:区分快慢系统调用对理解操作系统处理机制很重要,现代系统有多种处理系统调用的机制,理解这些能写出更可靠高效的代码。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。