I/O多路复用

作者: jdzhangxin | 来源:发表于2017-06-18 08:05 被阅读27次

    背景

    • 阻塞IO操作
      通常IO操作(比如readwrite)都是阻塞I/O的,当调用read时,如果没有数据收到,线程或者进程就会被挂起,直到收到数据。

      阻塞IO.png
      当服务器处理1000个连接,但是只有很少连接执行IO操作,那么需要1000个线程或进程来处理1000个连接,而1000个线程大部分是被挂起的。
    • 线程内存和切换开销
      由于CPU的核数或超线程数一般都不大,比如4,8,16,32,64,128,比如4个核要跑1000个线程,那么每个线程的时间槽非常短,而线程切换非常频繁。

    • 线程是有内存开销的,1个线程可能需要512K(或2M)存放栈,那么1000个线程就要512M(或2G)内存。

    • 线程的切换,或者说上下文切换是有CPU开销的,当大量时间花在上下文切换的时候,分配给真正的操作的CPU就要少很多。


    IO多路复用

    I/O多路复用:多路网络连接复用一个IO线程。

    使用一个线程来检查I/O流(Socket)的就绪状态。通过记录跟踪每个I/O流(Socket)的状态,来同时管理多个I/O流 。

    MUX=multiplexing

    多个Socket复用功能是在内核驱动实现的。

    IO多路复用

    在处理1000个连接时,只需要1个线程监控就绪状态,就绪的连接开一个线程处理就可以了,这样需要的线程数大大减少,减少了内存开销和上下文切换的CPU开销。

    I/O ready 事件的通知是以一个监听集合为单位完成的。multiplex 的是监听集合,并非 I/O 本身。

    select编码流程

    相关文章

      网友评论

        本文标题:I/O多路复用

        本文链接:https://www.haomeiwen.com/subject/sgomzttx.html