IO模型

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值