ngx_os_init

定义在 src\os\unix\ngx_posix_init.c

ngx_int_t
ngx_os_init(ngx_log_t *log)
{ngx_time_t  *tp;ngx_uint_t   n;
#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long         size;
#endif#if (NGX_HAVE_OS_SPECIFIC_INIT)if (ngx_os_specific_init(log) != NGX_OK) {return NGX_ERROR;}
#endifif (ngx_init_setproctitle(log) != NGX_OK) {return NGX_ERROR;}ngx_pagesize = getpagesize();ngx_cacheline_size = NGX_CPU_CACHE_LINE;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);}
#endifif (ngx_ncpu < 1) {ngx_ncpu = 1;}#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);if (size > 0) {ngx_cacheline_size = size;}
#endifngx_cpuinfo();if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {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;
#elsengx_inherited_nonblocking = 0;
#endiftp = ngx_timeofday();srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec);return NGX_OK;
}

初始化操作系统相关的参数和配置,为 Nginx 的运行环境做好准备 


ngx_int_t
ngx_os_init(ngx_log_t *log)
{ngx_time_t  *tp;ngx_uint_t   n;
#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long         size;
#endif

 NGX_HAVE_LEVEL1_DCACHE_LINESIZE=1 


#if (NGX_HAVE_OS_SPECIFIC_INIT)if (ngx_os_specific_init(log) != NGX_OK) {return NGX_ERROR;}
#endif

NGX_HAVE_OS_SPECIFIC_INIT=1


ngx_os_specific_init 

调用特定于操作系统的初始化函数。

如果初始化失败,直接返回 NGX_ERROR


ngx_os_specific_init -CSDN博客


    if (ngx_init_setproctitle(log) != NGX_OK) {return NGX_ERROR;}

ngx_init_setproctitle :初始化进程标题设置功能,允许修改进程的命令行标题(如 ps 命令中显示的内容)

方便管理员通过工具查看 Nginx 进程的状态(如主进程、工作进程等)


ngx_init_setproctitle 

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_setproctitle函数-CSDN博客


    ngx_pagesize = getpagesize();ngx_cacheline_size = NGX_CPU_CACHE_LINE;

getpagesize() :获取系统页面大小(单位为字节),例如 4KB

getpagesize -CSDN博客


ngx_pagesize :全局变量,存储页面大小


ngx_cacheline_size :全局变量,存储 CPU 缓存行大小,默认值为 NGX_CPU_CACHE_LINE


NGX_CPU_CACHE_LINE

定义在 objs/ngx_auto_config.h

#ifndef NGX_CPU_CACHE_LINE
#define NGX_CPU_CACHE_LINE  64
#endif

此时

ngx_pagesize=4096
ngx_cacheline_size=64



for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }
  • for 循环 :计算页面大小的对数(ngx_pagesize_shift),即页面大小是 2 的多少次幂。例如,4KB 的页面大小对应 ngx_pagesize_shift = 12

此时

ngx_pagesize_shift=12


#if (NGX_HAVE_SC_NPROCESSORS_ONLN)if (ngx_ncpu == 0) {ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN);}
#endif

NGX_HAVE_SC_NPROCESSORS_ONLN=1


获取当前系统在线的 CPU 核心数

ngx_ncpu == 0

ngx_ncpu 未设置


sysconf(_SC_NPROCESSORS_ONLN) :获取当前系统在线的 CPU 核心数。

sysconf-CSDN博客
ngx_ncpu :全局变量,存储 CPU 核心数。


此时

ngx_ncpu=0

进入 if 条件

调用 sysconf 后
ngx_ncpu=2



    if (ngx_ncpu < 1) {ngx_ncpu = 1;}

默认值处理 :如果核心数小于 1,则设置为 1(防止异常情况)


此时条件不成立


#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);if (size > 0) {ngx_cacheline_size = size;}
#endif

NGX_HAVE_LEVEL1_DCACHE_LINESIZE=1


  • sysconf(_SC_LEVEL1_DCACHE_LINESIZE) :获取一级缓存行大小。
  • 更新 ngx_cacheline_size :如果获取到的值有效,则更新全局变量。
  • 意图 :缓存行大小影响内存对齐和性能优化,动态获取可以适配不同的硬件架构。

此时

size=64
ngx_cacheline_size=64


ngx_cpuinfo();

ngx_cpuinfo :获取 CPU 的详细信息(如型号、特性等),并存储在全局变量中


Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cpuinfo 函数-CSDN博客


    if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {ngx_log_error(NGX_LOG_ALERT, log, errno,"getrlimit(RLIMIT_NOFILE) failed");return NGX_ERROR;}ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur;
 获取文件描述符数量的限制

getrlimit :获取当前进程的最大文件描述符限制。
rlmt :存储限制值的结构体。
ngx_max_sockets :全局变量,存储最大文件描述符数量。
错误处理 :如果获取失败,记录错误日志并返回 NGX_ERROR。
意图 :文件描述符限制决定了 Nginx 能同时处理的最大连接数,合理设置可以避免资源耗尽。


getrlimit

getrlimit-CSDN博客


此时

ngx_max_sockets=1024


#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4)ngx_inherited_nonblocking = 1;
#elsengx_inherited_nonblocking = 0;
#endif

NGX_HAVE_INHERITED_NONBLOCK=0
NGX_HAVE_ACCEPT4=1


ngx_inherited_nonblocking :全局变量,指示是否支持继承非阻塞套接字。



条件编译 :根据是否支持 NGX_HAVE_INHERITED_NONBLOCK 或 NGX_HAVE_ACCEPT4 设置标志。
意图 :非阻塞套接字是高并发网络编程的基础,确保套接字行为一致。



NGX_HAVE_INHERITED_NONBLOCK
含义 :

表示当前系统是否支持继承非阻塞套接字(Inherited Non-blocking Sockets)。
如果定义了该宏,则表示系统允许父进程创建的套接字在子进程中保持非阻塞状态。
背景 :

在传统的网络编程中,套接字的阻塞或非阻塞状态是由每个进程独立管理的。
如果系统支持继承非阻塞套接字,则父进程设置的非阻塞状态可以直接被子进程继承,而无需额外的系统调用。
优点 :

减少了系统调用的开销,提高了性能。
简化了多进程模型中的套接字管理逻辑。



NGX_HAVE_ACCEPT4
含义 :

表示当前系统是否支持 accept4 系统调用。
accept4 是 Linux 内核 2.6.28 引入的一个扩展版本的 accept 系统调用,允许在接收新连接时直接设置套接字选项(如非阻塞模式)。
背景 :

传统的 accept 系统调用仅返回一个新的套接字文件描述符,但无法直接设置套接字选项。
使用 accept4 可以在接收连接的同时设置套接字为非阻塞模式或其他选项,从而减少额外的系统调用。
优点 :

提高了性能,减少了系统调用次数。
简化了代码逻辑,避免了在 accept 后手动调用 fcntl 或其他函数来设置套接字选项。


    tp = ngx_timeofday();srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec);
  • ngx_timeofday :获取当前时间戳。
  • srandom :设置随机数种子。
  • 种子生成公式 (进程 ID << 16) ^ 当前秒数 ^ 当前毫秒数
  • 意图 :随机数种子用于生成唯一的随机数序列,避免每次运行时生成相同的随机数。

ngx_timeofday-CSDN博客


return NGX_OK;
返回 NGX_OK,代表成功

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深信服护网蓝初面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

游戏引擎学习第206天

回顾并为当天的工作定下目标 接着回顾了前一天的进展。之前我们做了一些调试功能&#xff0c;并且已经完成了一些基础的工作&#xff0c;但是还有一些功能需要继续完善。其中一个目标是能够展示实体数据&#xff0c;以便在开发游戏逻辑系统时&#xff0c;可以清晰地查看和检查…

HTML 表单:构建交互式网页的关键元素

HTML 表单:构建交互式网页的关键元素 引言 HTML表单是构建交互式网页的核心组件之一,它允许用户与网站进行交互,提交信息、填写问卷或进行其他操作。本文将深入探讨HTML表单的基础知识、常用元素、表单验证以及如何优化表单设计,以提高用户体验和网站的可访问性。 HTML表…

Qt音频采集:QAudioInput详解与示例

1. 简介 QAudioInput是Qt Multimedia模块中用于音频采集的核心类&#xff0c;能够从麦克风等输入设备实时获取原始音频数据&#xff08;PCM格式&#xff09;。本文将通过原理讲解和代码示例&#xff0c;帮助开发者快速掌握音频采集的核心技术。 2. 核心功能 支持多种音频格式&…

下载安装Node.js及其他环境

提示&#xff1a;从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm&#xff08;我需要安装&#xff09;安装脚手架安装依赖安装淘宝镜像&#xff08;注意会更新&#xff09;cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…

【后端】ORM / ODM

长期不定期更新&#xff0c;建议关注收藏点赞。 概述 ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;&#xff1a;面向关系型数据库&#xff0c;ORM将对象映射到数据库的表和行&#xff08;例如MySQL、PostgreSQL&#xff09;。ODM&#xff0…

无限滚动(Infinite Scroll)页面谷歌不收录!必须改回分页吗?

近三年&#xff0c;全球超过58%的网站采用无限滚动设计&#xff08;数据来源&#xff1a;PageTraffic 2023&#xff09; 谷歌官方数据显示&#xff0c;动态加载内容的索引失败率高达73%&#xff08;Google Webmaster Report 2022&#xff09;&#xff0c;而采用纯无限滚动的页…

手写JSX实现虚拟DOM

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

网络性能优化参数关系解读 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK

注&#xff1a;本文为 “网路性能优化” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 TCP_NODELAY 详解 lenky0401 发表于 2012-08-25 16:40 在网络拥塞控制领域&#xff0c;Nagle 算法&#xff08;Nagle algorithm&#xff09;是一个非常著名的算法&…

玄机-应急响应-webshell查杀

题目要求&#xff1a; 要求获取四个flag webshell查杀&#xff1a; 常见的webshell&#xff1a; PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode() ASP: Execute(), Eval(), CreateObject() JSP: Runtime.getRuntime().exec() websh…

docker存储卷及dockers容器源码部署httpd

1. COW机制 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本依然存在,只是已经被读写层中该文件…

PyTorch中卷积层torch.nn.Conv2d

在 PyTorch 中&#xff0c;卷积层主要由 torch.nn.Conv1d、torch.nn.Conv2d 和 torch.nn.Conv3d 实现&#xff0c;分别对应一维、二维和三维卷积操作。以下是详细说明&#xff1a; 1. 二维卷积 (Conv2d) - 最常用 import torch.nn as nn# 基本参数 conv nn.Conv2d(in_channe…

从 ZStack 获取物理机与云主机信息并导出 Excel 文件

文章目录 从 ZStack 获取物理机与云主机信息并导出 Excel 文件环境zstack 官网客户端封装讲解 获取物理机信息讲解 获取云主机信息并关联物理机讲解 导出数据到 Excel 文件讲解 运行主程序讲解 总结最终文档效果完整代码 从 ZStack 获取物理机与云主机信息并导出 Excel 文件 在…

5.好事多磨 -- TCP网络连接Ⅱ

前言 第4章节通过回声服务示例讲解了TCP服务器端/客户端的实现方法。但这仅是从编程角度的学习&#xff0c;我们尚未详细讨论TCP的工作原理。因此&#xff0c;将详细讲解TCP中必要的理论知识&#xff0c;还将给出第4章节客户端问题的解决方案。 一、回声客户端完美实现 第4章…

sql server数据库可疑修复

sql server数据库可疑修复 从上图可以看到数据库nchrdb显示可疑&#xff0c;导致原因为NC系统在增加公共薪资项目的时候&#xff0c;扩展字段报错了&#xff0c;第一次遇到这种情况&#xff0c;折腾了很久终于解决&#xff0c;记下解决方案&#xff1a; 1&#xff0c;将SQL数据…

Flutter之页面布局二

目录&#xff1a; 1、列表布局1.1、基础列表1.2、水平滑动的列表1.3、网格列表1.3、不同列表项的列表1.4、包含间隔的列表1.6、长列表 2、滚动2.1、浮动的顶栏2.2、平衡错位滚动 1、列表布局 1.1、基础列表 import package:flutter/material.dart;void main() > runApp(con…

ARM------硬件程序开发

硬件程序开发流程 相关硬件的工作原理 理解硬件的工作原理&#xff0c;明确硬件的功能和用途。 硬件连接 将硬件设备正确连接到开发板上。 编写程序 根据硬件功能编写相应的程序代码。 调试验证 通过调试工具验证程序的正确性&#xff0c;确保硬件功能正常。 控制LED的…

《QT从基础到进阶·七十四》Qt+C++开发一个python编译器,能够编写,运行python程序改进版

1、概述 源码放在文章末尾 根据上一篇文章回顾下利用QtC实现了一个简易的python编译器&#xff0c;类似pycharm或vsCode这样的编译器&#xff0c;该python编译器目前实现了如下功能&#xff1a; &#xff08;1&#xff09;支持编写python程序 &#xff08;2&#xff09;编写代…

Winform MQTT客户端连接方式

项目中使用到Winform的数据转发服务&#xff0c;所以记录下使用到的方法。 一.创建单例模板 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp.Scripts {public class SingleTon&…

Windows强制删除任何你想删除的文件和文件夹

Windows强制删除任何你想删除的文件和文件夹 本教程适用于 Windows 10/11 系统&#xff0c;工具和命令均经过验证。 为什么删除会失败&#xff1f; 权限不足&#xff1a;文件或文件夹可能需要管理员权限才能删除。文件被占用&#xff1a;某个程序正在使用目标文件&#xff0c…