内存分配

内存分配

b079c193859c94e0fc6cedf22db53c3b.png

内存保护

连续分配

固定分区方法

可变分区方法

碎片问题

非连续分配

分页

分页概述

  • 定义:将 ==物理内存==和 ==逻辑内存==(虚拟内存)分为 ==大小相等== 的块

  • 概念:

    • 帧:系统将物理内存分为大小相等的块,每块称为帧

    • 帧表:记录 ==已分配帧== 和 ==空闲帧== 的数据结构

    • 页:系统将逻辑地址空间分为大小相等的块,每块称为页

      • 页码:每个页都具有的编号

      • 页偏移:页中的 每个逻辑地址 相对于 页地址 的偏移量

        (1) 页地址:每页的第一个逻辑地址就是页地址(其实之前画图已经提到了)

        (2) 偏移量最大值 = 每页的逻辑地址数量

    • 页表:记录每个页和每个帧的 ==映射关系== 的数据结构

      每个页和帧的大小都是 相等的 且由 硬件 决定的

    • 页面大小

      • 页表大小 考虑
      • I/O负载 考虑
      • 碎片 考虑
      • 局部性 考虑
    • 有效-无效位:

      • 判断索引的页号是否存在于逻辑空间中:这种情况几乎不会出现
      • 判断当前页是否加载进入内存中(主要):如果没有加载进入就会被标记为 无效(不可访问);如果加载进入就会被标记为 有效(可以访问)
  • 查找过程:

    1. 处理器将 逻辑地址 交付给内存管理单元

    2. 内存管理单元根据 页面大小 计算得到 页号 + 页偏移量

    3. 内存管理单元查询 页表 找到页码对应的 映射关系

    4. 内存管理单元检查 映射关系的 有效-无效位

      • 如果有效-无效位是 有效 的:跳转到第 5 步
      • 如果有效-无效位是 无效 的:处理 页错误
    5. 内存管理单元利用 帧号页偏移量 计算得到 物理地址

    6. 内存管理单元将内存中的内容交付给处理器

    <a style="color:red;">公式:帧号 * 页面大小 + 页偏移量</a>
    
  • 细节:

30354ee8ae88604abe9e7a1cc99176a0.png

帧分配

  • 定义:为每个进程分配物理帧

  • 方式:

    • 固定分配

      • 平均分配:每个进程都获取 ==相同数量== 的物理帧

      • 按进程大小分配:大进程获取的物理帧数量多,小进程获取的物理帧数量少
        $$
        s_i: \text{表示每个进程的大小};s = \sum{s_i} \text{表示所有进程的大小之和}; m: \text{表示物理帧的数量} \
        \text{公式: 分配的物理帧数量} = \frac{s_i}{s} * m
        $$

    • 优先级分配:具有 ==高优先级== 的进程可以被分配更多物理帧

  • 细节:每个进程被分配的最小帧数是由计算机体系结构决定的;被分配的最大帧数是由 可用物理内存 决定的

  • 策略:

    • 全局分配
    • 局部分配
  • 颠簸

页表保存

页表结构

  • 引入:

    • 现代计算机通常都是 32位 或者 64位 的操作系统,支持的最大逻辑地址为 2^32^ 或 2^64^
    • 如果每张页表大小为 2^12^ B,那么一共会有 2^20^ 或者 2^52^ 页,这些页面如果全部 连续存储 在内存中显然也不是很合理
    • 所以希望采用一定的结构将页表分散存储在内存中
  • 分层分页:

    • 定义:将页表再次进行分页

      55b5853eec02aa5d94bb2d3cacd52c59.png
    • 查找方式:

      1. 内存管理单元首先查找 外部页表 (高级页表)
      2. 内存管理单元再根据外部页表再索引到 内部页表 (低级页表)
      3. 内存管理单元最后根据内存页表索引到 内存中的数据
    • 细节:

    c0e23f5ef37e8264ffa00d26cbe5dc7a.png
  • 哈希分页:

    • 定义:设计哈希函数将虚拟页号映射到哈希表相应的位置中去

    • 核心:哈希表采用 数组链表 实现:每个哈希表中每个数组元素实际上都是一个页表

    • 查找方式:

      • 内存管理单元用虚拟页号和链表中的第一个元素进行匹配

        -> 匹配成功,则就是用这个元素的物理地址

        -> 匹配失败,则继续遍历使用接下来的元素的物理地址

    • 细节:

    ee9882da5eb63c3190fe43438af668e9.png
  • 倒置页表:

    • 定义:倒置页表仅维护 真正存在 于物理内存中的页对应的映射关系

      解释:在之后的虚拟内存中会看到,并不是所有的进程的页面都会被加载进入内存中,操作系统没有必要去维护不存在于内存中的页面的映射关系

    f882b58dc2a20c37022ade7744377f6d.png

    倒置页表

分段

Author: Fuyusakaiori
Link: http://example.com/2021/09/18/os/memory/内存分配/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.