当前位置: 首页 > news >正文

基础组件之内存池

内存池技术

操作系统在运行进程的过程中,会产生内存碎片,降低了内存的使用率。内存池技术就是为了解决/减少内存碎片的一种方法,内部底层的具体实现根据不同业务场景使用不要的方式,以下是一种好理解的方式,供大家一起学习。

内存碎片

产生的原因&过程

内存碎片分为内部内存碎片和外部内存碎片。我们一般说的内存碎片指的是外部内存碎片。外部内存碎片指的是操作系统连续malloc出来的内存中间有free部分,而这些free出来的部分暂时无法重新被使用。

Linux下运行一个进程的内存分配的过程

在这里插入图片描述
进程运行时,操作系统先将代码和全局数据、静态数据加载到代码段和数据段中;然后开始读取代码一步步执行,遇到局部变量操作系统会在栈中开辟对应的内存空间,遇到malloc申请的内存会在堆中开辟相应大小的空间。

解决方法——内存池技术

链表化

将堆的内存空间分成多段大小相同的内存块,存放在链表结构中:

struct MemNode{void *m_ptr;bool flag;MemNode *next;
}//内存分配的时候
MemNode node= new MemNode;
node.m_ptr = malloc(1024);
node.flag = true;  // 表示该结点被占用
add_node(head, node); //内存释放的时候
node = search(head, ptr);  // 找到释放的node,将标志位置成false
node.flag = false;  // 标志位为false的空间可以被使用

在这里插入图片描述
1、实现原理:将malloc出来的Node放在链表中,并将标志位置成true,释放的时候只需要将标志位置成false。下次再有malloc的时候,会遍历链表找到第一块内存大于需要分配的内存块且标志位为false的node直接使用。
2、解决的问题:
(1)一定程度上减少了操作系统反复malloc/free开辟释放空间;
(2)避免了内存碎片的产生;
3、缺点:
(1)内存没有高效利用;
(2)每次查找需要O(n)的时间复杂度;

2^n分配法 + 红黑树

struct MemNode{void *m_ptr;bool flag;rbTree_node<MemNode> treeNode;MemNode *next;
}struct HeadTable{MemNode *list;int size;
}struct MemTable{HeadTable[6];rbTree<MemNode> tree;
}

在这里插入图片描述
1、实现原理:将malloc出来的Node放在链表中,并将标志位置成true,释放的时候只需要将标志位置成false。下次再有malloc的时候,会遍历链表找到第一块内存大于需要分配的内存块且标志位为false的node直接使用。
2、解决的问题:
(1)一定程度上提高了内存利用率;
(2)红黑树的查找效率为O(logn);也可以使用hash、b树、b+树、skip-table
3、缺点:
(1)极端场景:分配的内存集中在某一个范围,假设一直分配512的大小,那么小的内存都将没有利用到。所有这种场景许哟啊根据实际情况进行2^n的分配和制定。

大内存块向小内存块分离&小内存块向大内存块整合的问题

1、大内存块向小内存块分离
这种场景可以将大内存进行折半分解,比较容易;
2、小内存块向大内存块整合
这种场景不好整合,因为内存的地址可能不连续。所以需要尽量去避免,根据具体的内存使用场景及生命周期采用合理的技术。

相关文章:

基础组件之内存池

内存池技术 操作系统在运行进程的过程中&#xff0c;会产生内存碎片&#xff0c;降低了内存的使用率。内存池技术就是为了解决/减少内存碎片的一种方法&#xff0c;内部底层的具体实现根据不同业务场景使用不要的方式&#xff0c;以下是一种好理解的方式&#xff0c;供大家一起…...

前端面试题--了解并简单介绍一下typescript

前端面试题–了解并简单介绍一下typescript TypeScript是JavaScript的超集&#xff0c;具有可选的类型并可以编译为纯JavaScript。 从技术上讲TypeScript就是具有静态类型的 JavaScript 。 向JavaScript添加静态类型的原因是什么&#xff1f;我想原因至少有三个&#xff1a; …...

【pytorch】ModuleList 与 ModuleDict

ModuleList 与 ModuleDict1、ModuleList2、ModuleDict3、总结1、ModuleList 1&#xff09;ModuleList 接收一个子模块的列表作为输入&#xff0c;然后也可以类似 List 那样进行 append 和 extend 操作: net nn.ModuleList([nn.Linear(784, 256), nn.ReLU()]) net.append(nn.…...

Hive窗口函数语法规则、窗口聚合函数、窗口表达式、窗口排序函数 - ROW NUMBER 、口排序函数 - NTILE、窗口分析函数

Hive窗口函数 文章目录Hive窗口函数语法规则窗口聚合函数窗口表达式窗口排序函数 - ROW NUMBER窗口排序函数 - NTILE窗口分析函数窗口函数也叫开窗函数、OLAP函数其最大特点&#xff1a;输入值是从SELECT语句的结果集中的一行或多行的“窗口”中获取的。如果函数具有OVER子句&a…...

Go设计模式之函数选项模式

目录引入函数选项模式&#xff08;functional options pattern&#xff09;可选参数默认值接口类型版本引入 假设现在需要定义一个包含多个配置项的结构体&#xff0c;具体定义如下&#xff1a; // DoSomethingOption 定义配置项 type DoSomethingOption struct {// a 配置aa…...

ClickHouse 数据类型、函数大小写敏感性

这里写自定义目录标题SELECT *FROM system.data_type_families注意&#xff1a;case_insensitive0 表示大小写敏感。 ClickHouse 的 String 类型、Int 类型、Float 类型、Decimal类型等都是大小写敏感的&#xff08;case_sensitive0&#xff09;。关于ClickHouse大小写敏感&am…...

nodejs基于vue 网上商城购物系统

可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2. 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行…...

掌握MySQL分库分表(一)数据库性能优化思路、分库分表优缺点

文章目录MySQL数据库性能优化思路【面试题】不分库分表软优化硬优化分库分表结论分库分表能解决的问题解决数据库本身瓶颈连接数解决系统本身IO、CPU瓶颈分库分表带来的问题问题⼀ 跨节点数据库Join关联查询问题二 分库操作带来的分布式事务问题问题三 执行的SQL排序、翻页、函…...

何为小亚细亚?

一、小亚细亚安纳托利亚&#xff08;Anatolia&#xff09;&#xff0c;又名小亚细亚或西亚美尼亚&#xff0c;是亚洲西南部的一个半岛&#xff0c;隶属于土耳其。安纳托利亚半岛&#xff0c;北临黑海&#xff0c;西临爱琴海&#xff0c;南濒地中海&#xff0c;东接亚美尼亚高原…...

【mircopython】ESP32配置与烧录版本

下载ESP32的Micropython固件 官方连接https://www.micropython.org/download/esp32/ 看了下描述&#xff0c;上面的是IDF4.x系列编译&#xff0c;下面是IDF3.x系列编译&#xff0c;我们默认选新的 下载安装CP2102驱动 CP210x USB to UART Bridge VCP Drivers - Silicon Labs…...

Yaml:通过extrac进行传参,关联---接口关联封装(基于一个独立YAML的文件)

一&#xff1a;在common包中&#xff0c;封装一个yaml_util的工具包 1. 将获取到的数据&#xff0c;写入到extrac.yaml文件中&#xff0c;通过data def write_extract_yaml(data): 2. 需要用到该参数时&#xff0c;读取extrac.yaml文件中&#xff0c;由于会有多个参数&#x…...

vue - vue中对Vant日历组件(calendar)的二次封装

vue中对vant日历选择器组件实现的的二次封装&#xff1b;主要实现功能如下: 主要功能&#xff1a; 日期区间选择&#xff08;基本&#xff09;&#xff1b;自定义选择器的底部按钮&#xff0c;添加清除时间操作&#xff08;slot插槽&#xff09;&#xff1b;指定默认选中的日期…...

详解C++的类型转换

文章目录前言一、C语言中的类型转换二、为什么C需要四种转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast四、RTTI总结前言 在C语言的类型转换有一个非常大的坑,有好多悄悄地转换,有时候把我们转换的就蒙了,因为C要兼容C语言,所以C就…...

NLP文本自动生成介绍及Char-RNN中文文本自动生成训练demo

前言 文本自动生成是自然语言处理领域的一个重要研究方向&#xff0c;实现文本自动生成也是人工智能走向成熟的一个重要标志。文本自动生成技术极具应用前景。 例如&#xff0c;文本自动生成技术可以应用于智能问答与对话、机器翻译等系统&#xff0c;实现更加智能和自然的人机…...

Teradata 离场,企业数据分析平台如何应对变革?

近日大数据分析和数仓软件巨头 Teradata&#xff08;TD&#xff09;宣布基于中国商业环境的评估&#xff0c;退出在中国的直接运营。TD 是全球最大的专注于大数据分析、数仓和整合营销管理解决方案的供应商之一&#xff0c;其早在 1997 年就进入中国&#xff0c;巅峰期占据半数…...

QWebEngineView-官翻

文章目录特性公共成员函数重实现公共成员函数公有槽函数信号静态公有成员函数保护成员函数重实现保护成员函数额外继承成员详细描述特性文档编制成员函数文档QWebEngineView::**QWebEngineView**([QWidget](../../W/QWidget.md) **parent* Q_NULLPTR)[virtual] QWebEngineView…...

网络安全高级攻击

对分类器的高层次攻击可以分为以下三种类型&#xff1a;对抗性输入&#xff1a;这是专门设计的输入&#xff0c;旨在确保被误分类&#xff0c;以躲避检测。对抗性输入包含专门用来躲避防病毒程序的恶意文档和试图逃避垃圾邮件过滤器的电子邮件。数据中毒攻击&#xff1a;这涉及…...

优思学院:六西格玛中的水平对比方法是什么?

水平对比&#xff0c;就是比较不同事物之间的差异。 这个概念在六西格玛管理中也很重要&#xff0c;也就是我们经常说的标杆管理&#xff0c;经常被用来寻找行业中最好的做法&#xff0c;以帮助组织改进自身的绩效。 在六西格玛管理中&#xff0c;水平对比有三种常见的应用方式…...

UVa 690 Pipeline Scheduling 流水线调度 二进制表示状态 DFS 剪枝

题目链接&#xff1a;Pipeline Scheduling 题目描述&#xff1a; 给定一张5n(1≤n≤20)5\times n(1\le n\le20)5n(1≤n≤20)的资源需求表&#xff0c;第iii行第jjj列的值为’X’表示进程在jjj时刻需要使用使用资源iii&#xff0c;如果为’.则表示不需要使用。你的任务是安排十个…...

【ArcGIS Pro二次开发】(6):工程(Project)的基本操作

在ArcGIS Pro中我们对工程的基本操作一般包括打开、新建、保存等。下面演示在二次开发中如何用代码进行以上操作。 新建一个项目&#xff0c;命名为【ProjectManager】&#xff0c;添加8个按钮&#xff0c;命名为【CreateEmptyProject、CreateProjectByDefault、OpenExProjest…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...