Linux下的五种I/O模型
来源:互联网 发布:p2p对等网络监管 编辑:程序博客网 时间:2024/06/09 23:03
阻塞I/O(blocking I/O)
非阻塞I/O (nonblocking I/O)
I/O复用(select 和poll) (I/O multiplexing)
信号驱动I/O (signal driven I/O (SIGIO))
异步I/O (asynchronous I/O (the POSIX aio_functions))
前四种都是同步,只有最后一种才是异步IO。
I/O过程分为两个过程,数据准备和数据拷贝
阻塞I/O模型:
该模型在两个过程中一直处于阻塞状态,直到数据拷贝完成,系统调用返回.
阻塞I/O模型图:
当调用recv()函数时,系统首先查是否有准备好的数据。如果数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。在套接应用程序中,当调用recv()函数时,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。
非阻塞IO模型
我们把一个SOCKET接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会耗费大量的占用CPU的时间。有点类似于轮询
非阻塞I/O模型图:
IO复用模型:
I/O复用模型常用的函数有select、poll和epoll,具体的区别请查阅相关资料。这几个函数也会使进程阻塞(请注意和I/O阻塞进行区分)该函数可以监听多个socket,看是否有socket就绪,如果就绪就返回就绪的socket数(或者超时返回),然后对就绪的socket按照对应的就绪事件进行相关的操作(读数据或者写数据)
I/O复用模型图:
信号驱动IO
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,我们可以在信号处理函数中调用I/O操作函数处理数据。
异步IO模型
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的模块在完成I/O操作后,通过状态或者回调来通知调用者
同步IO和异步IO的区别:数据拷贝的过程中,进程是否阻塞!
阻塞IO和非阻塞IO的区别:数据准备的过程中,进程是否阻塞!
5种I/O模型的比较:
- Linux下的五种I/O模型
- Linux下的五种I/O模型
- Linux下的五种I/O模型
- 浅谈Linux下的五种I/O模型
- Linux下的五种I/O模型
- 浅谈Linux下的五种I/O模型
- Linux下的五种I/O模型
- 浅谈Linux下的五种I/O模型
- Linux下的五种I/O模型
- Linux下的五种I/O模型
- Linux下的五种I/O通信模型
- Linux下的五种I/O模型
- Linux的五种I/O模型
- Unix下的五种I/O模型图
- Linux Socket五种I/O模型
- Linux Socket五种I/O模型
- Linux Socket五种I/O模型
- Linux Socket五种I/O模型
- 中国电信欢go建立话费话费异常预警(国际)
- Android Volley完全解析(三),定制自己的Request
- MySQL____将查询结果插入到表中
- JS实现复制到剪贴板
- SQL2008定时备份数据库
- Linux下的五种I/O模型
- 【effective c++读书笔记】【第7章】模板和泛型编程(3)
- 命名管道(FIFO)
- MyEclipse快捷键大全
- 关于Android中的四大组件(Service的开启与关闭)
- java 基础概念 -- 数组与内存控制
- linux 命令
- string get_telno(string &userid) 和 string get_telno(string userid) 有什么区别
- SpringMVC实现一个controller写多个方法