ngxin源码学习(一)

ngx_debug_init:
从nginx的main函数进入,首先看到的第一个函数函数是ngx_debug_init(),在ngx_linux_config.h中将它定义为空,所以这个函数是不会执行的,

ngx_strerror_init:
然后是ngx_strerror_init函数,这个函数的作用是初始化ngx_sys_errlist,并将错误号与错误描述符对应放入其中,

ngx_get_options:
然后是ngx_get_option函数,这个函数的作用是取得传给main函数的参数,并根据参数设置全局变量,全局变量包括ngx_show_version,ngx_show_help,ngx_show_configure,ngx_test_config,ngx_quiet_mode,ngx_prefix,ngx_conf_file,ngx_conf_params,ngx_signal,ngx_process,

设置好全局变量后,nginx会根据设置的变量,决定是否显示版本,帮助和配置

ngx_time_init函数:
然后是ngx_time_init函数,在ngx_time_init函数中,首先设置ngx中err_log_time,http_time,http_log_time,http_log_iso8601,syslog_time的长度,

ngx_time_init -> ngx_time_update
    然后调用ngx_time_update函数,ngx会调用ngx_trylock首先判断或者ngx_time_lock是否为0(我认为0代表ngx_timelock没上锁),或者然后会调用一段汇编代码(ngx_atomic_cmp_set):
        cmpxchgq 0, ngx_time_lock
        sete %eax
    ngx_atomic_cmp_set判断ngx_time_lock是否对于0,如果为0,将其置1,也就是上锁,
    然后ngx调用ngx_gettimeofday(就是调用gettimeofday)取得当前时间,
    然后判断当前cached_time与当前时间是否相同,相同则解锁ngx_time_lock并返回,不同则在cached_time数组的下一个位置放入当前时间,
    然后调用ngx_gmtime,计算出sec,min,hour,mday,mon,year,wdays,
    然后调用ngx_localtime,函数ngx_localtime就是对库函数localtime的封装,
    然后ngx会打印err_log_time,http_log_time,http_log_iso8601,syslog_time的时间
    这个时候调用ngx_memory_barrier,这个函数调用:
    __asm_volatile(:::"memory")
    我在网上查到的是告诉编译器,cpu中的register,以及cache中的数据作废
    接下来ngx_time_update函数会重新设定err_log_time,http_time,http_log_time,http_log_iso8601,syslog_time中的值,然后解锁ngx_time_lock

然后nginx会使用memset为init_cycle分配内存空间,并将创建好的log赋值给它,然后调用ngx_create_pool分配内存池

时间: 2024-08-01 17:37:52

ngxin源码学习(一)的相关文章

ngxin源码学习(二):nginx内存池分配机制

main -> ngx_save_argv创造一个包含argc个地址空间的数组ngx_argv,然后为ngx_argv每个地址空间分配argv[i]大小的空间,并将argv[i]拷贝入ngx_argv[i]指向的地址空间 main -> ngx_process_options调用ngx_pnalloc,在内存池中找到一块ngx_prefix大小的空间 onginx内存池分配机制:内存池pool的数据结构中包含两个链表,一个是ngx_pool_t链表(存放一般block),一个是ngx_larg

FireMonkey 源码学习(5)

(5)UpdateCharRec 该函数的源码分析如下: procedure TTextLayoutNG.UpdateCharRec(const ACanvas: TCanvas; NeedBitmap: Boolean; var NewRec: PCharRec; HasItem: Boolean; const CharDic: TCharDic; const AFont: TFont; const Ch: UCS4Char; const NeedPath: Boolean = False);

jquery源码学习

jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jquery-2.0.3的代码结构如下 首先最外层为一个闭包, 代码执行的最后一句为window.$ = window.jquery = jquery 让闭包中的变量暴露倒全局中. 传参传入window是为了便于压缩 传入undefined是为了undifined被修改,他是window的属性,可以被修

Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何实现的. 提前申明,本人是一直搞.net的,对java略为生疏,所以在学习该作品时,会时不时插入对java的学习,到时也会摆一些上来,包括一下设计模式之类的.欢迎高手指正. 整个学习过程,我们主要通过eclipse来学习,之前已经讲过如何在eclipse中搭建调试环境,这里就不多述了. 在之前源码初

HSQLDB源码学习——数据库安装启动及JDBC连接

HSQLDB 是一个轻量级的纯Java开发的开放源代码的关系数据库系统.因为HSQLDB的轻量(占用空间小),使用简单,支持内存运行方式等特点,HSQLDB被广泛用于开发环境和某些中小型系统中. 在http://sourceforge.net/projects/hsqldb/files/下载了HSQLDB 1.8.0版本.把下载的zip文件解压缩至任意目录例如c:\hsqldb1.8便完成安装. hsqldb有四种运行模式: 一.内存(Memory-Only)模式:所有数据都在内存里操作.应用程

lodash源码学习(10)

_.delay(func, wait, [args]) 延迟wait毫秒之后调用该函数,添加的参数为函数调用时的参数 //delay.js var baseDelay = require('./_baseDelay'),//baseDelay方法 baseRest = require('./_baseRest'),//创建使用rest参数方法 toNumber = require('./toNumber');//转化为数字 /** * * @param {Function} func 需要延迟执

lodash源码学习(2)

继续学习lodash,依然是数组的方法 “Array” Methods _.indexOf(array, value, [fromIndex=0]) 获取value在数组 array所在的索引值 使用 SameValueZero方式比较(第一个全等===的元素). 如果 fromIndex 值是负数, 则从array末尾起算 该方法依赖于strictIndexOf和baseIndexOf方法,先看它们的源码 //_strictIndexOf.js /** * _.indexOf的专业版本,对元素

jQuery源码学习感想

还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码,那时我不明白他们为何要求那么高,现在才知道,原来没那么高,他问的都是jQuery最基本的框架架构,不过对于不知道的来说,再简单我也是不知道,那时写了一篇博文去吐槽了一下,那时候也是我自己真正激发自己的时候,那时候我说我一定要搞好自己的jQuery基础,没想到那么快就实现了,一个月的源码学习时间就结束

Redis源码学习-Lua脚本

Redis源码学习-Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开发环境搭建>. 要注意的是:在Cygwin中安装Lua解析器后,SublimeClang插件就能识别出可饮用的Lua头文件了,因为Build System中我们已经配置过"-I", "D:\\cygwin64\\usr\\include",而新安装的Lua头文件会