九、内存管理(二)

6.3页式存储管理:分页

  • 将主存划分为许多等长的小块,称为页框
  • 将进程划分为若干页,一个页的大小与一个页框的大小相等
  • 进程加载时,所有页被载入可用页框(不要求连续),同时建立页表————简单分页的主要数据结构
  • 简单分页的进程加载示例
    image

6.3.1页表

  • 操作系统通过页表的建立和维护进行内存管理:
    • 操作系统为每个进程建立并维护一个页表
    • 页表的每个表项包含该页在内存中对应的页框号(还包括保护、共享等信息)
    • 页表以页号为索引
    • 操作系统另外维护一个空闲页框的页表
      image

6.3.2简单分页中的重定位

  • 程序中的逻辑地址由两部分组成
    • 页号
    • 页内偏移
  • CPU的一对寄存器记录当前运行进程的页表起始物理地址、页表长度
  • (页号,偏移)->(页框号,偏移)
  • 页(页框)的大小必须为2的整数m次幂
  • 当页(页框)的大小为2的m次幂时,逻辑地址与相对地址一致
  • 页面大小为2的m次幂时,页面(逻辑地址)对程序员、编译器/汇编器、链接程序都是透明的
  • 例:16位编址,若页面大小为1K(1024),则需(低)10位表示页内偏移,剩下高6位表示页号,则:
    • 相对地址为1502的逻辑地址 = 1024 + 478 = (1,478)
    • 逻辑地址为(1,478)的相对地址 = 1*1024 + 478 = 1502
分区、分页、分段的逻辑地址

image

简单分页地址重定位

image

  • 例子
    image

6.3.3简单分页的特点

  • 类似固定分区,不同在于
    • 分页中的“分区”(页框)非常小(从而内碎片也小)
    • 分页中的一个进程可以占用多个“分区”(页框),从而不需要覆盖
    • 分页中不要求一个进程占用的多个“分区”(页框)连续,充分利用空闲“分区”
  • 存在问题
    • 不易实现共享和保护(不反应程序的逻辑组织)
    • 不便于动态链接(线性地址空间)
    • 不易处理数据结构的动态增长(线性地址空间)

6.4分段存储管理

  • 基本原理
    • 将程序及数据划分成若干段(不要求等长,但不能超过最大长度)
    • 进程加载时,所有段被载入内存可用区域(不要求连续),同时建立段表
      image

6.4.1段表

  • 操作系统通过段表管理内存
    image
    • 操作系统为每个进程建立并维护一个段表
    • 段表的每个表项包括该段在内存中的起始物理地址、断长等
    • 段表以段号为索引
    • 操作系统另外还维护一个内存空闲块的表

6.4.2简单分段中的重定位

  • 程序中的逻辑地址由两部分组成
    • 段号
    • 段内偏移
  • 进程进入运行态时,其段表地址被载入CPU专用寄存器
  • 逻辑地址(n,m)-> 物理地址转换过程:
    • 根据n位计算段号
    • 以段号为索引到段表查找得到段起始物理地址
    • 比较偏移(m位)与段长(据段表),若前者大,则为非法地址
    • 物理地址=段起始地址+偏移
      image
  • 简单分段重定位的例子:
    image

6.4.3页式管理和段式管理的比较

  • 分页是处于系统管理的需要,分段是出于用户的应用的需要
    • 一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处
  • 页大小是系统固定的,而段大小通常不固定
  • 逻辑地址表示
    • 分页是一维的,各个模块在链接时必须组织成同一个地址空间
    • 分段是二维的,各个模块在链接时可以每个段组织成一个地址空间
  • 通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度
  • 分段对程序员可见,从而可用来对程序或数据进行模块化组织
  • 分段方便实现模块化共享和保护,如程序可执行、数据可读写(段表表项要有保护位)

6.4.4动态分区管理和段式管理的比较

  • 都存在外部碎片,但分段中可通过减少断长来减轻外部碎片浪费的程度
  • 分段中一个进程可占用多个“分区”
  • 分段中不要求一个进程占用的多个“分区”连续(但一般要求一个段所占用的多个“分区”连续)
  • 分段克服了分页存在的问题(数据结构的动态增长、动态链接、保护和共享)
  • 分段存在外部碎片,分页只有小的内碎片,分页内存利用率比分段高
    image
posted @ 2024-11-19 22:42  韦飞  阅读(127)  评论(0)    收藏  举报