Chinaunix首页 | 论坛 | 博客
  • 博客访问: 443769
  • 博文数量: 138
  • 博客积分: 4114
  • 博客等级: 上校
  • 技术积分: 1341
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-14 20:41
文章分类

全部博文(138)

文章存档

2014年(1)

2013年(2)

2012年(78)

2011年(13)

2010年(34)

2009年(10)

我的朋友

分类: LINUX

2012-04-03 09:52:21

本文是关于nginx 在linux中的IO的,关于其它系统的IO请自行参阅源文件
首先要解决的nginx的io在哪里定义

  1. // ngx_connection.c
  2. ngx_os_io_t ngx_io;
这里附上ngx_os_io_t的声明

  1. typedef struct {
  2.       ngx_recv_pt recv;
  3.       ngx_recv_chain_pt recv_chain;
  4.       ngx_recv_pt udp_recv;
  5.       ngx_send_pt send;
  6.       ngx_send_chain_pt send_chain;
  7.       ngx_uint_t flags;
  8.   } ngx_os_io_t;
另外 在ngx_event.h 可以看到一下源码

  1. extern ngx_os_io_t ngx_io;
  2. #define ngx_recv ngx_io.rev
  3. #define ngx_recv_chain ngx_io.recv_chain
  4. #define ngx_udp_recv ngx_io.udp_recv
  5. #define ngx_send ngx_io.send
  6. #define ngx_send_chain ngx_io.send_chain
看到这里,我们从变量的名字定义就可以看到,这里还没有涉及到nginx到底用什么io
因为io是os相关的,不同的os系统上用的不一样,如 freebsd上于solaris 就不一样,更
别说windows了
在 ngx_epoll_module.c中 由以下源码

  1. ngx_io=ngx_os_io;
从这个语句可以看出以下几点
1)ngx_os_io变量的类型是 ngx_os_os_t类型
2)ngx_os_io应该是具体os实现的io,这样通过变量赋值,在不同的os
上把不同的io实现编译进去,相当于抽象出来一层,这样,在不同的os
上开发模块就只要关心ngx_io就可以了,不必关心具体的下部是如何实现这个
io的

到这里我们应该对nginx的io有个大概印象了把,
这里你可以看一下你的os上的nginx都编译进去了哪些(在obj 下有Makefile文件)



可以看到我的os上是把有关linux的io函数编译进去了,应为我的os就是linux的嘛


好了,到这里我们在往下深入以下,去看以下,这个nginx_os_io
发现其定义在 ngx_posix_init.c中,等一等,posix,这个你看着不眼熟嘛?


  1. ngx_os_io_t ngx_os_io = {
  2.    ngx_unix_recv,
  3.    ngx_readv_chain,
  4.    ngx_udp_unix_recv,
  5.    ngx_unix_send,
  6.    ngx_writev_chain,
  7.    0
  8. };
posix 的意思是这样的
Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。

上面说过,我的os是linux,而在linux上io实现是这样子的
在 ngx_linux_init.c中,可以看到

  1. static ngx_os_io_t ngx_linux_io = {
  2.        ngx_unix_rev,
  3.        ngx_readv_chain,
  4.        ngx_udp_unix_recv,
  5.        ngx_unix_send,
  6.     #if (NGX_HAVE_SENDFILE)
  7.        ngx_linux_sendfile_chain,
  8.        NGX_IO_SENDFILE,
  9.     #else
  10.       ngx_write_chain,
  11.       0
  12.     #endif
  13.     };

而最关键的一句是这一句

  1. ngx_os_io = ngx_linux_io;
如果这句代码能看明白,那么上面所有写的就不用看了

这里总结以下,nginx io实际上是分了三层来写
第一层 
ngx_os_io_t  ngx_io;

第二层
ngx_io = ngx_os_io;

第三层
ngx_os_io = ngx_linux_io;

代码写的干净利落,赞一下

至于io的函数具体实现留作下次在分析










阅读(1029) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~