【内存池】——Nginx 内存池结构设计

ops/2024/10/10 23:25:31/

目录

 实现思路——分而治之

Nginx 的内存池结构图 

结构体设计

        内存池设计:

        数据区属性设计:

        大块内存区设计:

 伪代码解释:

数据结构实现


 实现思路——分而治之

        算法结构:链表+顺序表

1、对于每个请求或者连接都会建立相应的内存池,一次申请较大的内存区当作取放的池子。
2、可以直接从内存池中申请所需要的内存,减少了系统调用的次数和时间。
3、不用特意去管内存的释放,当内存池使用完成之后一次性销毁内存池即可。
4、区分大小内存块的申请和释放:
        大于池尺寸的定义为大内存块,使用单独的大内存块链表保存,即时分配和释放。
        小于等于池尺寸的定义为小内存块,直接从预先分配的内存块池中提取。
5、如若不够 就扩充池中的内存,在生命周期内对小块内存不做释放,直到最后统一销毁。

Nginx 的内存池结构图 

 

结构体设计

        内存池设计:

1、数据区

2、大内存区

2、记录最大存储量(固定):判断用大块还是小块内存

3、指向当前使用的内存区地址

        数据区属性设计:

1、内存块可用部分的起始地址

2、这个内存块的结束位置

3、指向下一个内存块的指针

4、申请失败次数

        大块内存区设计:

1、大块内存的起始地址

2、指向下一个大块内存的指针

 伪代码解释:
//第一块:包含大小块、指引信息
struct ngx_pool_t{//数据区-------------------------------------------lagre_next;//大块头节点data_next;//小块头节点current;//当前正在使用的小块内存区max_size;//存储区最大容量限度:(固定)==end-begin};
//链表:其他小块和大块
//采用尾插法
struct ngx_pool_data_t{begin;//不断更新可存区域的起始位置end;//末尾位置next;//下一块内存区failed_count;//申请失败次数:该内存块不满足
};    
//采用头插法
struct ngx_pool_large_t{next;data;
};

数据结构实现


typedef struct ngx_pool_s           ngx_pool_t;
typedef struct ngx_pool_large_s  	ngx_pool_large_t;struct ngx_pool_large_s{ngx_pool_large_t     *next;     // 指向下一块大内存块的指针void                 *alloc;    // 大内存块的起始地址
};typedef struct {u_char               *last;     // 保存当前数据块中内存分配指针的当前位置。每次Nginx程序从内存池中申请内存时,// 从该指针保存的位置开始划分出请求的内存大小,并更新该指针到新的位置。u_char               *end;      // 保存内存块的结束位置ngx_pool_t           *next;     // 内存池由多块内存块组成,指向下一个数据块的位置。ngx_uint_t            failed;   // 当前数据块内存不足引起分配失败的次数
} ngx_pool_data_t;struct ngx_pool_s {ngx_pool_data_t       d;        // 内存池当前的数据区指针的结构体size_t                max;      // 当前数据块最大可分配的内存大小(Bytes)ngx_pool_t           *current;  // 当前正在使用的数据块的指针ngx_pool_large_t     *large;    // pool 中指向大数据块的指针(大数据块是指 size > max 的数据块)};

http://www.ppmy.cn/ops/123702.html

相关文章

设计模式(3)builder

需求: 对于复杂的对象,我们只需要 通过 设置一些参数,就可以得到相对应的 实例。 简单来说, 需求就是用一个类 通过方法返回一个 新建的对象,而且可以通过方法去设置这个对象 public interface CarBuilder {void se…

爬虫prc技术----小红书爬取解决xs

知识星球:知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具知识星球是创作者连接铁杆粉丝,实现知识变现的工具。任何从事创作或艺术的人,例如艺术家、工匠、教师、学术研究、科普等,只要能获得一…

OpenAI .NET 库稳定版发布,支持 GPT-4o 并改进 API 功能

penAI 在6月推出其官方 .NET 库的 beta 版之后,如今终于发布了稳定版。该库已在 NuGet 上作为包发布,支持最新的模型,如 GPT-4o 和 GPT-4o mini,并且提供完整的 OpenAI REST API。这次发布包括同步和异步 API,以及流式…

我对软件工程的理解

1 引言 从事软件行业这么年,写了10年代码,又从事了多年的项目产品方面的工作,一些每天用到的软件工程的方法,虽然天天都在用但一些概念总感觉似是而非,正好借假期的时间,好好整理下,以供自己或…

秋招内推2025-招联金融

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

论文阅读——联邦忘却学习研究综述

文章基本信息 作者: 王鹏飞魏宗正周东生宋威肖蕴明孙庚于硕张强 机构: 大连理工大学计算机科学与技术学院大连理工大学社会计算与认知智能教育部重点实验室大连大学先进设计与智能计算教育部重点实验室美国西北大学计算机科学系吉林大学计算机科学与…

vim(1) -- 环境配置

1. 配置文件 编辑~/.vim/vimrc文件,内容如下。 " 开启语法高亮 syntax on " 显示行号 set number " 显示行下划线 set cursorline set scrolloff5 " 智能缩进 set smartindent " 行太长时换行显示 set wrap" 高亮搜索内容 set hlse…

PHP如何更改要上传的文件大小的最大值

在PHP中,要更改要上传的文件大小的最大值,需要调整一些配置文件和参数。这些参数决定了PHP脚本可以处理的最大文件大小、上传文件的最大大小以及脚本可以使用的最大内存量等。以下是一些详细的步骤和参数解释,帮助你配置PHP以允许更大的文件上…