nginx服务(三)_常见驱动模型和进程通信简述

Ngxin常见驱动模型

Nginx⽀持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚⾄是不同的系统版本上⾯
的实现⽅式不尽相同,主要有以下实现⽅式:

1、select:
select库是在linux和windows平台都基本⽀持的 事件驱动模型库,并且在接⼝的定义也基本相同,只是部分参数的
含义略有差异,最⼤并发限制1024,是最早期的事件驱动模型。

2、poll:
在Linux 的基本驱动模型,windows不⽀持此驱动模型,是select的升级版,取消了最⼤的并发限制,在编译nginx
的时候可以使⽤–with-poll_module和–without-poll_module这两个指定是否编译select库。

3、epoll:
epoll是库是Nginx服务器⽀持的最⾼性能的事件驱动库之⼀,是公认的⾮常优秀的事件驱动模型,它和select和
poll有很⼤的区别,epoll是poll的升级版,但是与poll的效率有很⼤的区别.

epoll的处理⽅式是创建⼀个待处理的事件列表,然后把这个列表发给内核,返回的时候在去轮训检查这个表,以判断
事件是否发⽣,epoll⽀持⼀个进程打开的最⼤事件描述符的上限是系统可以打开的⽂件的最⼤数,同时epoll库的IO
效率不随描述符数⽬增加⽽线性下降,因为它只会对内核上报的“活跃”的描述符进⾏操作。

常用模型汇总

\selectpollepoll
操作方式遍历遍历回调
底层实现数组链表哈希表
IO效率每次调用都进行线性遍历,时间复杂度为0(n)每次调用都进行线性遍历,时间复杂度0(n)事件通知方式,每当fd就绪,系统注册的回调函数会被调用,将就绪fd放到rellist里面,时间复杂度0(1)
最大连接数1024(x86)或2048(64)无上限无上限
fd拷贝每次调用select,都需要把fd集合从用户太拷贝到内核态每次调用poll,都需要把fd集合从用户态拷贝到内核态调用epoll_ctl拷贝进内核并保持,之后每次eppoll_wait不拷贝

 

常用的模式汇总对比

⽔平触发-- 多次通知,需要关⼼数据是否取完以避免重复通知,效率较低。
边缘触发-- ⼀次通知,需要关⼼数据是否取⾛以避免数据丢失,效率较⾼
在这里插入图片描述

Select:
POSIX所规定,⽬前⼏乎在所有的平台上⽀持,其良好跨平台⽀持也是它的⼀个优点,本质上是通过设置或者检查存放
fd标志位的数据结构来进⾏下⼀步处理
缺点
1、单个进程能够监视的⽂件描述符的数量存在最⼤限制,在Linux上⼀般为1024,可以通过修改宏定义FD_SETSIZE,再
重新编译内核实现,但是这样也会造成效率的降低
2、单个进程可监视的fd数量被限制,默认是1024,修改此值需要重新编译内核
3、对socket是线性扫描,即采⽤轮询的⽅法,效率较低
4、select 采取了内存拷⻉⽅法来实现内核将 FD 消息通知给⽤⼾空间,这样⼀个⽤来存放⼤量fd的数据结构,这样会
使得⽤⼾空间和内核空间在传递该结构时复制开销⼤

poll:
本质上和select没有区别,它将⽤⼾传⼊的数组拷⻉到内核空间,然后查询每个fd对应的设备状态
其没有最⼤连接数的限制,原因是它是基于链表来存储的
⼤量的fd的数组被整体复制于⽤⼾态和内核地址空间之间,⽽不管这样的复制是不是有意义
poll特点是“⽔平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd

epoll:
在Linux 2.6内核中提出的select和poll的增强版本
⽀持⽔平触发LT和边缘触发ET,最⼤的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知⼀次
使⽤“事件”的就绪通知⽅式,通过epoll_ctl注册fd,⼀旦该fd就绪,内核就会采⽤类似callback的回调机制来激活该fd,epoll_wait便可以收到通知
优点:
1、没有最⼤并发连接的限制:能打开的FD的上限远⼤于1024(1G的内存能监听约10万个端⼝),具体查看/proc/sys/fs/file-max,此值和系统内存⼤⼩相关
2、效率提升:⾮轮询的⽅式,不会随着FD数⽬的增加⽽效率下降;只有活跃可⽤的FD才会调⽤callback函数,即epoll
3、最⼤的优点就在于它只管理“活跃”的连接,⽽跟连接总数⽆关
4、内存拷⻉,利⽤mmap(Memory Mapping)加速与内核空间的消息传递;即epoll使⽤mmap减少复制开销


进程通信
主进程<–>子进程
⼯作进程是有主进程⽣成的,主进程使⽤fork()函数,在Nginx服务器启动过程中主进程根据配置⽂件决定启动⼯作
进程的数量,然后建⽴⼀张全局的⼯作表⽤于存放当前未退出的所有的⼯作进程,主进程⽣成⼯作进程后会将新⽣
的⼯作进程加⼊到⼯作进程表中,并建⽴⼀个单向的管道并将其传递给⼯作进程,该管道与普通的管道不同,它
是由主进程指向⼯作进程的单向通道,包含了主进程向⼯作进程发出的指令、⼯作进程ID、⼯作进程在⼯作进程表
中的索引和必要的⽂件描述符
等信息。 主进程与外界通过信号机制进⾏通信,当接收到需要处理的信号时,它通
过管道向相关的⼯作进程发送正确的指令,每个⼯作进程都有能⼒捕获管道中的可读事件,当管道中有可读事件的
时候,⼯作进程就会从管道中读取并解析指令,然后采取相应的执⾏动作,这样就完成了主进程与⼯作进程的交
互。
在这里插入图片描述
进程<–>进程
⼯作进程之间的通信原理基本上和主进程与⼯作进程之间的通信是⼀样的,只要⼯作进程之间能够取得彼此的信息,建⽴管道即可通信,但是由于⼯作进程之间是完全隔离的,因此⼀个进程想要直到另外⼀个进程的状态信息就只能通过主进程来设置了。

为了实现⼯作进程之间的交互,主进程在⽣成⼯作进程之后,在⼯作进程表中进⾏遍历,将该新进程的ID以及针对该进程建⽴的管道句柄传递给⼯作进程中的其他进程,为⼯作进程之间的通信做准备,当⼯作进程1向⼯作进程2发送指令的时候,⾸先在主进程给它的其他⼯作进程⼯作信息中找到2的进程ID,然后将正确的指令写⼊指向进程2的管道,⼯作进程2捕获到管道中的事件后,解析指令并进⾏相关操作,这样就完成了⼯作进程之间的通信

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值