内存管理篇-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

相关文章

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR