同步非阻塞io:数据未准备好则轮询,准备好后需阻塞完成拷贝
io复用:两段阻塞过程,select,poll,epoll
信号驱动io:很少用
aio:唯一的异步io,其余都是同步io(需用户主动发起阻塞的拷贝操作),内核拷贝完成后通知用户
netty在创建EventLoopGroup可以传入SelectorProvider或使用默认的SelectorProvider.provider(),SelectorProvider.provider()会判断linux >= 2.6 使用epoll,否则poll
netty其实基于同步io(nio和io复用),但我们说netty是异步事件驱动,此处异步指对用户来说,io操作是异步的,立即返回的,通过future进行通知的。
select和poll相似:fd集合拷贝至内核空间,先轮询fd集合(1 当前进程挂到fd(设备)的等待队列 2 返回fd的就绪状态),轮询有就绪的就返回,无就绪则睡眠,任一fd就绪唤醒进程,醒来后轮询fd集合找出所有就绪的。
select默认支持fd为1024,poll无限制,fd集合的结构有点不同。
epoll:
epoll_create:创建一个epoll句柄
epoll_ctl:注册要监听的事件类型
epoll_wait:等待事件产生
拷贝发生在epoll_ctl注册时,而不是select/poll的每次等待都拷贝
当前进程挂到fd等待队列发生在epoll_ctl时且指定回调函数,fd就绪调用回调函数把fd放入就绪链表,当前进程无需轮询,只需看就绪链表是否有内容
支持的fd无限制。