操作系统原理三:存储器管理与虚拟存储器

存储器管理与虚拟存储器

存储器的功能是保存数据,存储器的发展方向是高速、大容量和小体积

重定位:实现逻辑地址(相对地址)到物理地址(绝对地址)的映射

程序的装入和链接

装入

编辑----编译----链接----装入----运行

绝对装入

  • 编译后,装入前已产生了绝对地址(内存地址),装入时不再作地址重定位
  • 绝对地址的产生:1. 由编译器完成,2. 由程序员编程完成
  • 对 1. 而言,编程用符号地址。

可重定位装入

  • 静态重定位:地址转换在装入时一次完成,由软件实现(重定位装入程序完成)。
    缺点:不允许程序运行时在内存中移动位置。

动态运行时装入

  • 在装入后不能移动
  • 该情况一般在执行时才完成相对地址向绝对地址的转换,需要硬件地址变换 “重定位寄存器”的支持,才能保证进程的可移动性

链接

静态链接

  • 对相对地址的修改
  • 变换外部调用符号

装入时动态链接

  • 便于修改和更新
  • 便于实现对目标模块的共享

运行时动态链接

连续分配方式

单一连续分配

  • 内存分为两个区域:系统区,用户区。应用程序装入到用户区,可使用用户区全部空间
  • 最简单,适用于单用户、单任务的OS
  • 优点:易于管理
  • 缺点:对要求内存空间少的程序,造成内存浪费;程序全部装入,很少使用的程序部分也占用内存

分区式连续分配

固定式

将内存划分成若干个连续区域,称为分区。每个分区只能存储一个程序,而且程序也只能在它所驻留的分区中运行。有n个分区,则可同时装入n个作业/任务。

  1. 分区大小:
    相等
    不相等:不相等利用率更高
  2. 内存分配:
    数据结构
    • 分区表:将分区按大小排序,并将其地址、分配标识作记录
      例:dos的MCB
  3. 优缺点:
    优点:简单;缺点:有碎片(内零头)

可变式

内存不预先划分好,当作业装入时,根据作业的需求和内存空间的使用情况决定是否分配。若有足够的空间,则按需分割一部分分区给该进程。

数据结构:

  1. 空闲分区表
  2. 空闲分区链

分配算法:

  1. 首次适应算法
    要求:分区按低址---高址链接,找到第一个大小满足的分区
    低址部分不断划分留下碎片,低址内存使用频繁
  2. 循环首次适应算法
    从首次适应中上次找到的空闲分区的下一个开始查找
    空闲分区分布均匀,提高了查找速度,但缺乏大的空闲分区
  3. 最佳适应算法(和最坏适应算法)
    分区按大小递增排序;分区释放时需插入到适当位置

内存回收

  1. 上邻空闲区:合并,改大小
  2. 下邻空闲区:合并,改大小,首址
  3. 上、下邻空闲区:合并,改大小
  4. 不邻接,则建立一新表项

可重定位

连续式分配中,总量大于作业大小的多个小分区不能容纳作业

紧凑:

  • 通过作业移动将原来分散的小分区拼接成一个大分区
  • 作业的移动需重定位,是动态(因作业已经装入)

对换

  • 将阻塞进程,暂时不用的程序,数据换出
  • 将具备运行条件的进程换入
  • 类型
    • 整体对换:进程对换,解决内存紧张
    • 部分对换:页面对换/分段对换:提供虚存支持
  • 对换空间的管理
    外存
    对换区文件区侧重于对换速度,因此,对换区一般采用连续分配
    采用数据结构和分配回收类似于可变化分区分配
  • 换出
    1. 选出被换出进程:
      因素:优先级,驻留时间,进程状态
    2. 换出过程:
      对于共享段:计数减1, 是0则换出,否则不换
      修改PCB和MCB(或内存分配表)
  • 换入
    1. 选择换入进程:优先级,换出时间等
    2. 申请内存
    3. 换入

基本分页存储管理

连续分配引起碎片问题

碎片问题的解决方案:紧凑方式消耗系统开销

离散分配:分页、分段、段页

分页:将用户程序地址分为若干个大小固定的区域,也就是页

页面和页表

页面和物理块:逻辑空间和内存空间

页面大小 :

  • 页太大,页内碎片大
  • 页太小:页表可能很长,换入/出效率低

地址结构:

逻辑地址A;页大小L;页内偏移d,则页号P和页内地址d:
\[ P=INT\left [ \frac{A}{L} \right ] \]

\[ d=\left [ A \right ]\% L \]

例:系统页面大小为1kb,A=2170B,P=2,d=122

地址变换机构

基本任务:逻辑地址——物理地址的映射

  • 页号→块号:通过页表来完成
  • 页内地址→块内地址:无需转换

基本地址变换机构:

  • 越界保护
  • 每个进程对应一页表,其信息(如长度、始址)放在PCB中,执行时将其首地址装入页表寄存器

需要考虑的问题:

  • 页表放在哪里?整个系统的页表空间有多大?

  • 直接映像的分页系统对系统效能的不利影响?(影响执行速度,因为CPU至少要访问两次主存才能存取到所要数据)

  • 基本的地址变换机构

    ①页表驻留在内存
    ②系统中设置一个页表寄存器存放页表在内存中的始址和页表的长度
    ③缺点:两次访问主存,速度降低近1/2

假设访问一次内存时间为t
\[ EAT=t+t=2t \]
快表:
减少一次内存访问

假设命中率为a,查找快表需要时间为λ,访问一次内存时间为t
\[ EAT=a\times λ+(1-a)\times (t+λ)+t=2t+λ-t\times a \]

多级页表

  • 页表可能很大,将其离散存放在不同页块中。
  • 建一“外部页表”来管理这些离散页表块。
    相当于单级页表中的页表寄存器,一般应常驻内存。
    每项记录页表始址,且增加存在位。
  • 64位机器页表一般>3级,最外层页表常驻。

基本分段存储管理

按程序的逻辑结构,将程序的地址空间划分为若干段,各段大小可不相同。在进行存储分配时,以段为单位,这些段在内存中可以不相邻接

每个段有其逻辑意义和功能,便于

  1. 方便编程
  2. 分段共享
  3. 分段保护
  4. 动态链接
  5. 动态增长

分段地址结构

段表

地址变换

分页和分段的主要区别

  1. 页是信息的物理单位,段是逻辑单位
  2. 页长度固定,段长度不固定(由用户指定)
  3. 一维与二维

段式管理的优缺点

优点:

  1. 程序的各段可独立编译(修改一个过程不会影响其它无关过程)
  2. 可采用不同的保护措施(段只包含一种类型的对象,可以有针对这种特定类型的合适的保护)
  3. 便于共享某些段(常见的例子是共享库,如图形库)

缺点:

  1. 段长受限制(段长不定会出现空闲区上内存的浪费)
  2. 段是作为一个整体调入调出,操作时间长

段页式存储管理

将用户程序分成诺干段,把每个段分成若干页

采用段页式存储管理,在CPU中应设置段表控制寄存器

地址变换过程

段页式存储管理中,访问快表失败时,每访问一条指令或存取一个操作数都要3次访问主存


虚拟存储器

常规存储器管理方式的特征

  • 一次性(指全部装入)
  • 驻留性(指驻留在内存不换出)

局部性原理

  • 时间局部性:如循环执行
  • 空间局部性:如顺序执行

虚拟存储器

  • 具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储系统
  • 实质:以时间换空间,但时间牺牲不大

虚存的实现方式:

  • 需要动态重定位

请求分页系统

  • 以页为单位转换
  • 需硬件
    1. 请求分页的页表机制
    2. 缺页中断
    3. 地址变换机构
  • 需实现请求分页机制的软件(置换软件等)

请求分段系统

  • 以段为单位转换
    1. 请求分段的段表结构
    2. 缺段中断
    3. 地址变换机构
  • 需实现请求分段机制的软件(置换软件等)

虚存特征:

  1. 离散性:部分装入(若连续则不可能提供虚存),无法支持大作业小内存运行
  2. 多次性:局部装入,多次装入
  3. 对换性
  4. 虚拟性

请求分页

需要:请求页表机制,缺页中断机制,地址变换机制

请求页表机制

状态位指示是否已调入内存

缺页中断机制

每当所访问的页面不存在时,便产生一缺页中断,请求OS将所缺页调入内存

  • 一般中断在CPU一条指令执行完后才检查,而缺页中断在指令执行期间立刻处理
  • 一条指令执行期间可能产生多次缺页中断

地址变换机制

请求分页的内存分配

最小物理块数:能保证进程正常运行所需的最小

  • 单地址指令,直接寻址:2块(一块存放指令页面,另一块存放数据页面
  • 允许间接寻址:3块

内存分配策略:

  1. 固定分配局部置换:
    固定分配:为每个进程分配一定物理块,不再改变
    局部置换:缺页只能从分配的n个页中选一换出,再调入
    -难以确定固定分配的页数(少:置换率高; 多:浪费)
  2. 可变分配全局置换:
    可变分配:为每个进程分配一定物理块,运行期间可增减
    全局置换:缺页从OS保留的空闲块取出分配,或以所有进程物理块为目标选出一块换出,再分配
  3. 可变分配局部置换
    可变分配:为每个进程分配一定物理块,运行期间可增减
    局部置换:只允许再该进程的页面中选择患处换入,如果频繁发生中断,OS再为其分配若干附加物理块知道缺页率减少

物理块分配算法:

  1. 平均分配

  2. 按进程大小比例分配:
    n个进程,页面数为Si,总页面数为S,总物理块m,分配到物理块bi=
    \[ b_{i}=\frac{S_{i}}{S}m \]

  3. 优先权:一部分按比例,一部分考虑优先权

页面调入策略:

调入时机:

  • 预调:(根据空间局部性)目前:成功率≤50%
  • 请求调入:较费系统开销,各有优劣

从何处调页:

  • 对换区(连续):全部从对换区调入所需页面, 快
  • 文件区(离散):修改过的页面换出到对换区, 稍慢
  • UNIX方式:
    未运行过的页面,都应从文件区调入
    曾经运行过但又被换出的页面,从对换区调入
    对共享页,应判断其是否在内存区

页面调入过程:

访问页面状态位为0,向CPU发出缺页中断,中断程序先保留CPU环境,查找页表找到该页所在的外存物理块,若此时能容纳新页面,则启动磁盘I/O,调入内存,修改页表;若已满,则按照置换算法,选一页换出,如果该页修改位为0,则不必写回磁盘,繁殖则写回磁盘。再调入所缺页,并写入快表。最后利用修改后的页表访问数据物理地址,再访问数据

缺页率:进程逻辑空间为n页,系统分配物理块数m,访问页面成功的次数为S,失败的次数为F,A=S+F,缺页率f=
\[ f= \frac{F}{A} \]

页面置换算法

先进先出(FIFO):淘汰最先进入内存的页面


最佳(Optimal):淘汰最长(未来)时间内不再被访问的页面


最近最久未使用(LRU):

须为每个在内存中的页面配置一个移位寄存器:R=Rn-1Rn-2...R1R0,访问某物理块时将相应寄存器的Rn-1位置1,定时信号每个一段时间寄存器右移1位,具有最小数值的寄存器就是LRU
然后再用栈保存当前页面


Clock置换算法:

为每页设置一位访问位,将内存中所有页面通过指针链接成一个循环队列,被访问时访问位置1

淘汰时:访问位是0,则换出;访问位是1,则置0,给予页面第二次驻留内存的机会,再按照FIFO检查下一个页面

改进Clock:对于修改过的页面,换出时所付出的开销更大

访问位A,修改位M:A=0,M=0:未被访问,未被修改,最佳淘汰页

  1. 扫描循环队列,寻找上述最佳淘汰页,第一次扫描不改变A
  2. 1失败则进入第二轮,寻找A=0,M=1;所有扫描过的页面A置0
  3. 2失败则进入第三轮,重复1,再失败则进入2,一定能找到

性能分析

  1. 被访问页在内存中,且在快表中
    内存访问有效时间EAT=查找快表时间λ+访问实际物理地址时间t
    \[ EAT=λ+t \]

  2. 被访问页在内存中,不在快表中
    查找快表+查找页表+修改快表+访问实际物理地址
    \[ EAT=λ+t+λ+t \]

  3. 不在内存
    查找快表+查找页表+缺页中断处理时间ε+修改快表+访问实际物理地址
    \[ EAT=λ+t+ ε+λ+t =ε+2(λ+t) \]

考虑到命中率a,缺页率f:
\[ EAT=λ+a\times t + (1-a)\times [t+f\times(ε+λ+t)+(1-f)\times (λ+t)] \]
仅考虑缺页率,λ=0,a=0
\[ EAT=t+f\times(ε+t)+(1-f)\times t \]
CPU利用率与多道程序度的关系:多道程序度指在内存中并发执行的程序数目。在低度情况下,CPU利用率呈线性变化关系。随着度的上升,CPU利用率也逐渐上升,最终上升到一个最大值,若在这种情况下,进一步增加度,则系统发生抖动,且CPU利用率将迅速恶化.

猜你喜欢

转载自www.cnblogs.com/zhxmdefj/p/12088988.html