1、Buddy内存管理算法(伙伴系统)

  • Buddy算法似乎经典的内存管理算法
  • 算法基于计算机处理二进制的优势具有极高的效率
  • 算法主要是为了解决==内存外碎片==的问题

1.1、扩展

1.1.1、页内碎片

内部碎片是已经分配出去(能明确指出属于哪个进程)的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。

20211226145928.png

1.1.2、页外碎片

外部碎片是指还没有分配出去(不属于任何进程),但是由于大小不够而无法分配给申请内存空间的新进程的内存空闲块

20211226145937.png

==努力让内存分配与相邻内存合并并能快速进行==

1.2、Buddy内存管理算法

  • 向上取整为2的幂大小(==内存分配原则==)

    • 70k $\rightarrow$ 128k
    • 129k $\rightarrow$ 256k
    • 666k $\rightarrow$1024k
  • "伙伴"指的内存的“伙伴”

  • 一片连续内存的“伙伴”是相邻的另一片大小一样的连续内存

  • 创建一系列空闲块链表,每一种都是2的幂

    20211226145953.png

1.3、案例

假设存储空间有1MB大小

  • 分配100K内存
    1. 100K向上取2的幂=128K
    2. 查询是否有128K的空闲内存块?
    3. 没有!查询是否有256K的内存块?
    4. 没有!查询是否有512K的空闲内存块?
    5. 没有!查询是否有1MB的空闲内存块?
    6. 有,摘下1M的空闲内存块,分配出去
    7. 拆下512K放在512K的空闲链表,其余的分配出去(==判断是否满足100K的最小需求128K==)
    8. 拆下256K放在256K的空闲链表,其余的分配出去(==判断是否满足100K的最小需求128K==)
    9. 拆下128K放在128K的空闲链表,其余的分配出去
    10. 分配完毕!
  • 回收刚才分配的内存
    1. 判断刚才分配的内存伙伴在空闲链表上吗?
    2. 在!移除伙伴,合并为256k 的空闲内存,判断256k的内存伙伴在空闲链表上吗
    3. 在!移除伙伴,合并为512k 的空闲内存,判断512k的内存伙伴在空闲链表上吗
    4. 在!移除伙伴,合并为1M的空闲内存
    5. 插入1M空闲链表,回收完成

==内存的外碎片问题 $\Longrightarrow$ 内存的内碎片问题==

2、Linux交换空间

  • 交换空间(Swap)是磁盘的一个分区
  • Linux物理内存满时,会把一些内存交换至Swap空间
  • Swap空间是初始化系统时配置的

topfree命令可以查看

20211226150015.png

  • total:总的交换空间的大小

  • free:没使用的

  • used:已使用的

    ==应避免系统使用交换空间==

2.1、冷启动内存依赖

2.2、系统睡眠依赖

  • 睡眠时各种信息保存在Swap中

2.3、大进程空间依赖

20211226150028.png