Nginx学习笔记(一)

**

Nginx进程模型

**
在这里插入图片描述

1. 多进程模型:

  • 进程间相互独立,无需加锁,且互不影响;

  • 一个进程退出了不影响其他的进程运行,降低风险;

  • 当请求到来,多个worker通过竞争accrpt_mutex而获得注册listenfd读事件,在读事件里调用accept接受连接。

2. 异步非阻塞:

  • 处理网络事件与I/O复用相同,同时监控多个事件,当有事件就绪了就去读写;

  • 一个进程同时处理的请求只有一个,在请求间不断切换;

  • 切换是因为异步事件未准备好而主动让出的,类似于循环处理多个准备好的事件,没有任何代价 。

3. 信号:

  • 如果Nginx在等待事件(epoll_wait时),程序收到信号,在信号处理函数处理完成后,epoll_wait会返回错误,然后程序可以再次进入epoll_wait调用。

4. 定时器

  • Nginx借助epoll_wait的超时时间实现定时器;

  • Nginx的定时器事件是放在一颗维护定时器的红黑树里面,每次进入epoll_wait前,先从该红黑树中拿到所有定时器事件的最小时间,在计算出epoll_wait的超时时间后进入epoll_wait;

  • 所以,当没有任何网络事件到来,也没有信号发生时,epoll_wait会超时,即定时器事件到了;

  • 这时Nginx会检查所有的超时事件,将它们状态设置为超时,然后再去处理网络事件。

Nginx事件处理模型(伪代码):

while (true) {
    for t in run_tasks:
        t.handler();
    update_time(&now);
    timeout = ETERNITY;  // 重置超时时间
    for t in wait_tasks: /* sorted already */
        if (t.time <= now) {
            t.timeout_handler(); // 超时
        } else {
            timeout = t.time - now; // 更新超时时间
            break;
        }
    nevents = poll_function(events, timeout); // I/O复用处理事件
    for i in nevents:
        task t;
        if (events[i].type == READ) {
            t.handler = read_handler;
        } else { /* events[i].type == WRITE */
            t.handler = write_handler;
        }
        run_tasks_add(t);
}

Nginx开发从入门到精通:http://tengine.taobao.org/book/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值