BIO
一个线程对应一个连接,read时阻塞,直到有数据返回.
NIO
select
application知道有I/O时间发生,但并不知道哪几个流,所以只能轮询所有流读取数据,时间复杂度O(n),同时处理的流越多,时间越多,且有最大连接限制
poll
application将文件描述符数组拷贝到内核空间,内核轮询每个fd对应的设备状态,时间复杂度O(n),没有最大连接数的限制,基于链表来存储文件描述符fd
epoll
事件驱动,epoll会把哪个流发生了怎样的I/O事件通知我们,
首先通过create函数创建一个epoll实例,然后使用ctl add/delete函数新增删除epoll实例上要监听的事件类型,调用wait函数等待事件发生,当产生事件时,内核会通知application处理事件,application再去读取流
epoll使用mmap文件映射,可以实现application和内核空间的消息零拷贝,减少复制开销.
select,poll,epoll之间的区别
- 进程最大连接数:
select:有,受linux最大连接数影响
poll:无,基于链表来存储
epoll:有链接限制,但数量很大 1G内存机器可以打开10万连接, - fd剧增的IO效率
select:线性遍历,不管链接是否活跃均会遍历
poll:同select
epoll:基于事件回调,活跃socket才会主动调起callback,活跃链接少时,性能很好,但当所有连接都活跃时,有性能问题 - 消息传递方式
select: 内核与用户空间之间需要相互拷贝
poll:同上
epoll:通过mmap共享内存
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。