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.pswp.cn/news/900458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900458.shtml
英文地址,請注明出處:http://en.pswp.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…