Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_pool_t 類型

ngx_pool_t

定義在 src/core/ngx_core.h

typedef struct ngx_pool_s            ngx_pool_t;

ngx_pool_s

定義在 src/core/ngx_palloc.h

struct ngx_pool_s {ngx_pool_data_t       d;size_t                max;ngx_pool_t           *current;ngx_chain_t          *chain;ngx_pool_large_t     *large;ngx_pool_cleanup_t   *cleanup;ngx_log_t            *log;
};

ngx_pool_s 的主要作用是實現一個內存池(memory pool) ,為 Nginx 提供高效、低開銷的內存分配和釋放機制。它的設計目標包括:

  • 減少頻繁調用系統級的內存分配函數(如 mallocfree),從而提高性能。
  • 簡化內存釋放:當內存池不再使用時,只需一次性釋放整個內存池,而不需要逐個釋放每個小塊內存。
  • 支持大塊內存分配(通過 large 字段)和清理回調(通過 cleanup 字段)。

struct ngx_pool_s {ngx_pool_data_t       d;         // 當前內存池的數據塊信息size_t                max;       // 小塊內存的最大分配大小ngx_pool_t           *current;  // 指向當前內存池鏈表中的某個節點ngx_chain_t          *chain;    // 鏈表,用于管理緩沖區鏈ngx_pool_large_t     *large;    // 大塊內存分配鏈表ngx_pool_cleanup_t   *cleanup;  // 清理回調鏈表ngx_log_t            *log;      // 日志對象,用于記錄錯誤信息
};

ngx_pool_data_t

在 src\core\ngx_palloc.h

typedef struct {u_char               *last;u_char               *end;ngx_pool_t           *next;ngx_uint_t            failed;
} ngx_pool_data_t;
  • last: 指向當前內存塊中未分配內存的起始位置。每次分配內存時,從 last 開始分配,并更新 last
  • end: 指向當前內存塊的末尾位置。如果 last 超過 end,表示當前內存塊已滿,需要分配新的內存塊。
  • next: 指向下一個內存塊。Nginx 的內存池是由多個內存塊組成的鏈表。
  • failed: 記錄分配失敗的次數。如果某個內存塊的分配失敗次數過多,Nginx 會跳過該內存塊,直接嘗試分配新的內存塊。

ngx_pool_large_t?

定義在??src\core\ngx_palloc.h

typedef struct ngx_pool_large_s  ngx_pool_large_t;struct ngx_pool_large_s {ngx_pool_large_t     *next;void                 *alloc;
};
  1. next

    • 類型:ngx_pool_large_t *
    • 含義:指向下一個 ngx_pool_large_s 節點的指針。
    • 作用:ngx_pool_large_s 使用單向鏈表的形式組織所有分配的大塊內存。通過 next 指針,可以遍歷整個鏈表,方便管理和釋放這些大塊內存。
  2. alloc

    • 類型:void *
    • 含義:指向實際分配的大塊內存的指針。
    • 作用:alloc 存儲了通過系統調用(如 malloc)分配的大塊內存的地址。Nginx 在需要釋放內存池時,可以通過遍歷鏈表并逐個釋放這些大塊內存。

大塊內存分配流程

當請求的內存超過閾值時:

  1. 調用?ngx_alloc?從系統分配所需內存。
  2. 創建?ngx_pool_large_s?節點,alloc?指向新分配的內存。
  3. 將新節點插入鏈表

內存池結構關系

pool[ngx_pool_t] -->|large| large1[ngx_pool_large_t]large1 -->|next| large2[ngx_pool_large_t]large2 -->|next| large3[ngx_pool_large_t]large3 -->|next| NULLlarge1 --> alloc1[Alloc Memory]large2 --> alloc2[Alloc Memory]large3 --> alloc3[Alloc Memory]

內存池 (ngx_pool_t)
│
├── ... 其他成員 ...
│
└── large → [large_node1] → [large_node2] → ... → NULL│             │              │alloc         alloc          alloc↓             ↓              ↓[Memory1]     [Memory2]      [Memory3]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71466.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣 最長遞增子序列

動態規劃,二分查找。 題目 由題,從數組中找一個最長子序列,不難想到,當這個子序列遞增子序列的數越接近時是越容易拉長的。從dp上看,當遍歷到這個數,會從前面的dp選一個最大的數加上當前數,注意…

Linux | 進程控制(進程終止與進程等待)

文章目錄 Linux | 進程控制 — 進程終止 & 進程等待1、進程終止進程常見退出方法1.1退出碼基本概念獲取退出碼的方式常見退出碼約定使用場景 1.2 strerror函數 & errno宏1.3 _exit函數1.4_exit和exit的區別1.4.1 所屬頭文件與函數原型1.4.2 執行過程差異**結合現象分析…

Android - Handler使用post之后,Runnable沒有執行

問題:子線程創建的Handler。如果 post 之后,在Handler.removeCallbacks(run)移除了,下次再使用Handler.postDelayed(Runnable)接口或者使用post時,Runnable是沒有執行。導致沒有收到消息。 解決辦法:只有主線程創建的…

魚皮面試鴨30天后端面試營

day1 1. MySQL的索引類型有哪些? MySQL里的索引就像是書的目錄,能幫數據庫快速找到你要的數據。以下是各種索引類型的通俗解釋: 按數據結構分 B樹索引:最常用的一種,數據像在一棵樹上分層存放,能快速定位范圍數據…

【核心算法篇十二】《深入解剖DeepSeek多任務學習:共享表示層的24個設計細節與實戰密碼 》

引言:為什么你的模型總在"精神分裂"? 想象你訓練了一個AI實習生: 早上做文本分類時準確率90%下午做實體識別卻把"蘋果"都識別成水果公司晚上做情感分析突然開始輸出亂碼這就是典型的任務沖突災難——模型像被不同任務"五馬分尸"。DeepSeek通…

DeepSeek應用——與PyCharm的配套使用

目錄 一、配置方法 二、使用方法 三、注意事項 1、插件市場無continue插件 2、無結果返回,且在本地模型報錯 記錄自己學習應用DeepSeek的過程,使用的是自己電腦本地部署的私有化蒸餾模型...... (舉一反三,這個不單單是可以用…

2025最新智能優化算法:改進型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23個經典函數測試集,MATLAB

一、改進型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一種新型元啟發式算法,其靈感來源于雪雁的遷徙行為,特別是它們在遷徙過程中形成的獨特“人字形”和“直線”飛行模式。該算法通過模擬雪雁的飛行…

vscode通過ssh連接服務器實現免密登錄+刪除

文章目錄 參考: 1、 vscode通過ssh連接服務器實現免密登錄刪除(吐血總結)

MySQL 主從復制原理及其工作過程

一、MySQL主從復制原理 MySQL 主從復制是一種將數據從一個 MySQL 數據庫服務器(主服務器,Master)復制到一個或多個 MySQL 數據庫服務器(從服務器,Slave)的技術。以下簡述其原理,主要包含三個核…

【趙渝強老師】Spark RDD的緩存機制

Spark RDD通過persist方法或cache方法可以將計算結果的緩存,但是并不是這兩個方法被調用時立即緩存,而是觸發后面的action時,該RDD才會被緩存在計算節點的內存中并供后面重用。下面是persist方法或cache方法的函數定義: def pers…

設計模式相關知識點

目錄 設計模式 設計模式 代碼設計原則 設計模式 設計模式 干掉if...else,最好用的3種設計模式! | 小傅哥 bugstack 蟲洞棧 代碼設計原則-CSDN博客 23種設計模式-CSDN博客 策略模式(Strategy Pattern)-CSDN博客 責任鏈模式…

ShenNiusModularity項目源碼學習(9:項目結構)

ShenNiusModularity源碼主要有11個project(其實還有officialweb、test兩個文件夾,大致有4、5個project,但看著跟主要項目代碼沒太大關系,暫時不管),這11個project的依賴關系如下圖所示,其中最下…

ubuntu22.4搭建單節點es8.1

下載對應的包 elasticsearch-8.1.1-linux-x86_64.tar.gz 創建es租戶 groupadd elasticsearc useradd elasticsearch -g elasticsearch -p elasticsearch chmod uw /etc/sudoers chmod -R elasticsearch:elasticsearch elasticsearch 修改配置文件 vim /etc/sysctl.conf vm…

Docker 部署 ollama + DeepSeek

拉取并運行 Ollama Docker 鏡像 使用以下命令從 Docker Hub 拉取 Ollama 鏡像并運行容器: docker run -d -p 11434:11434 --name ollama ollama/ollama -d:以守護進程模式運行容器,即讓容器在后臺運行。-p 11434:11434:將容器內…

解決DeepSeek服務器繁忙的有效方法

全球42%的企業遭遇過AI工具服務器過載導致內容生產中斷(數據來源:Gartner 2025)。當競品在凌晨3點自動發布「智能家居安裝指南」時,你的團隊可能正因DeepSeek服務器繁忙錯失「凈水器保養教程」的流量黃金期?。147SEO智能調度系統…

Discuz! X3.5 根目錄權限設置

在 Discuz! X3.5 中,根目錄的權限設置是確保網站安全性和功能正常運行的關鍵。如果權限設置不當,可能會導致文件無法訪問、安全問題(如文件被篡改)或功能異常。以下是關于 Discuz! X3.5 根目錄權限設置的詳細說明和建議: 1. 根目錄位置 Discuz! X3.5 的根目錄通常是網站的…

【C++八股】內存對?

內存對齊是指編譯器按照特定規則安排數據在內存中的存儲位置,以提高程序的執行效率和可移植性。 內存對齊的原因: 1. 性能優化: 現代處理器通常要求數據在內存中按照特定的邊界對齊,以提高內存訪問效率。 如果數據未對齊&#x…

【有啥問啥】DeepSeek 技術原理詳解

DeepSeek 技術原理詳解 DeepSeek 是一款具有突破性技術的大型語言模型,其背后的技術原理涵蓋了多個方面,以下是對其主要技術原理的詳細介紹: 架構創新 多頭潛在注意力機制(MLA) 傳送門鏈接: DeepSeek V3中的Multi-…

ML.NET庫學習008:使用ML.NET進行心臟疾病預測模型開發

文章目錄 ML.NET庫學習008:使用ML.NET進行心臟疾病預測模型開發1. 項目主要目的和原理2. 項目概述實現的主要功能:主要流程步驟:關鍵技術: 3. 主要功能和步驟數據加載與路徑處理模型訓練與評估模型保存與加載 4. 代碼中的數據結構…

FFmpeg 全面知識大綱梳理

1. FFmpeg 簡介 FFmpeg 是什么: 一個開源的多媒體處理框架,用于處理音頻、視頻和流媒體。支持多種格式和編解碼器。提供命令行工具和庫(如 libavcodec, libavformat, libavfilter 等)。主要功能: 格式轉換編解碼流媒體處理音視頻剪輯、合并、分離添加濾鏡、特效壓縮與優化…