本文主要介绍linux的5种IO模型,已经nginx和apache的IO模型区别。我会尽量用口语化的语言来解释。
纯属个人理解,如果有不对的地方欢迎指正。
针对结论党
首先先说三个名字:
select、poll、epoll
效率:
select < poll < epoll
栗子:
学生做题,老师检查
方案1:老师一个个问 — select
方案2:多个老师 — poll
方案3:学生做完了主动回答。— epoll
显然,方案3效率更高。
Linux的5种IO模型
网络IO的本质是socket的读取,socket在linux系统被抽象为流,IO可以理解为对流的操作。
对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
也就是进程需要等数据。
正式因为这两个阶段,linux系统产生了下面五种网络模式的方案。
扫描二维码关注公众号,回复:
13042382 查看本文章
- 阻塞 I/O(blocking IO)
- 非阻塞 I/O(nonblocking IO)
- I/O 多路复用( IO multiplexing)
- 信号驱动 I/O( signal driven IO)
- 异步 I/O(asynchronous IO)
栗子场景,等快递。
阻塞IO
简单的说,就是死等。
我就站在前台等快递小哥,他不来我不走。
优点:
- 我能最快收到包裹。
- 最简单有效。
缺点:
- 很浪费时间。
非阻塞 I/O
每隔一段时间问一次。中间就低头玩手机或者到处走走。
优点:
- 我有时间干其他事情了。
’缺点:
- 快递小哥到了要等我,而往往他才是最忙的人。
I/O 多路复用
如果加入一个前台,专门收快递,会不会好很多?
这个前台就是复用,一个人干了N个人的事情。
前台也有几种工作模式:
- select:快递来了,我一个个人问,是谁的快递。
- poll:来一个快递,我加一个前台去问。
- epoll:快递上写上电话(回调),快递来了我直接打电话让你来拿。
如果连接数少,前两者的速度可能更快。
但是连接数多了,系统会扛不住,或者说难以分配这么多前台,epoll的优势会瞬间暴增。
这也是nginx牛逼的根本。
异步 I/O
放在前台,你想什么时候拿都可以。
信号驱动式IO
每个人都先来登记,然后写下电话号码,快递到了我根据名字找号码,通知你。
总结
最开始学nginx的时候,肯定会被这几个模型弄懵,对于这些底层知识,我更在乎原理,然后可以复用到以后的编程中。我认为编程思想更重要,而不是上来一大堆专业术语。
希望能帮到初学者,欢迎大佬们来指点。