https://blog.csdn.net/wangtaomtk/article/details/51811011
系统调用 ---> 中断机制
BIO:blocking IO
NIO : no blocking IO
多路复用器:select --->poll ---->epoll, cortine
- select
思路:有连接请求抵达了再检查处理。
问题:句柄上限+重复初始化+逐个排查所有文件句柄状态效率不高。 - poll
poll 主要解决 select 的前两个问题:通过一个 pollfd 数组向内核传递需要关注的事件消除文件句柄上限,同时使用不同字段分别标注关注事件和发生事件,来避免重复初始化。
int poll(struct pollfd *fds, nfds_t nfds, int timeout); - epoll
既然逐个排查所有文件句柄状态效率不高,很自然的,如果调用返回的时候只给应用提供发生了状态变化(很可能是数据 ready)的文件句柄,进行排查的效率不就高多了么。
epoll 采用了这种设计,适用于大规模的应用场景。
实验表明,当文件句柄数目超过 10 之后,epoll 性能将优于 select 和 poll;当文件句柄数目达到 10K 的时候,epoll 已经超过 select 和 poll 两个数量级。
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); - cortine
应用层和内核层一起做,减少上下文切换损耗
同步、异步:应用程序和内核交互的事件机制;
- 同步:用户进程触发IO操作并等待或者轮询IO操作是否就绪;
- 异步:用户进程触发IO操作时,同时设置完成事件回调,内核完成IO操作后 通知用户(或者就是执行回调)
阻塞、非阻塞:系统调用的实现方法;
两种高性能IO设计方式:
Reactor: libevent、muduo
Preactor:asio、IOCP(windows)