Nginx内存池(二)——小块内存分配

news2025/1/20 3:51:54

内存分配源代码:

void *
ngx_palloc(ngx_pool_t *pool, size_t size)
{
#if !(NGX_DEBUG_PALLOC)
    if (size <= pool->max) { // 用内存池分配内存
        return ngx_palloc_small(pool, size, 1);
    }
#endif
    // malloc
    return ngx_palloc_large(pool, size);
}

static ngx_inline void *
ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align)
{
    u_char      *m;
    ngx_pool_t  *p;

    p = pool->current;

    do {
        m = p->d.last; // 内存池可用空间起始地址

        if (align) {
            // 起始地址做对齐,提高CPU访问效率
            m = ngx_align_ptr(m, NGX_ALIGNMENT);
        }
	// 内存池空闲空间大于需要分配的内存大小
        if ((size_t) (p->d.end - m) >= size) {
            p->d.last = m + size;

            return m; // 返回分配的内存的起始地址
        }

        p = p->d.next;  // 到下一个内存池,尝试分配内存

    } while (p);

    return ngx_palloc_block(pool, size);
}

内存分配图示如下

在这里插入图片描述

如果内存池空闲空间大于需要分配的内存大小,则可以直接分配,否则进入到下一个内存池进行分配,若都没有则进入 return ngx_palloc_block(pool, size) 重新创建一个内存池,即:

// 创建一个和pool大小相同的内存池
static void *
ngx_palloc_block(ngx_pool_t *pool, size_t size)
{
    u_char      *m;
    size_t       psize;
    ngx_pool_t  *p, *new;

    psize = (size_t) (pool->d.end - (u_char *) pool);

    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
    if (m == NULL) {
        return NULL;
    }

    new = (ngx_pool_t *) m;

    new->d.end = m + psize;
    new->d.next = NULL;
    new->d.failed = 0;

    m += sizeof(ngx_pool_data_t);
    m = ngx_align_ptr(m, NGX_ALIGNMENT); // 指针对齐加快访问速度
    new->d.last = m + size;

    for (p = pool->current; p->d.next; p = p->d.next) {
        if (p->d.failed++ > 4) { // 分配内存失败次数大于4就将current设置为下一个内存池块(即分配内存的起始内存池)
            pool->current = p->d.next;
        }
    }

    p->d.next = new;

    return m;
}

图示如下

在这里插入图片描述

可以看出除第一个内存池外,后面内存池只需要占额外的ngx_pool_data_t的数据,不需要max, current等成员了

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

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

相关文章

对话风变科技 CTO|从线上教育服务商到教育资源供给平台,风变背后的第二增长曲线思维

Authing 是用户中心团队&#xff0c;我们是业务系统&#xff0c;大家冲刺一个目标、再做合并&#xff0c;然后让基于多租户的 B 端产品成功上线。那个阶段刚好有个客户卡在当时的时间点&#xff0c;一定要赶着上线&#xff0c;最后 Authing 的协作让我们赢得了客户信任&#xf…

基于scrapy+mongodb的校园数据获取

Scrapy以及MongoDB介绍&#xff1a; Scrapy: Scrapy是一个Python编写的开源网络爬虫框架&#xff0c;可以帮助开发人员高效、快速地从互联网上抓取、提取和处理数据。Scrapy拥有强大的可扩展性&#xff0c;可以通过定制管道、中间件和Spider来自定义爬虫行为&#xff0c;同时它…

( 位运算 ) 371. 两整数之和 ——【Leetcode每日一题】

❓371. 两整数之和 难度&#xff1a;中等 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - ​​​​​​​&#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;a 2, b 3 输出…

源码解读guava cache get接口的秘密

guava cache是谷歌开源的一种本地缓存&#xff0c;实现原理类似于ConcurrentHashMap&#xff0c;使用segments分段锁&#xff0c;保证线程安全&#xff0c;支持高并发场景。同时支持多种类型的缓存清理策略&#xff0c;包括基于容量的清理、基于时间的清理、基于引用的清理等。…

WPF基础使用

wpfwindows presentation foundation 官方文档 https://learn.microsoft.com/zh-cn/dotnet/api/?viewnet-7.0 一&#xff1a;WPF窗口设置为透明 在wpf中要将窗口设置为透明&#xff0c;除了将窗口背景色的Alpha分量设置为0以外&#xff0c;你还必须将窗口的AllowsTransparency…

STM32串口编程基础知识讲解

文章目录 前言一、串行通信和并行通信二、全双工&#xff0c;半双工&#xff0c;单工传输三、同步通信和异步通信四、波特率总结 前言 本篇文章给大家介绍一下串口的基础编程知识&#xff0c;这些知识是属于串口的理论知识&#xff0c;在开始学习编写代码的时候必须要掌握这些…

消息队列中间件 - RabbitMQ消息的持久化、确认机制、死信队列

持久化和应答机制Ack 消息队列中间件系列的最后一篇了&#xff0c;RabbitMQ消息的持久化、确认机制、死信队列、负载均衡等一系列进行说明。 消息持久化 当RabbitMq重启以后&#xff0c;未消费的消息&#xff0c;可以在服务重启后继续消费&#xff0c;不会丢失。 应答机制A…

nodejs处理xlsx文件生成json文件

nodejs处理xlsx文件有好几种方式&#xff0c;这里用的是js-xlsx库&#xff1b; 需求 有一个 xlsx 的文件&#xff0c;里面有几个不同的 sheet&#xff0c;需要读取这个表格中不同 sheet 的数据&#xff0c;并且为每个 sheet 生成对应的 json 文件。 例如有一个名为 template…

草根测试员的涨薪之路:我是如何从0到月薪20K的?(仅供借鉴)

我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触多了&#xff0c;吃个饭…

网络安全:Hydra 端口爆破工具.(九头蛇)

网络安全&#xff1a;Hydra 端口爆破工具.&#xff08;九头蛇&#xff09; Hydra 也叫九头蛇&#xff0c;是一款开源的暴力PJ工具&#xff0c;集成在kali当中。可以对多种服务的账号和密码进行爆破&#xff0c;包括 Web 登录、数据库、SSH、FTP 等服务. 目录&#xff1a; 网络…

内网渗透—域防火墙策略同步、不出网隧道上线

内网渗透—域防火墙策略同步、不出网隧道上线 1. 前言2. 域防火墙2.1. 域控开启防火墙同步测试2.1.1. 查看域主机防火墙策略2.1.2. 域控防火墙策略下发同步2.1.2.1. 创建组策略2.1.2.2. 编辑组策略2.1.2.3. 编辑防火墙2.1.2.4. 同步防火墙策略 2.2. 域控出入站规则同步2.2.1. 查…

【数据结构】队列及其实现

目录 &#x1f60e;前言 认识队列 队列的初始化 队列判空 数据队尾入队 数据队头出队 取队头数据 取队尾数据 队列数据的个数 队列销毁 总结 &#x1f60e;前言 上次我们学习了栈及其实现&#xff0c;当然也少不它的好兄弟队列啦&#xff0c;今天我们开始队列的学习队…

大模型Founation Model

一、背景 自从chatgpt&#xff0c;gpt4以特别好的效果冲入人们的视野中&#xff0c;也使得AI产业发生了巨大变革&#xff0c;从17年以来的bert&#xff0c;将AI的各种领域都引入bert类的fine-tune方法&#xff0c;来解决单个领域单个任务的一一个预训练模型。在学术界和工业界…

Redis---事务管道

目录 一、Redis的事务是什么&#xff1f; 1.1 Redis和关系型数据库事务的区别 二、怎么玩Redis事务&#xff1f; 2.1 正常执行&#xff1a; 2.2 放弃事务 2.3 全体连坐 2.4 冤头债主 2.5 watch监控 三、管道 3.1 为什么会引入管道这个概念呢&#xff1f;我们首先来看一…

前后端分离项目部署上线流程-和错误解决

需求&#xff1a;就是想把自己写的前后端项目传上去不再是只有本地可以访问&#xff0c;其他人也可以访问我这个项目&#xff0c;以此记录免得后面搞忘了&#xff0c;文章很长&#xff0c;也很细&#xff0c;我自己上线碰到的错误也会发一下&#xff0c;建议看完哦 1.首先买个…

U盘连接电脑不显示怎么办?

对于很多Windows 11/10/8/7系统下的用户&#xff0c;U 盘、SD卡或其他移动硬盘未检测到或磁盘管理中不显示&#xff0c;这是一个非常普遍的问题。下面我们就来了解一下出现这种情况的常见原因和解决办法。 为什么U盘没有显示在磁盘管理中&#xff1f; U盘在电脑磁盘管理中不显…

GPT专业应用:生成实习报告

正文共 1070 字&#xff0c;阅读大约需要 4 分钟 大学生必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 快速生成实习报告 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由…

旅游网站设计方案

针对涉旅企业的旅游网站设计&#xff0c;主要要考虑以下几点&#xff1a; 1、考虑网站的业务开展需求&#xff0c;能够有效将衣、食、住、行、游、购、娱融合在一起&#xff0c;满足旅游企业的业务开展需求。 2、网站的设计结构&#xff0c;符合目前的网站开发结构&#xff0c;…

vue3鼠标经过显示按钮

在前端开发中&#xff0c;我们经常需要在页面中添加一些交互效果来提升用户体验。其中一个常见的需求就是鼠标经过某个元素时显示一个按钮&#xff0c;这个按钮可以用于触发一些操作或者显示更多的内容。 在本篇文章中&#xff0c;我将会介绍如何使用 Vue3 实现一个鼠标经过显…

七人拼团系统开发模式常见问题详解

七人拼团模式最近在市场上非常火爆&#xff0c;很多企业商家都在用这个模式。但同时也有很多人对这个模式不太了解&#xff0c;纷纷私信问我&#xff0c;今天就在这里简单说一下七人拼团模式的常见问题。 1、什么是七人拼团&#xff1f; 七人拼团就是用户购买专区礼包后&#…