ngx_os_init函数定义在src/os/unix/ngx_os.h, os/unix/ngx_posix_init.c, 主要初始化操作系统级的资源限制到一些全局的变量中, 比如ngx_pagesize, ngx_cacheline_size, ngx_max_sockets, ngx_inherited_nonblocking等。 源代码如下:
ngx_int_t
ngx_os_init(ngx_log_t *log)
{
ngx_uint_t n;
#if (NGX_HAVE_OS_SPECIFIC_INIT)
if (ngx_os_specific_init(log) != NGX_OK) { // OS特定的初始化
return NGX_ERROR;
}
#endif
ngx_init_setproctitle(log); //
ngx_pagesize = getpagesize(); // nginx pagesize的设置
ngx_cacheline_size = NGX_CPU_CACHE_LINE; // nginx缓存行尺寸的设置
for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }
#if (NGX_HAVE_SC_NPROCESSORS_ONLN)
if (ngx_ncpu == 0) {
ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN);
}
#endif
if (ngx_ncpu < 1) {
ngx_ncpu = 1;
}
ngx_cpuinfo(); // 该函数实际上也是设置 ngx_cacheline_size的值
if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { // 获取资源限制数据, 为后面的ngx_max_sockets做初始化。
ngx_log_error(NGX_LOG_ALERT, log, errno,
"getrlimit(RLIMIT_NOFILE) failed)");
return NGX_ERROR;
}
ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur;
#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4)
ngx_inherited_nonblocking = 1;
#else
ngx_inherited_nonblocking = 0;
#endif
srandom(ngx_time()); // 设置random函数的种子
return NGX_OK;
}