Nginx多路复用器select、 poll 、 epoll

一、简介

若要理解select、poll与epoll多路复用器的工作原理,就需要首先了解什么是多路复用器。而要了解什么是多路复用器,就需要先了解什么是“多进程/多线程连接处理模型”。

多进程/多线程连接处理模型

在该模型下,一个用户连接请求会由一个内核进程处理,而一个内核进程会创建一个应用程序进程,即app进程来处理该连接请求。应用程序进程在调用IO时,采用的是BIO(blocking I/O,同步并阻塞)通讯方式,即应用程序进程在未获取到IO响应之前是处于阻塞态的。

优点:

1、内核进程不存在app进程的竞争。

缺点:

1、若请求太多,则需要创建很多的app进程

2、一个系统的进程数量是有上限的,所以该模型不能处理高并发情况

3、app进程中使用的用户连接请求数据是复制到内核进程,没有零拷贝,效率低,消耗系统资源

 

扫描二维码关注公众号,回复: 6583830 查看本文章

二、多路复用连接处理模型

在该模型下,只有一个app进程来处理内核进程事务,且app进程一次只能处理一个内核进程事务。故这种模型对于内核进程来说,存在对app进程的竞争。

 

三、多路复用器工作原理

1、select

select多路复用器是采用轮询的方式,一直在轮询所有的相关内核进程,查看它们的进程状态。若已经就绪,则马上将该内核进程放入到就绪队列,该就绪队列底层由数组实现。否则,继续查看下一个内核进程状态。在处理内核进程事务之前,app进程首先会从内核空间中将用户连接请求相关数据复制到用户空间。

优点:

1、app调用IO是非阻塞

缺点:

1、轮询,占用CPU资源以及大多数内核进程处于非就绪状态,有点做无用功。

2、底层数组实现,不适合高并发。

3、复制,用户数据复制到内核空间,没有零拷贝,效率低,消耗系统资源

2、poll

poll多路复用器的工作原理与select几乎相同,不同的是,由于其就绪队列由链表实现,所以,其对于要处理的内核进程数量理论上是没有限制的,即其能够处理的最大并发连接数量是没有限制的(当然,要受限于当前系统中进程可以打开的最大文件描述符数ulimit,后面会讲到)。

优点:

1、链表实现,可以处理高并发。查看系统连接数限制数ulimit -n

2、app调用IO是非阻塞

缺点:

1、轮询,占用CPU资源以及大多数内核进程处于非就绪状态,有点做无用功。

2、复制,用户数据复制到内核空间,没有零拷贝,效率低,消耗系统资源

3、epoll

epoll多路复用是对select与poll的增强与改进。其不再采用轮询方式了,而是采用回调方式实现对内核进程状态的获取:一旦内核进程就绪,其就会回调epoll多路复用器,进入到多路复用器的就绪队列(由链表实现)。所以epoll多路复用模型也称为epoll事件驱动模型。
另外,应用程序所使用的数据,也不再从内核空间复制到用户空间了,而是使用mmap零拷贝机制,大大降低了系统开销。
当内核进程就绪信息通知了epoll多路复用器后,并不是马上对其进行处理,将其立即存放到就绪队列,而是根据不同的处理模型,有不同的处理方式。两种模型:LT模型与ET模型。

  •  LT,Level Trigered,水平触发模型,若没有将其存放到就绪队列,其会一直重试,直到加入到就绪队列,或取消了本次请求。效率低些但请求不丢失。
  •  ET,Edge Trigered,边缘触发模型,若没有将其存放到就绪队列,则直接取消本次请求。所以其会存在请求丢失的情况,但其效率很高。效率高些,但有请求丢失。

优点:

1、采用回调方式,节省CPU资源

2、链表实现,可以处理高并发

3、mmap零拷贝机制,效率高

猜你喜欢

转载自blog.csdn.net/u012965203/article/details/93378890