博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx源码分析(6)
阅读量:6191 次
发布时间:2019-06-21

本文共 1863 字,大约阅读时间需要 6 分钟。

  hot3.png

Nginx具有一系列的模块,包括HTTP模块,核心模块和mail模块等。简要分析一下一些具有代表性模块的原理。

event模块

event模块的主要功能是监听accept后建立的连接,对读写事件进行添加删除。事件处理模型和Nginx的非阻塞IO模型结合在一起使用。当IO可读可写的时候,相应的读写时间就会被唤醒,此时就会去处理事件的回调函数。

对于Linux,Nginx使用的是epollepollpoolselect的增强版本。

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符(fd),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

所以epoll本质是同步IO + 阻塞的。

select模型的调用流程如下:

输入图片说明

epoll对select模型和poll模型有诸多改进。

select用O(n)的效率不断地去查看那些fd,效率太低。而epoll通过在内核中提供callback机制的方式,在内部使用链表把O(n)降到了O(1),讨论参见。

我们看看怎么实现callback机制的。

输入图片说明

当为一个用户建立一个socket连接时,调用epoll的current进程会加入到驱动的wait_queue中。当其它用户连接时,进行同样的处理。所以current进程在所有驱动的等待队列中。

当IO没有就绪,调用read函数会阻塞在这一步。一旦只要有一个用户连接的IO就绪,current进程就会被唤醒。

与select相比,epoll加入了callback这个hock,记录了这个唤醒者,避免了在current进程醒着的时候查询到底是谁唤醒了我。

##timer模块 先看一段代码,timer什么时候起作用。

void Request::run(){    keep_alive_timer = new QTimer();    if (s_keep_alive_enable)    {        keep_alive = s_keep_alive_default;        keep_alive_timeout = s_keep_alive_timeout * 1000;// the wait time        connect(keep_alive_timer, SIGNAL(timeout()), this, SLOT(onTimeout()));        keep_alive_timer->setSingleShot(true);        keep_alive_timer->setInterval(keep_alive_timeout);        keep_alive_timer->start();    }    //a new thread    socket = new QTcpSocket();    if (!socket->setSocketDescriptor(socketDescriptor))        return;    connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()), Qt::DirectConnection);    connect(socket, SIGNAL(disconnected()), this, SLOT(onDisconnected()), Qt::DirectConnection);    exec();}

代码出自一个简单的。它新建了一个定时器,然后计算自连接开始后的时间。主要用来判断连接是否timeout。

Nginx使用红黑树来构造定时器。定时器的机制就是,二叉树的值是其超时时间,每次查找二叉树的最小值,如果最小值已经过期,就删除该节点,然后继续查找,直到所有超时节点都被删除。我们知道,自平衡二叉搜索树rbtree的树节点中,最左边叶子节点(或根节点)所代表的那个定时器的超时时间是最小的,因此只需要O(1)时间删除它就可以。

输入图片说明

##参考

转载于:https://my.oschina.net/lvyi/blog/424367

你可能感兴趣的文章
日本一名高龄男子开车冲上人行道 造成共7人受伤
查看>>
[贝聊科技]谈谈 iOS 如何动态切换 APP 的主题
查看>>
如何克服解决Git冲突的恐惧症?(序)
查看>>
阿武老师百搭傲娇句式
查看>>
LaTeX模板(二)
查看>>
提高开发效率之VS Code基础配置篇
查看>>
【火炉炼AI】机器学习053-数据降维绝招-PCA和核PCA
查看>>
人人都能学会的python编程教程8:条件判断与循环
查看>>
一篇文章告诉你React里为什么不能用index作为key
查看>>
2019互联网校招薪资表: BAT、华为还没有TMD高
查看>>
原生 js 实现移动端 Touch 滑动反弹
查看>>
use Google search engine
查看>>
React-flux杂记
查看>>
工程优化暨babel升级小记
查看>>
理清楚Vue的结构
查看>>
TypeScript实现数据结构(一)栈,队列,链表
查看>>
Javascript 原型链
查看>>
PAT A1120
查看>>
Java到底能干嘛?
查看>>
extract-text-webpack-plugin用法
查看>>