I/O模型
两个关键词:内核空间和用户空间;io操作时,比如网络IO读,首先数据会先到达内核空间,
然后在内核态将内核空间的数据copy到用户空间。如果写数据时,也是通常将用户空间的数据copy
到内核空间,然后在将内核空间的数据发送出去。但目前有很多IO优化技术,比如:
direct io、mmap、sendfile等。
1、阻塞I/O模型
发出一个请求,直到数据返回,一直处于等待状态,不做任何事情
2、非阻塞I/O模型
发送一个请求,然后去做其他事情,然后每隔一段时间去询问数据是否就绪了,
如果就绪的话,就去取数据。
3、I/O多路复用模型(select/poll/epoll)
多路:指的是多个IO流;
复用:复用一个线程
即可以用一个线程同时监控多个IO流的状态,而不必每来一个IO流,都打开
一个新的线程来进行处理。
select:
发送一个请求,然后进行系统调用,此时内核中数据没有准备好,等数据都
到达内核后,会返回一个可读的状态,然后在请发取数据,进行系统调用,当数据
都从内核态复制到用户态后,告知用户进程数据已经到达。
poll:
和select完全类似,只是没有连接数限制。
epoll:
没有最大连接数的限制,只有活跃的fd才会调callback函数,内存拷贝
是利用mmap文件映射内存方式加速与内存空间的消息传递,减少复制开销。
4、信号驱动I/O模型
不用监控描述符了,被动等待信号通知,由信号处理程序进行处理,对同一个描述符
的IO操作是有序的。
5、异步I/O模型
发送IO请求后,不需要等,接口到通知后,此时数据已经读取好了的,直接可以进行数据
处理。
同步和异步:关注的是消息通信机制。
阻塞和非阻塞:关注的是程序在等待结果时(消息、返回值)时的状态。
同步和异步表示一种协助方式,是从更高角度看待进程间的合作方式。
阻塞和非阻塞是从当前进程来看待等待结果时的状态。
参考文档
https://www.zhihu.com/people/levin-43-90/activities
https://www.jianshu.com/p/6a6845464770