Nginx内存池相关源码剖析(五)重置函数ngx_reset_pool

2024-04-17 02:28

本文主要是介绍Nginx内存池相关源码剖析(五)重置函数ngx_reset_pool,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当内存池中的内存不再需要时,或者当需要重用内存池时,可以使用ngx_reset_pool函数来清理和重置内存池,以便后续再次使用。 

ngx_reset_pool函数

主要作用是将内存池恢复到初始状态,释放已经分配但尚未使用的内存块,并重置内存池的内部状态信息。这样,当再次需要分配内存时,内存池可以从一个干净、一致的状态开始。

在Nginx的源码中,ngx_reset_pool 函数的实现通常涉及以下几个关键步骤:

  1. 清理已分配的内存块:遍历内存池中的小内存块列表并释放。

  2. 重置内部状态信息:将内存池的内部状态信息重置为初始状态。这包括重置内存池的指针、计数器、标志位等,确保内存池处于一个干净、一致的状态。这样,在下次使用内存池时,可以正确地进行内存分配和管理。

  3. 保持必要的配置信息:虽然ngx_reset_pool 函数用于重置内存池的状态,但它通常会保留一些必要的配置信息,如内存池的大小、分配策略等。这些信息在重置过程中不会被改变,以确保在后续的内存分配中能够按照预期进行。

需要注意的是,ngx_reset_pool 函数并不会释放整个内存池所占用的内存空间,只会释放大块内存的空间。它只是清理和重置内存池的内部状态,以便再次使用。如果需要彻底释放内存池所占用的内存空间,通常需要通过其他机制(如调用内存池销毁函数)来实现。

// 小块内存没有free函数,只能重置
void
ngx_reset_pool(ngx_pool_t *pool)
{ngx_pool_t        *p;ngx_pool_large_t  *l;for (l = pool->large; l; l = l->next) { // 重置大块内存if (l->alloc) {// 释放内存但是没有指针置空,保留了存放在小内存块中的头信息节点// 头信息节点将在下面小内存空间中被重置ngx_free(l->alloc);}}// 重置小块内存// 头信息ngx_pool_s 只有第一块有 -- 块信息ngx_pool_data_t  是每个块都有// 原本的原代码如下注释中// 有缺陷,这样会使得除首块(含头信息)的每个块都浪费了ngx_pool_s-ngx_pool_data_t 大小的空间/*for (p = pool; p; p = p->d.next) { // 遍历小块内存p->d.last = (u_char *) p + sizeof(ngx_pool_t); // 每个块都指向除头信息和块信息之外的内存的首地址p->d.failed = 0;}*//// 修改if(p){ // 第一块(有头信息)指向除头信息ngx_pool_s和块信息ngx_pool_data_t 之外的内存的首地址p->d.last = (u_char *) p + sizeof(ngx_pool_t); p->d.failed = 0;// 第一块之后的每个块(无头信息)都指向除块信息ngx_pool_data_t 之外的内存的首地址for(p = p->d.next; p; p = p->d.next){p->d.last = (u_char *) p + sizeof(ngx_pool_data_t); p->d.failed = 0;}}/// 修改pool->current = pool; // 重置头信息pool->chain = NULL;pool->large = NULL; // 完全舍弃已经释放的大内存
}

这篇关于Nginx内存池相关源码剖析(五)重置函数ngx_reset_pool的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910555

相关文章

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚: