-
目录 Buddy内存管理算法 页内碎片 页外碎片 伙伴系统 算法的具体流程 Linux交换空间 作用: 与虚拟内存类似
-
Buddy内存管理算法 - Buddy算法是经典的内存管理算法
- 基于计算机处理二进制的优势具有极高的效率
- 主要是为了解决内存外碎片的问题
- 其实就是把内存外碎片问题转移成内存内碎片问题
-
页内碎片 - 也称为内部碎片
- 内部碎片是已经被分配出去(能明确指出属于哪个进程)的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片
-
页外碎片 - 也称为外部碎片
- 外部碎片是指还没有分配出去(不属于任何进程),但是由于大小而无法分配给申请内存空间的新进程的内存空闲块
- Buddy内存管理算法的目的就是努力让内存分配与相邻内存合并能快速进行
- Buddy内存管理算法的内存分配原则为 向上取整为2的幂大小
-
伙伴系统 - 伙伴指的是内存的伙伴
- 一片连续内存的伙伴是相邻的另一片大小一样的连续内存
-
算法的具体流程 - 创建一系列空闲块链表,每一种大小都是2的幂
- 分配流程示例(分配100k内存):
- 1.100k向上取2的幂=128k
- 2.查询是否有128k空闲内存块?
- 3.没有!查询是否有256k空闲内存块?
- 4.没有!查询是否有512k空闲内存块?
- 5.没有!查询是否有1M空闲内存块?
- 6.有,摘下1M空闲内存块,分配出去
- 7.在这个1M块里拆下512k放在512k的空闲链表,其余分配出去,还没满足最小要求再拆
- 8.在这个512k块里拆下256k放在256k的空闲链表,其余分配出去,还没满足最小要求再拆
- 9.在这个256k块里拆下128k放在128k的空闲链表,其余分配出去,满足最小要求,分配完毕
- 由于计算机处理2的幂时是极快的,所以这个算法具有极大的效率
- 回收刚才分配的内存过程(通过伙伴系统实现快速合并)
- 1.判断刚才分配的内存伙伴在空闲链表上吗?
- 2.在!移除伙伴,合并为256k空闲内存,再次判断
- 3.在!移除伙伴,合并为512k空闲内存,再次判断
- 4.在!移除伙伴,合并为1M空闲内存,再次判断
- 5.不在!将1M空闲内存插入到空闲链表,回收完成
-
Linux交换空间 - 交换空间(Swap)是磁盘的一个分区
- Linux物理内存满时,会把一些内存交换至Swap空间
- Swap空间是初始化系统时配置的
-
作用: - 1.冷启动内存依赖
- 对于一些大型的应用程序在启动的过程中需要使用大量的内存,但是这些内存很多只是在启动时用一下,后续在运行时很少会使用到这个内存,有了交换空间,系统就可以将这个部分不怎么使用的内存数据保存在Swap空间里去,从而释放更多的物理内存提供给系统使用
- 2.系统睡眠依赖
- 当Linux需要睡眠时,就会把系统里所有的内存数据保存在Swap空间里去,等下次系统需要启动时再重新把数据载入到内存里,这样就能加快系统启动速度
- 3.大进程空间依赖
- 有些进程确实需要使用很多的内存空间,但是物理内存是不够使用的,因此需要把进程需要使用的内存暂时保存到Swap空间里去,使得大进程也能运行起来
-
与虚拟内存类似 - 交换空间和虚拟内存的区别在于使用的系统不一样,产生的技术手段不一样
- Swap空间和虚拟内存都存在于磁盘
- Swap空间和虚拟内存的工作原理都是与主存发生置换
- Swap空间是操作系统概念,从Linux系统角度看待
- 虚拟内存是进程概念,是从进程角度看待
- Swap空间解决系统物理内存不足问题
- 虚拟内存解决进程物理内存不足问题,是为了更高效的使用物理内存
- 虚拟内存是文件数据交叉链接的活动文件。是WINDOWS目录下的一个"WIN386.SWP"文件
- 虚拟内存不一定是交换空间,交换空间一定是虚拟内存
|