Xiaopei's DokuWiki

These are the good times in your life,
so put on a smile and it'll be alright

User Tools

Site Tools


it:linux:kernel

Table of Contents

Kernel

IO

  • 同步/异步 X 阻塞/非阻塞

  1. 同步阻塞 IO(blocking IO)
  2. 同步非阻塞 IO(nonblocking IO)
    • 同步非阻塞就是 “每隔一会儿瞄一眼进度条” 的轮询(polling)方式
    • 同步非阻塞方式相比同步阻塞方式:
      • 优点:能够在等待任务完成的时间里干其他活了(包括提交其他任务,也就是 “后台” 可以有多个任务在同时执行)。
      • 缺点:任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。
  3. IO 多路复用( IO multiplexing)
    • 高并发的程序一般使用同步非阻塞方式,而非多线程 + 同步阻塞方式
    • 多路复用和blocking IO其实并没有太大的不同,事实上,还更差一些。因为这里需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection。
    • 所以,如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。
  4. 信号驱动式IO(signal-driven IO)
  5. 异步非阻塞 IO(asynchronous IO)
    • Linux提供了AIO库函数实现异步,但是用的很少
    • 目前有很多开源的异步IO库,例如libevent、libev、libuv

多路复用对比

  • 支持一个进程所能打开的最大连接数
  • FD剧增后带来的IO效率问题
  • 消息传递方式

综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点:

  • 表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。
  • select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善。

参考

it/linux/kernel.txt · Last modified: 2016/09/04 12:02 by admin