怎样理解IO多路复用?

越来越感觉我是入错行了……
看过无数篇讲解IO多路复用的文章,大抵分为两种:
0.一开始就抛出几个抽象的概念,然后一顿讲解;
1.举几个特别生动的例子,很好理解,但是回到现实,还是不懂什么叫多路复用

有没有从具象到抽象的讲解(一定要先具象到实际应用中,毕竟一个复杂的系统或协议,不论内部实现多么抽象,最开始也是要基于具体的实际需求来设计吧)。就拿redis来说,现有两个顺序执行的incrby命令(假设每个命令内部都有3个IO操作:A,B,C),下面哪种猜测更接近实际情况?还是说都是在扯淡。
0.每个命令的执行,通过调度其内部的IO操作,尽量减少系统资源闲置的时间,从而最终使命令更快地执行,比如这里的IO顺序可能是:A1,C1,B1,A2,C2,B2;
1.在执行当前命令的时候,提前执行了下一个命令的部分IO操作,比如第一个incrby的A操作刚被执行完,然后立刻去执行第二个incrby的A操作(如果这样做可以更快的话),那么此时的IO顺序可以是:A1,A2,B1,B2,C1,C2

阅读 5.2k
3 个回答
理解一样事物的最好方法就是知道没有它会多么不方便 --- 沃.兹基硕德

所以,你去尝试不用多路复用去实现一个别人演示多路复用的小例子嘛。

讲下我的理解。
多路复用这个词多出现在网络编程,首先理解多路.
多路:有多个客户端连接,一路就是一个连接
复用:一个进程或线程处理上面所有的连接。如果不复用又需要同时服务多个客户端,需要多线程或多进程,这个就不是复用了

IO多路复用本身就是一个极具专业性的抽象概念。

IO多路复用的概念是Reactor/Preactor模型中才会有的概念.

其意义在于一下几点:

  1. 提供事件注册功能(只关心感兴趣的事件).
  2. 将同步的IO操作改造成异步.

给你一个简单的例子: 有A、B、C三个小伙伴去买咖啡, 但是店员只有一个需要同时服务三个人.

那么IO多路复用与之有什么关系呢?

  1. 当A、B、C三个人进店开始的时候, 就会有门铃开始响动, 店员开始知道有人进来了.
  2. 店员开始招呼客人"欢迎光临". (注册A/B/C的文件描述符事件)
  3. A/B/C 的任何一个人开始与店员开始沟通. (写入数据到对应的文件描述符)
  4. 店员思考并且解答疑问(文件描述符事件回调, 按回调顺序进行处理回应)
  5. (A/B/C)三人离开店铺. (关闭文件描述符/注销事件)

上述步奏会一直在3与4之间徘徊, 直到客人离开就会到达第5步.

IO多路复用的优势在于店员在回答问题的时候会有思考的时间, 并且这个时间会随着问题点难度增加. (CPU密集型计算)

这时候就需要将事件先保存起来, 先回答其它客人简单的问题. 因为这不消耗多少时间 (IO阻塞的IO密集型操作). 最后再来解决困难的问题.

这个动作不一定会立刻执行完毕, 这种没有立马执行完毕就能处理其它文件描述符请求的行为. 我们称之为IO多路复用.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题