内存管理篇-04伙伴系统

2024-08-24 19:20
文章标签 系统 内存 管理 04 伙伴

本文主要是介绍内存管理篇-04伙伴系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本小节有几个重要的知识点:

  • 伙伴系统的思想
  • 伙伴系统的实现
  • 伙伴系统分配器:内存块的申请、释放过程
  • 伙伴算法和阶数

1.伙伴系统的思想

        针对某个某个zone分区,(1)把物理地址相连的空闲页连接起来合成一个物理块,因此会在系统中分散着一堆物理块;(2)然后将大小相同的物理块用链表连接起来;(3)用free_area[order] 指向对应的链表。从而初步缓解了内存碎片化。

        伙伴系统主要用于管理物理内存,主要管理page。首相将系统中的内存分为大小不同的物理块,对于物理地址相连的物理页合并成大的物理块,对于相同大小的物理块用链表连接起来,通过一个struct free_area free_are[MAX_ORDER]保存,每个元素都指向一个链表(他们内存块大小不一样)。最大物理块是4MB。假如用户正好申请4KB,就直接从块为4KB的链表摘除一块出来,如果正好没有了,就会从8KB的地方拆分2个4KB出来,一个分给用户,另一个交给下一级的链表。相反,如果用户释放内存,如果发现释放后的page和旁边的相连,就会逆向的把它合并在一起。

2.伙伴系统的实现

首先,伙伴系统的实现是基于分区zone的实现的。首先回顾一下zone结构体。伙伴系统主要是指对free_area的管理

free_area[]结构体存放了各个链表的表头。lowmem_reserve还会对内存做一些备份。free_area并不会指向所有的内存,只会把分区的大部分空闲内存放进来。

示例:以下是ubuntu上查看buddyinfo的信息,12列对应的就是ORDER=0-11时的free_area[order]链表上的内存。

3. 新版伙伴系统实现

        为了进一步优化内存碎片化,在原来的伙伴系统上,free_area[order]上引入了type的概念。对每个free_area[order]进行分类,观察哪些是可移动的,不可移动的,可回收的,预留的,隔离的以及CMA等等。

问题:如何判断某个页是否被添加到伙伴系统中?

  • struct page 结构体中的成员atomic_t _mapcount; 这个_mapcount代表了是否发送了映射。unsigned long private; 表达当前内存块的大小,也就是order。记录着你是从哪个内存块分配出去的,如果是1就表示从第二组内存块分配下来的内存,并且大小是8KB由两个物理页组成的。atomic_t _refcount; 表示页表被引用记录的次数

这篇关于内存管理篇-04伙伴系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python