nginx使用的文件异步io的基于linux内核的,而并不是glibc库提供的。glibc通过的异步io是基于多线程实现的,并不是真正意义上的异步io。nginx只是在读文件时使用了异步io。那么有的童鞋就会问:那nginx为什么在写文件时不使用异步io?原因是这样的:linux内核的文件异步io是不支持缓存操作的,而正常的写入文件时往往是写入内存中就立刻返回,这样效率就比较高,而使用异步io写入速度就会明显下降。
linux内核提供了5个系统调用完成文件操作的异步io,可以把这5个系统调用来相对epoll的系统调用来描述
io_setup epoll_create
io_setup会初始化异步io上下文(aio_context_t),这个描述符和epoll_create返回的描述符类似。
io_submit/io_cancel epoll_ctl
io_submit相当于向异步io添加事件,而io_cancel就是删除事件。这两个函数用到了iocb这个结构体:
struct iocb{
/*存储业务需要的指针,例如ngx_event_t事件的指针*/
u_int64_t aio_data;
/*操作码,取值范围是io_iocb_cmd_t中的枚举命令*/
u_int16_t aio_lio_opcode;
/*请求的优先级*/
int16_t aio_reqprio
/*文件描述符*/
u_int32_t aio_fildes;
/*读、写操作对应的用户态缓冲区*/
u_int64_t aio_buf;
/*文件中的偏移量*/
int_64_t aio_offset;
/*表示可以设置为IOCB_FLAG_RESFD,它会告诉内核当有异步io请