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 共享内存