Nginx高性能的原因

image.png

1.epoll多路复用

image.png
select模式:server将所有连接存放在缓冲区中,阻塞自身,当这些连接有变化就唤醒自己,遍历这些连接,找到有变化的连接,执行read()。缺点是遍历费时。监听的连接有限制
epoll模型:每个连接都具有回调函数,当变化之后调用变化的连接的回调函数。

select和epoll都是linux里面的,java中只有BIO,NIO,老版本的NIO调用的是select,新版NIO其实就是调用的epoll模型。

2.master worker进程模型

image.png
master和woker进程是父子进程,可以共享内存;worker进程都是单线程
master管理worker进程,worker进程负责处理连接,多个worker进程抢夺一个连接的内存的锁,抢占到了,以后该连接的所有输入数据都由该worker负责;当nginx重启的时候,master进程不挂,而是将原本worker进程的内存分给新的worker进程

3.Nginx的协程模型

是比线程更小的概念,协程 的切换不包含cpu的切换,只包括内存的切换
协程是串行执行,不需要加锁