白话Nginx的IO模型

本文主要介绍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系统产生了下面五种网络模式的方案。

  • 阻塞 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的时候,肯定会被这几个模型弄懵,对于这些底层知识,我更在乎原理,然后可以复用到以后的编程中。我认为编程思想更重要,而不是上来一大堆专业术语。

希望能帮到初学者,欢迎大佬们来指点。

猜你喜欢

转载自blog.csdn.net/happy_teemo/article/details/114745921