nginx aio机制详解

本文详细解析了nginx如何在Linux 2.6以上内核中结合aio和epoll事件模型进行异步I/O操作。通过eventfd对象,当I/O操作完成时,nginx能接收到通知并读取已完成的事件。主要涉及SYS_io_系列系统调用、eventfd的创建与使用,以及nginx关键函数如ngx_epoll_aio_init、ngx_file_aio_read等的实现细节。
摘要由CSDN通过智能技术生成

linux 2.6以上内核提供以下几个系统调用来支持aio:

1、  SYS_io_setup:建立aio 的context

2、  SYS_io_submit: 提交I/O操作请求

3、  SYS_io_getevents:获取已完成的I/O事件

4、  SYS_io_cancel:取消I/O操作请求

5、  SYS_io_destroy:毁销aio的context

 

    nginx中将aio和epoll事件模型(假设nginx使用epoll事件模型)组合起来使用,当请求的I/O操作完成时调用epoll相关函数通知应用程序来读取。组合的关键点在于使用了eventfd对象,那什么是eventfd呢?有关eventfd的详解资料参考http://linux.die.net/man/2/eventfd

 

    nginx在woker工作进程启动后初始化epoll事件模型时初始化aio(ngx_epoll_aio_init函数负责aio的初始化)。实现原理如下:在aio初始化时调用eventfd系统调用创建一个eventfd对象,eventfd系统调用返回一个与eventfd对象关联的文件描述符,设置该描述符为非阻塞并添加到epoll中,当该描述符可读时epoll_wait函数返回调用read函数读取当前完成的I/O操作个数,我们通过调用SYS_io_getevents系统调用就可以获取已完成的I/o事件。但eventfd描述符什么时候可读呢?这需要在提交I/O事件时将eventfd与aio关联起来(实现代码在ngx_file_aio_read函数中),提交I/O事件后如果I/O事件已完成就将当前完成的事件个数写入到eventfd描述符相关的计数器中并标识eventfd可读。下面来看看nginx中与aio相关的源代码:


ngx_epoll_aio_init函数:

static void
ngx_epoll_aio_init(ngx_cycle_t *cycle, ngx_epoll_conf_t *epcf)
{
    int                 n;
    struct epoll_event  ee;

    /***调用eventfd系统调用新建一个eventfd对象,第二个参数中的0表示eventfd的计数器初始值为0,
            系统调用成功返回的是与eventfd对象关联的描述符***/
    ngx_event
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值