内存分配器

实现分配器需要考虑的问题

  • 空闲块的组织方式:如何记录现有的空闲块
  • 空闲块的选择:如何选择一个合适的空闲块
  • 空闲块的分割:选择了一个合适的空闲块后如何处理空闲块内部的剩余部分
  • 空闲块的合并:如何处理一个刚刚被释放的块?

隐式空闲链表

块的结构

块的结构

 块的头部编码了块的大小以及块是否分配,因此空闲块可以通过头部中的大小字段隐含的连接着,我们称这种结构为隐式空闲链表

优缺点

  • 简单
  • 性能差

任何操作的开销都要求对链表进行搜索,其搜索时间和链表中的空闲块和已分配块的和呈线性相关。

如何选择空闲块

  • 首次适配:从头开始搜索选择第一个满足大小的块
  • 下一次适配:从上一次查询开始选择第一个的块
  • 最佳适配:选择适合请求的最小的块

各有优缺点,需要结合自己程序的分配块的大小区间和每个大小的频率来判断孰优孰劣。

分割

选择一整块或者将一块大小进行切割,如何选择块的策略很好的话,产生部分小的内部碎片也是可以接受的,这个时候就不需要进行分割。如果选择的块很不匹配的话就会产生很大的内部碎片,这个时候选择切割就会更好一些,分割后剩余的块就是一个新的空闲块了。

合并

当分配器释放的块,其邻接的部分正好也是一个空闲块。这个时候就可能产生很多小的,但是无法满足请求的空闲块,也称为假碎片。所以就要求适配器能够合并邻接的空闲块来消除加碎片问题,提高内存的使用率。

带边界标志的合并

回顾一下之前的隐式空闲链表,当我们释放一块之后,我们是没办法知道前面一个块的大小的,同时也是无法知道其是否空闲,因此我需要这样的一个信息,某人提出了一个通用的边界标识技术

 在每个块的头部和尾部添加同样的标识信息。这样任何一个块都能找到其相邻的空闲块,合并相邻的块也十分简单,只需要改变块大小就可以了。

因为内存资源比较紧张,而且已分配的块是不需要进行合并的,所以已分配的块不需要尾部,只需要一个状态位就好。但是空闲块还是需要尾部标识的。

分离的空闲链表

一种比较高效的减少分配时间的方法,通常称为分离存储,就是维护多个空闲链表,其中每个块有大致相等的大小。

简单分离存储

每个空闲链表包含大小相等的空闲块,如果用户申请一个指定大小的块,通过检查相应的空闲链表,直接分配第一个空闲块即可,因此分配和是释放块都能达到常数时间。 

因为链表中都是大小相等的块,不需要合并,所以不需要脚部信息,一个已分配块的地址也可以通过大小推断出来,所以已分配块的头部也不需要

分离适配

STL的分配器

C语言库中提供的GNU malloc就是采用的这种方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python sqlalchemy使用

基本结构 #!/usr/bin/python3 # -*- coding:utf-8 -*- """ author: JHC file: base_db.py time: 2023/6/19 21:34 desc: """ from sqlalchemy import create_engine,text from sqlalchemy.orm import sessionmaker,scoped_session from contex…

计算机服务器中了Mallox勒索病毒怎么解密,Mallox勒索病毒解密步骤

计算机网络技术的不断发展与应用,为企业的生产运营提供了坚实的基础,大大提高了企业的生产与工作效率,但随之而来的网络安全威胁也在不断增加。在本月,云天数据恢复中心接到了很多企业的求助,企业的计算机服务器遭到了…

Nacos源码解读12——Nacos中长连接的实现

短连接 VS 长连接 什么是短连接 客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。 长连接 客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立…

数理统计基础:参数估计与假设检验

在学习机器学习的过程中,我充分感受到概率与统计知识的重要性,熟悉相关概念思想对理解各种人工智能算法非常有意义,从而做到知其所以然。因此打算写这篇笔记,先好好梳理一下参数估计与假设检验的相关内容。 1 总体梳理 先从整体结…

【Spring 基础】00 入门指南

【Spring 基础】00 入门指南 文章目录 【Spring 基础】00 入门指南1.简介2.概念1)控制反转(IoC)2)依赖注入(DI) 3.核心模块1)Spring Core2)Spring AOP3)Spring MVC4&…

用python 网络自动化统计交换机有多少端口UP

用python统计交换机有多少端口UP 用python统计交换机有多少端口UP,可以间接的反馈有多少个用户在线。我们使用上次的脚本将可达的网络设备ip统计到reachable_ip.txt中,这次我们使用reachable_ip.txt来登陆设备来统计多少端口是UP的 云配置 拓扑 交换机…

ModuleNotFoundError: No module named ‘docx‘

ModuleNotFoundError: No module named ‘docx’ 文章目录 ModuleNotFoundError: No module named docx背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时,报错: Traceback (most recent call last): Fi…

循环依赖:解析软件设计的迷局

目录 引言 循环依赖的本质 影响与挑战 1. 编译和构建问题 2. 耦合度增加 3. 难以进行单元测试 4. 可扩展性降低 解决循环依赖的策略 1. 模块重构 2. 引入接口抽象 3. 依赖注入 4. 模块化与分层设计 5. 使用工具进行分析 实际案例:Spring框架的循环依赖…

Redis高效恢复策略:内存快照与AOF

第1章:Redis宕机恢复的重要性和挑战 大家好,我是小黑。今天咱们来聊聊Redis宕机后的恢复策略。想象一下,你的网站突然宕机了,所有的数据都飘了,这种情况下,快速恢复数据就显得尤为重要。Redis作为一个高性…

令牌桶算法理解学习(限流算法)

令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。 用简单的话语来说就是限制…

研表究明,文字的序顺并不定一能响影GPT-4读阅

深度学习自然语言处理 原创作者:yy 很多年前,你一定在互联网上看过这张图,展示了人脑能够阅读和理解打乱顺序的单词和句子!而最近东京大学的研究发现,大语言模型(LLMs) 尤其是 GPT-4&#xff0c…

STM32 标准外设SPL库、硬件抽象层HAL库、低层LL库区别?

1、STM32 之一 HAL库、标准外设库、LL库_ZCShou的博客-CSDN博客_ll库(仔细阅读) 2、STM32标准外设库、 HAL库、LL库 - King先生 - 博客园 3、STM32 之 HAL库_戈 扬的博客(仔细阅读) 4、STM32 LL 为什么比 HAL 高效&#xff1…

文档或书籍扫描为 PDF:ScanPapyrus Crack

ScanPapyrus 可让您快速轻松地将文档或书籍扫描为 PDF,批处理模式使扫描过程快速高效,自动处理书籍并将其拆分为单独的页面 用于快速扫描文档、书籍或打印照片的扫描仪软件 快速扫描文档 使用此扫描仪软件,您无需在扫描仪和计算机之间来回移动…

架构LNMP

目录 1.安装Nginx服务 2.安装 MySQL 服务 3.安装配置 PHP 解析环境 4.部署 Discuz!社区论坛 Web 应用 1.安装Nginx服务 实验准备 systemctl stop firewalld systemctl disable firewalld setenforce 0 安装依赖包 yum -y install pcre-devel zlib-devel gcc…

【Python】Selenium自动化测试框架

设计思路 本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享。 框架采用python3 selenium3 PO yaml ddt unittest等技术编写成基础测试框架,能适应日常测试工作需要。 1、使用Page Object模式将页面定位和业务操作分开&#xff0…

Gilisoft Video Editor——迈出剪辑的第一步

今天博主分享的是又一款剪辑软件——视频剪辑手(GiliSoft Video Editor),对剪辑视频感兴趣的小伙伴千万不要错过。这是一款专门用于视频剪辑的软件,功能比较简单,相比于专业的pr是比不了的,但是制作一些简单…

C/C++ 编程规范总结

目录 前言 一、编程规范的作用 二、规范的三种形式 三、规范的内容 1. 基本原则 原则1-1 原则1-2 原则1-3 原则1-4 原则1-5 原则1-6 原则1-7 2. 布局 规则2-1-1 规则2-1-2 规则2-1-3 规则2-1-4 规则2-1-5 规则2-1-6 规则2-2-1 规则2-2-2 规则2-2-3 建议2…

掌握iText:轻松处理PDF文档-基础篇

关于iText iText是一个强大的PDF处理库,可以用于创建、读取和操作PDF文件。它支持PDF表单、加密和签署等操作,同时支持多种字体和编码。maven的中央仓库中的最新版本是5.X,且iText5不是完全免费的,但是基础能力是免费使用的&…

pWnOS v2.0

该靶机绑定了静态IP地址 10.10.10.100,所以这里需要修改我们的网络配置!整个网段修改为10.10.10.0/24 信息收集 主机存活探测 arp-scan -l 端口信息探测 nmap -sT --min-rate 10000 -p- 10.10.10.100 (只开放了22 80端口) 服务…

2023-12-10 LeetCode每日一题(爬楼梯)

2023-12-10每日一题 一、题目编号 70. 爬楼梯二、题目链接 点击跳转到题目位置 三、题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 示例 2: 提…