linux底层内存管理--内核空间的伙伴系统

简介:
linux内核的伙伴算法最大限度的减少了内存的碎片,其实应该说成是尽自己最大的努力减少了内存 的碎片。其思想就是将物理内存分成10个链表,每一个链表的元素代表一系列的连续页面,连续页面的数量随链表的不同而不同,linux中有10个这样的链 表,按照2的从0到9次幂的连续页面数量组成,比如链表0中保存有代表2的0次幂个连续页面的页面,而链表k中保存有2的k次幂个连续的页面,linux 的伙伴系统的精髓不但是如何分配,更重要的是如何释放,具体来讲,释放的过程就是一个合并的过程--反之分配的过程就是一个分解或者直接分配的过程,最终 的结果就是尽可能的得到尽可能大的连续内存块,因为在有连续内存分配需求的时候,大的块可以分解,然而小的非连续的块由于其非连续却不能合并,因此确保连 续块的最大化总是好的,在分配小块的时候,如果在小的块链表中没有空闲块,那么就从较大的块中分配,比如从它的order+1的块中进行分配,结果就是一 个块被分配了,由order+1块分解出来的剩余的一个块空闲,并且插入到order链表,如果由order大小的需求那么就可以分配之,如果没有,那么 就等着刚刚分配的块释放后再次和其合并成2的order+1次幂个连续页面大小的块。 
在分配过程中由大块分解而成的小块中没有被分配的块将一直等着被分配的块被释放从而和其合并,合并的操作正是在页面释放的过程中,最终的结果就是相当与没 有分解大块,伙伴系统一直在向这个结果收敛,这就是为何伙伴系统能避免碎片的原因。伙伴系统在分配和释放两个方向上执行分解和合并两个互逆的操作,如果一 开始系统没有碎片,那么最终的碎片将最小化,因为互逆的操作将最大力度的抵消碎片的产生,这就是精髓了。伙伴在这里的意义包含几种情况,一对伙伴表示两个 块,按照从0开始的索引,一对伙伴就是从偶数开始到其相邻奇数的两个相邻的块,如果order为0,那么k/k+1(k为偶数)就是一对伙伴,如果 order为2,那么k/k+2(k为偶数)就是一对伙伴,伙伴就是两个相邻的块,它们的关系有三种,第一就是一个被分配时,那么另一个就等着这个分配出 去的块被释放后合并,然后递归的进行更大order的合并;第二就是如果两个都被分配,那么肯定有一个先被释放,那么化为情况一,注意在等待伙伴被释放的 同时,该块可以被分配,从而情况一化为情况二,但是最终它们结果总是趋向于情况三,也就是都被释放从而被合并然后插入到更大一层的链表中。 
具体到代码上就没有理论那么琅琅上口了,如果你看的是早期版本,会发现每一个链表都有一个位图,该位图展示该链表中伙伴的情况,该位图设计上十分复杂,最 终被追求简单的内核无情抛弃,2.6.28内核版本是比较新的版本了,它里面没有用位图,而是直接判断,具体在__free_one_page中体现: 

static inline void __free_one_page(struct page *page, 



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273390

相关文章
|
9月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
827 3
Linux系统禁用swap
|
9月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
1401 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
893 3
Linux系统初始化脚本
|
缓存 监控 关系型数据库
深入理解Linux操作系统的内存管理机制
【7月更文挑战第11天】在数字时代的浪潮中,Linux操作系统凭借其强大的功能和灵活性,成为了服务器、云计算以及嵌入式系统等领域的首选平台。内存管理作为操作系统的核心组成部分,对于系统的性能和稳定性有着至关重要的影响。本文将深入探讨Linux内存管理的基本原理、关键技术以及性能优化策略,旨在为读者提供一个全面而深入的理解视角,帮助开发者和系统管理员更好地优化和管理Linux系统。
|
算法 安全 Linux
深度解析:Linux内核内存管理机制
【4月更文挑战第30天】 在操作系统领域,内存管理是核心功能之一,尤其对于多任务操作系统来说更是如此。本文将深入探讨Linux操作系统的内核内存管理机制,包括物理内存的分配与回收、虚拟内存的映射以及页面替换算法等关键技术。通过对这些技术的详细剖析,我们不仅能够理解操作系统如何高效地利用有限的硬件资源,还能领会到系统设计中的性能与复杂度之间的权衡。
|
缓存 监控 算法
Linux内核的SLAB内存管理机制
Linux内核的SLAB内存管理机制
1284 4
|
存储 缓存 监控
Linux内存管理:理解正常波动背后的机制
Linux内存管理:理解正常波动背后的机制
483 0
|
Web App开发 缓存 Linux
深入理解Linux内核内存管理机制与实现(下)
深入理解Linux内核内存管理机制与实现
|
缓存 Linux 程序员
深入理解Linux内核内存管理机制与实现(上)
深入理解Linux内核内存管理机制与实现