I/O多路复用

背景

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

    I/O多路复用_第1张图片
    阻塞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流 。

I/O多路复用_第2张图片
MUX=multiplexing

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

I/O多路复用_第3张图片
IO多路复用

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

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

select编码流程

I/O多路复用_第4张图片

你可能感兴趣的:(I/O多路复用)