nginx中的main函数

1.简介:

这篇文章肯定是未完待续的...因为作者本身也是刚开始看nginx,只能逐步更新了...如果有错误的地方还望诸君海涵并指出。讲解的内容主要是按顺序在main函数中调用的其他函数或者宏的作用,其中定义的一些变量不会赘述,但会提到...

另外每次介绍函数我都会在代码段中添加注释,主要是这个函数所在的文件什么的,还有就是我会先介绍该函数大致干了啥,至于函数中执行的过程因为有些太长了,建议最好自己去看一下。

2.主要内容:

ngx_debug_init();

这句宏应该是用作debug的...不知道有没有啥其他作用,但是因为nginx里面名字特别清楚,所以暂时认定这个是用作debug,另外后续可能存在一些我查找不到的宏定义我直接按照nginx名字含义来解释...如果有新的了解再进行更新。

if (ngx_strerror_init() != NGX_OK) {//<ngx_errno.c>
        return 1;
}

该函数主要是初始化静态指针ngx_sys_errlist,将其作为一个数组首地址利用malloc申请大小为NGX_SYS_NERR * sizeof(ngx_str_t)的内存,存储错误列表,nginx检测的错误都在这了。

(实际上还不就是内核给的errno嘛然后转换成字符串嘛,搞得巨麻烦)

if (ngx_get_options(argc, argv) != NGX_OK) {
        return 1;
}

该函数主要是在将nginx启动的时候传递的那些参数选项存储在nginx.c文件中的全局变量中,以方便之后cycle对象的初始化。(这个没得吐槽的,因为咱还不了解cycle是干啥用的--初步估计是一个全局的配置结构,稀奇古怪的东西巨多)

上图中的参数解释可能有一些问题,如果发现确实存在解释性的问题回头再来更改...

if (ngx_os_init(log) != NGX_OK) {
        return 1;
}

该函数用于得到在当前操作系统下的页大小ngx_pagesize和最大文件描述符ngx_max_sockets,并且检测了当前所使用的CPU并获得L2高速cache的行大小,以此设置了所谓的ngx_cacheline_size的值(32,64,128)。

if (ngx_crc32_table_init() != NGX_OK) {
        return 1;
}

该函数判断当前的ngx_crc32_table_short(这是一个指针指向的是ngx_crc32_c文件中的现有静态表)是否已是根据ngx_cacheline_size内存对齐的,如果不是则重新分配一个循环冗余检验表的内存,并根据上面得到的ngx_cacheline_size进行内存对齐。为什么要这么做呢?我们知道CPU会将那些经常使用的数据放入到cache中,一旦数据命中,比从主存中取的速度快太多,因此如果我们经常使用某些数据,可以让它们根据cache块的大小进行内存对齐,这样使得我们可以将这些数据放入高速cache中,使得它们的命中率更高,访问速度更快。

ngx_slab_sizes_init();

有意思的是,上面所有函数都做了if检查,但是这个函数没有,实际上这个函数仅仅完成了对ngx_slab_max_size,ngx_slab_exact_size的初始化,它们是根据ngx_ox_init()函数中获得的ngx_pagesize(我的系统ubuntu19.04上是4096)来计算的。slab实际上是一种在linux上的内存分配机制,它主要是针对一些经常进行分配和释放的对象,这些对象一般占据的内存很小,如果我们经常释放这些对象很容易就会造成内存碎片(也就是说有些释放的连续内存很小以至于无法进行重复使用),因此如果我们使用一个slab分配器,将其size设定为一个特定的大小,专门对这些小型的对象进行内存方面的管理,那么就会防止出现上述的内存碎片现象了。(slab的介绍有点简单了建议查阅其他资料。。其实我有点好奇,如果这个slab只是在linux使用那么是否nginx做了对其他系统的检测啥的...因为我暂时没看到有..)

if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {
        return 1;
}

未完待续...先搞到这...做其他的去了。。

猜你喜欢

转载自www.cnblogs.com/zhuiyicc/p/11809368.html