OS Chapter 3 Memory Management

系统初始化过程

  • 加电或复位: CS:IP寄存器组合得到BIOS入口地址;CS = FFFF,IP = 0000;
  • BIOS的启动(ROM里,有特殊的入口地址):主要提供CPU需要的启动指令,启动程序的运行过程:上电自检,监测并连接系统硬件,从软/硬盘读入Boot Loader(硬盘的0面0道1扇区中);还提供一组中断,以便对硬件设备的访问,在OS未装入前负责响应中断;
  • 读入Boot Loader:将操作系统装入内存
  • 操作系统的初始化
    • 当Boot Loader将控制权交给OS初始化代码后,OS开始其初始化工作,完成:存储、设备、文件、进程管理的初始化
    • 当OS初始化完成后进入用户态,等待用户的操作

存储管理技术

  • 分区 Partitioning(连续)
  • 分页 Simple Paging(离散)
  • 分段 Simple Segmentation(离散)
  • 段页式

存储管理需求

  1. 重定位Relocation:进程从外存装到内存,物理地址变化,需要对进程地址进行重新计算,进行地址转换
  2. 存储保护 memory protection:防止非法访问
  3. 存储共享 memory sharing:
  4. 逻辑组织:进程的组织方式

 

重定位

重定位时间:

  • 进程装入内存;
  • 进程换入换出;
  • 存储引用必须在执行的时候转换成物理地址;

地址

  • 逻辑地址:相对的概念,指相对于某一点的相对地址;必须转换成物理地址
  • 相对地址:与逻辑地址关联
  • 物理地址

地址保护

在进程层面上保护进程间的数据;

在编译的时候不可能检查物理地址(会发生重定位),只能在执行的时候确定实际物理地址;

存储保护与地址转换都是由硬件实现而不是操作系统的软件实现;

 

内存共享

共享内存;节省内存;

 

简单存储技术(装全部) vs 虚拟存储技术(装部分)

 

分区技术

  • 固定分区
    • 系统初始化时将内存划分成数目固定,大小固定的分区;
    • 任何一个进程只要大小小于分区大小即可;如果分区满了则可以将优先级的进程换出内存
    • 如果进程大小大于分区大小,则利用覆盖技术
    • 如果一个进程小于分区尺寸,则剩余的空间无法被分给其它进程,造成内零头(internal fragmentation)
    • 利用不同大小的分区划分来改善效果;
    • 实现简单系统开销小,不能完成装入大程序;
    • 存在内零头,利用率高
    • 分区数目固定,活动进程数受限
  • 动态分区
    • 系统初始化时不划分固定分区,而是在进程申请时动态划分
    • 当动态分区运行久了后,会出现很多不连续的分区,这些不连续分区的总大小可能满足进程的要求但无法使用,这些剩余区叫外零头(external fragmentation)
    • 因为外零头的出现,所以要求紧凑技术Compaction,太耗时系统开销大

上图:first fit, best fit, next fit三种算法来选择进程放置方法;

 

分区技术要求:

  • 基址寄存器:记载的是当前执行进程的起始地址,其它非活动进程的基址存放于进程的PCB中,该寄存器由所有进程共享;
  • 界限寄存器:记载地址边界的;
  • 绝对地址=基址+相对地址;不能超过界限

 

伙伴系统(Buddy System)

 动态分区与固定分区的结合;

只有连续的空间且合并后满足2^n的才可以合并(即伙伴),不是连续的或不满足2^n的空间是不能合并的;所以之前分离的就是伙伴,只有之前分离开的才可以合并;

单块空间大小 2^n;

如果2^u-1 < s <= 2^u,则将当前块划给该进程;

如果2^u-1 >= s,则将当前块分半,并继续比较(递归过程);

 

 分页技术

简单分页技术 (还存在少量内零头)

内存进程划分成若干大小相同的比较小的块chunks;

这些chunks在进程里叫页pages,在内存里叫页框/页帧frames;

将进程的页装入到内存的页框中;是一种离散存储方式;

页表

操作系统为每个进程维持一个页表,映射页到页框

下图进程B已经完成,不占用页框;

 

逻辑-物理地址转换

 地址转换由处理器硬件完成(MMU,存储管理单元)

进程通过页表寄存器(page table register)获得当前进程的页表地址;(页号 -> 页框号)

地址转换过程

  • 根据逻辑地址(相对地址/页大小)获得页号与页内偏移量
  • 根据页表页表寄存器 + 页框号(页号)+ 页内偏移量 = 物理地址;

快表-加快页表检索速度

页表是在内存,如果每次CPU都要去内存中找页表,要访问2次内存(页表、数据),因此这里利用高速缓冲来加快页表检索;

 

TLB 转换表缓冲区 Translation lookaside buffer

将最近用到的页表项放入缓冲区中;(局部性原理)

与高速缓存一样的原理;

  • 地址转换时首先查找TLB
  • 找到则是命中
  • 没找到则找页表,并更新TLB

 

 页尺寸

页太小则页号多,页表大;

增加页面大小增加缺页率;

 

 页表结构

当页尺寸较小时,会存在大页表的问题;因此采用虚拟页表技术;

 

大页表解决方法

  • 虚拟页表:内存中只装一部分页表,需要时装入;
  • 利用多级页表来完成页表的查找;

  • 反置页表:通过页框建立页表;

 

简单分段

 将程序的不责骂模块放在不同的内存位置;

由段号:段内偏移量组成;

存在越界保护;

结构:

  • 段表:段到物理内存中分区的映射,分区起始地址
  • 分区表:用于查找空闲分区

段表寄存器:存放段表的起始物理地址;

 

段保护

越界检查:在段表寄存器中保存当前段表长度并在每个段表项中保存各个段的长度

存取控制:在每个段表项中设置一个存取控制字段,用于规定进程对段的访问权限;RWX-读,写,执行;

 

 分页 vs 分段

 页是信息的物理单位,在特定的系统中大小固定;

段是信息的逻辑单位,长度不定;

分页源于系统管理内存的需要,在系统内部进行用户看不到;

分段源于用户进行模块化程序设计的需要,由用户实施,程序员可见;

分页系统中内零头得到抑制,外零头消除;

分段系统中,动态数据结构、程序、数据共享,利于模块化程序设计;

 

简单段页式技术

用户:分段   段号:段内偏移量

内存:分页   

程序被分成多个段;

每个段分成若干个页;

结构

虚地址: 段号+段内页号+页偏移量

段表项:段号->段内页表起始地址;

 

posted on 2014-11-21 16:35  He2Li  阅读(129)  评论(0)    收藏  举报