C10K问题到IO模型思考总结

https://blog.csdn.net/wangtaomtk/article/details/51811011

系统调用 ---> 中断机制
BIO:blocking IO
NIO : no blocking IO
多路复用器:select --->poll ---->epoll, cortine

  1. select
    思路:有连接请求抵达了再检查处理。
    问题:句柄上限+重复初始化+逐个排查所有文件句柄状态效率不高。
  2. poll
    poll 主要解决 select 的前两个问题:通过一个 pollfd 数组向内核传递需要关注的事件消除文件句柄上限,同时使用不同字段分别标注关注事件和发生事件,来避免重复初始化。
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  3. epoll
    既然逐个排查所有文件句柄状态效率不高,很自然的,如果调用返回的时候只给应用提供发生了状态变化(很可能是数据 ready)的文件句柄,进行排查的效率不就高多了么。
    epoll 采用了这种设计,适用于大规模的应用场景。
    实验表明,当文件句柄数目超过 10 之后,epoll 性能将优于 select 和 poll;当文件句柄数目达到 10K 的时候,epoll 已经超过 select 和 poll 两个数量级。
    int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
  4. cortine
    应用层和内核层一起做,减少上下文切换损耗

同步、异步:应用程序和内核交互的事件机制;

  • 同步:用户进程触发IO操作并等待或者轮询IO操作是否就绪;
  • 异步:用户进程触发IO操作时,同时设置完成事件回调,内核完成IO操作后 通知用户(或者就是执行回调)

阻塞、非阻塞:系统调用的实现方法;

两种高性能IO设计方式:
Reactor: libevent、muduo
Preactor:asio、IOCP(windows)

你可能感兴趣的:(C10K问题到IO模型思考总结)