1,IO
BIO 内核态数据拷贝到用户态,阻塞线程
NIO 同步非阻塞:read后不阻塞,不断轮训recvfrom状态
IO多路复用:select/poll/epoll .select 一次可以查询多个系统调用的状态,在用户态操作,将fds 传给内核,查询是否就绪,但是内核态的复杂度是O(n)。epoll在内核态中存储了fd的信息,如果就绪会回调注册函数,将就绪的fd放到rdlist中。epoll_create,epoll_ctl,epoll_wait
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间 -> 用户空间)还是阻塞的。
目前支持 IO 多路复用的系统调用,有 select,epoll 等等。select 系统调用,目前几乎在所有的操作系统上都有支持。
- select 调用 :内核提供的系统调用,它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持。
- epoll 调用 :linux 2.6 内核,属于 select 调用的增强版本,优化了 IO 的执行效率。
AIO 通知回调