发布网友 发布时间:2024-10-23 23:31
共1个回答
热心网友 时间:2024-11-09 10:12
Linux下,应用程序调用操作系统服务有三种主要接口:Linux内核代码(运行在Ring0级别,内核态)与用户及库代码(运行在Ring3级别,用户态)。程序访问系统服务时,CPU在用户态与内核态间切换,同时复制所需内存数据。
I/O作为编程中频繁调用的Linux服务,遵循上述接口。常见场景包括网络I/O和文件I/O。
Linux IO涉及应用程序与内核之间的交互协作方式,分为阻塞与非阻塞、同步与异步。
阻塞IO指应用程序调用API时,线程立即被挂起直至IO操作完成,API函数才返回,线程解除阻塞继续执行。
非阻塞IO则在数据未准备好时直接返回失败,一旦数据准备好,应用程序被阻塞直至IO完成,API返回解除阻塞。
阻塞与非阻塞的区别在于是否等待数据准备,数据准备好时两者均阻塞直至IO完成。
同步与异步IO主要区别在于同步IO操作时会阻塞进程,异步IO则不会。
异步IO时,应用程序发出请求后立即返回,无需等待内核操作完成,而同步IO操作则会将进程阻塞直到数据准备好。
信号驱动I/O与I/O多路复用为Linux下两种IO模型。
信号驱动I/O允许应用程序安装信号处理函数,继续运行不阻塞。当数据准备好时,进程接收SIGIO信号处理数据。
I/O多路复用包括select、poll与epoll,允许一个线程监听多个IO端口,判断是否有事件发生并相应处理。
select监听socket集合并阻塞直至有事件发生,应用程序检查socket集合后调用相应IO操作函数。poll类似select但不受socket数量,内部采用轮询。epoll则采用事件通知机制,效率更高。
epoll中,socket状态变化称为事件,通知应用程序有两种方式:水平触发与边缘触发。水平触发下,只要状态变化就通知,而边缘触发仅在状态翻转时通知一次。
最后,总结Linux下的五种I/O模型,并推荐Linux、C/C++技术交流群,提供学习资源。