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

news2024/10/4 19:18:38

目录

 实现思路——分而治之

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.coloradmin.cn/o/2188550.html

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

相关文章

通信工程学习:什么是IGMP因特网组管理协议

IGMP:因特网组管理协议 IGMP(Internet Group Management Protocol,因特网组管理协议)是TCP/IP协议簇中负责组播成员管理的协议。它主要用于在用户主机和与其直接相连的组播路由器之间建立和维护组播组成员关系。以下是关于IGMP协议…

浙江工业大学《2019年+2023年828自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《浙江工业大学828自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2019年真题 2023年真题 Part1:2019年2023年完整版真题 2019年真题 2023年…

NVIDIA H100 GPU 上的机密计算可实现安全且值得信赖的 AI

NVIDIA H100 GPU 上的机密计算,实现安全可信的 AI 文章目录 前言1. 使用硬件虚拟化的 NVIDIA 机密计算2. 跨硬件、固件和软件保护 AI3. NVIDIA H100 GPU 的硬件安全性4. 在机密计算模式下运行 NVIDIA H100 GPU5. NVIDIA Hopper H100 机密计算为可信 AI 带来的优势6. 虚拟机上基…

68.【C语言】动态内存管理(重点)(1)

本文为数据结构打下基础 备注:数据结构需要掌握指针,结构体和动态内存管理 目录 1.内存开辟的方式 2.malloc函数 cplusplus网翻译 提炼要点 操作内存空间 01.开辟内存空间成功 02.开辟内存空间失败 如果是x64debug环境下,可能会成功 1.内存开辟的方式 01.创建变量 i…

从0到1酒店民宿管理系统

最近几天放假没事做,在家里就像把学过的winform技术整合下,一些用的技术点整理整理。想着做个什么软件那?无意中看到的酒店管理系统给了我思路。为啥不自己做一个那?说做就做。首先技术确定了使用winform为啥不用wpf那&#xff1f…

Linux环境基础开发工具使用(2)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux环境基础开发工具使用(2) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. Li…

微服务_3.微服务保护

文章目录 一、微服务雪崩及解决方法1.1、超时处理1.2、仓壁模式1.3、断路器1.4、限流 二、Sentinel2.1、流量控制2.1.1、普通限流2.1.2、热点参数限流 2.2、线程隔离2.3、熔断降级2.3.1、断路器状态机2.3.2、断路器熔断策略2.3.2.1、慢调用2.3.2.2、异常比例,异常数…

Redis --- 第三讲 --- 通用命令

一、get和set命令 Redis中最核心的两个命令 get 根据key来取value set 把key和value存储进去 redis是按照键值对的方式存储数据的。必须要先进入到redis客户端。 语法 set key value : key和value都是字符串。 对于上述这里的key value 不需要加上引号&#…

GIS发展趋势与国产GIS现状

地理信息系统(GIS)作为获取、管理、分析和可视化地理空间数据的重要工具,在多个领域发挥着至关重要的作用。随着技术的不断进步,GIS正朝着更高效、更智能的方向发展。 GIS发展趋势 1. 3D GIS与虚拟现实(VR&#xff0…

滑动窗口--(上篇)

滑动窗口 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0 。 …

LLM Visualization

Brendan Bycroft的网站,提供了交互式的可视化工具,展示了大型语言模型(LLMs)的内部机制 通过这个 链接 https://bbycroft.net/llm 访问 借助这个交互可视化,能够加深对模型结构和行为的了解

国庆更新|芒果YOLOv8改进181:即插即用,最新注意力机制EMA:具有跨空间学习的高效多尺度注意力模块,ICCASSP论文

💡本篇内容:芒果YOLOv8改进135:最新注意力机制EMA:即插即用,具有跨空间学习的高效多尺度注意力模块,ICCASSP 论文 **EMA|具有跨空间学习的高效多尺度注意力模块 | 即插即用 该模块通常包括多个并行的注意力子模块,每个子模块关注于输入数据的不同尺度或分辨率。这些子模块…

【SpringCloud】优雅实现远程调⽤-OpenFeign

OpenFeign 1. RestTemplate存在问题2. OpenFeign介绍Spring Cloud Feign 3. 代码获取 1. RestTemplate存在问题 观察咱们远程调⽤的代码 RequestMapping("/{orderId}")public OrderInfo getOrderInfoById(PathVariable("orderId") Integer id) {OrderInfo…

Ascend C 自定义算子开发:高效的算子实现

Ascend C 自定义算子开发:高效的算子实现 在 Ascend C 平台上,开发自定义算子能够充分发挥硬件的性能优势,帮助开发者针对不同的应用场景进行优化。本文将以 AddCustom 算子为例,介绍 Ascend C 中自定义算子的开发流程及关键技术…

Java中for循环控制

for循环控制 基本语法说明执行流程注意事项练习 基本语法 for(循环变量初始化;循环条件;循环遍历迭代){循环操作(可以多条语句); }说明 1.for关键字,表示循环控制 2.for有四要素:(1)循环变量初始化 &…

Python+Matplotlib奇偶函数简单示例可视化

偶函数 定义:如果对于定义域内的任意 x,都有 f(-x) f(x),则称 f(x) 为偶函数。 特点:偶函数的图像关于 y 轴对称。 奇函数 定义:如果对于定义域内的任意 x,都有 f(-x) -f(x),则称 f(x) 为奇函…

【计算机网络】详解UDP协议格式特点缓冲区

一、UDP 协议端格式 16 位 UDP 长度, 表示整个数据报(UDP 首部UDP 数据)的最大长度;如果16位UDP检验和出错,报文会被直接丢弃。 1.1、检验和出错的几种常见情况 数据传输过程中的比特翻转:在数据传输过程中,由于物理介质或网络设…

COMSOL金属氢化物吸氢过程膨胀、应力

话不多说,先上效果图。事先说明:由于做吸氢膨胀和应力相关的文献很少,而且文献中很多细节、参数的地方也没怎么说,因此有些地方是笔者按自己理解编的,算是抛砖引玉,希望能给读者带来些许思路启发&#xff0…

【Simulink仿真】混合储能系统光储直流微网下垂控制

摘要 混合储能系统(HESS)结合光伏发电和储能技术,已成为提高直流微网系统稳定性和能效的有效手段。本文基于Simulink平台,仿真研究了光储直流微网中的下垂控制策略。仿真模型涵盖了电池储能和超级电容储能,采用下垂控…

11. 异步编程

计算机的核心部分,即执行构成我们程序的各个步骤的部分,称为处理器。我们迄今为止看到的程序都会让处理器忙个不停,直到它们完成工作。像操作数字的循环这样的程序的执行速度几乎完全取决于计算机处理器和内存的速度。但是,许多程…