IO模型

2022/2/3 IO模型

借用知乎用于levin的回答,对各种模型讲个故事,描述下各个IO模型的区别:

故事情节为:老李去买火车票,三天后买到一张退票。参演人员(老李,黄牛,售票员,快递员),往返车站耗费1小时。

# 1. 阻塞I/O模型

老李去火车站买票,排队三天买到一张退票。

耗费:在车站吃喝拉撒睡 3天,其他事一件没干。

# 2. 非阻塞I/O模型

老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。

耗费:往返车站6次,路上6小时,其他时间做了好多事。

# 3. I/O复用模型

  • select/poll(有selector选择器,去轮询选择器)

老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次

  • epoll(事件回调)

老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话

# 4. 信号驱动I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话

# 5. 异步I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。

耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话

# 总结

1同2的区别是:自己轮询

2同3的区别是:委托黄牛

3同4的区别是:电话代替黄牛

4同5的区别是:电话通知是自取还是送票上门

  • 阻塞I/O模型:单线程一直阻塞直到事件发生才处理,期间干不了其他事情

  • 非阻塞I/O模型:while(true) 不断循环看有没有事件发生才处理,期间可以干其他事情,但是需要自己不断的去监测

  • I/O复用模型:基于事件驱动(类似与页面的一个button一个事件),有事件发生才处理,期间可以干其他事情,可以理解有一个中间人selector替我们监听, 有事件后通知我们去处理

同步阻塞IO 伪异步IO NIO AIO
客户端数目 :IO线程 1 : 1 m : n m : 1 m : 0
IO模型 同步阻塞IO 同步阻塞IO 同步非阻塞IO 异步非阻塞IO
吞吐量
编程复杂度 简单 简单 非常复杂 复杂

# 其他参考

此生不换
青鸟飞鱼