操作系统(四)存储器管理

操作系统(四)存储器管理

  • 1.存储器的层次结构
  • 2.程序的装入和链接
    • 程序的装入
    • 程序的链接
  • 3.连续分配存储管理方式
    • 单一连续分配
    • 固定分区分配
    • 动态分区分配
      • 附:分区算法详述
    • 动态重定位分区分配
  • 4.对换(Swapping)
  • 5.分页存储管理方式
  • 6.分段存储管理方式
    • 段页式
    • 本章小结,

存储器管理的主要对象是 内存,对外存的的管理放在文件管理的章节来详解。

1.存储器的层次结构

—存储器为啥要分层次呢?
——因为目前没有容量大,速度快还价格便宜的存储器!
具体咋分的看下图(三级六层,层次越高/靠近CPU,存储介质访问速度越快,price也越高)
操作系统(四)存储器管理_第1张图片
下面来介绍介绍这六层

  • 寄存器 -->拥有着与处理机相同的速度,but价格昂贵不能做的太大。
  • 主存储器 -->也就是“主存”,计算机系统中的主要部件!用来保存进程运行使得程序和数据。
    操作系统(四)存储器管理_第2张图片
  • 高速缓存 -->介于 寄存器 and 存储器 之间的存储器,主要用于备份主存中的常用数据,以减少处理机对主存储器的访问次数,节约时间,大大的提高程序执行速度!
  • 磁盘缓存 -->由于目前磁盘的I/O速度远低于对主存的访问速度,为了缓和速度不匹配,让磁盘缓存暂时存放一些频繁使用的一部分磁盘数据和信息,以减少访问磁盘的次数。(功能看起来和高速缓存类似,但是磁盘缓存本身并不是一个实际存在的存储器,它只是主存中的部分存储空间暂时)
  • 固定磁盘
  • 可移动存储介质

2.程序的装入和链接

用户程序要想在系统中运行,必须先将它装入内存,然后再将其转变成一个可执行的程序。
“编译–>链接–>装入”
操作系统(四)存储器管理_第3张图片

程序的装入

  • 绝对装入方式:将目标模块装入到内存中原指定的位置(适用于单道程序模块)
  • 可重定位装入方式:根据内存的具体情况将装入模块装入到内存的适当位置。
    由于用户程序编译所形成的若干目标模块,它们的起始地址通常都是从0开始的,而程序中的其它地址也都是相对于起始地址计算的,再用绝对装入就行不通了~
    ps,装入模块中的逻辑地址与实际装入内存后的物理地址不同,需要修改地址。 通常把装入时 对目标程序中指令和数据地址的修改过程称之“重定位”,即静态重定位
  • 动态运行时装入方式:把装入模块装入内存后,并不立即把装入模块中的逻辑地址改成物理地址,推迟到当程序真正要执行的时候再更改。真聪明!!(此种装入方式由于装入后仍想保持是逻辑地址,所以需要一个重定位寄存器支持)

程序的链接

  • 静态链接方式:程序运行之前将模块以及库函数链接在一起不拆开。
  • 装入时动态链接:一组目标模块装入内存时,发生了外部模块调用事件,找出来,装入内存并修改相对地址。//便于修改、更新,共享模块
  • 运行时动态链接:(先不把所有的模块装进去)对某些模块的链接推迟到程序执行时。
    执行着呢,发现了一个被调用模块还没装入内存呢!赶快让OS去找到该模块,装入内存,跟调用者链接上~~//加快程序装入过程的同时也大大节省了内存空间。

3.连续分配存储管理方式

单一连续分配

在这里插入图片描述

固定分区分配

操作系统(四)存储器管理_第4张图片可以划分成大小相等的分区,亦可以划成大小不等的分区。
内存分配:分区使用表(起始地址+大小+状态/是否已分配)
简单易分配,但主存浪费大。每个用户作业占用一个连续分区,作业的程序和数据一旦装入分区后就不能再移动了,采用静态地址重定位

动态分区分配

操作系统(四)存储器管理_第5张图片
例如这个小题操作系统(四)存储器管理_第6张图片

  1. 数据结构 : 空闲分区表 / 空闲分区链

  2. 动态分区分配算法
    基于顺序搜索的动态分区算法操作系统(四)存储器管理_第7张图片
    基于索引搜索的动态分区算法操作系统(四)存储器管理_第8张图片
    (算法详见下文)


  1. 分区分配操作 // 动态分区的分配和回收
    内存分配流程
    — m.size空闲区表 , u.size用户操作系统(四)存储器管理_第9张图片
    回收内存 : 作业完成释放后,系统进行回收,将相邻空闲区合并并修改相应的链表指针,不能合并的计入链表成新表项

附:分区算法详述

  1. 首次适应算法FF
    从低地址找起,直到找到的一个满足要求的空闲区分配给作业(减少查找时间)
    有利于大作业,低地址部分不断被划分形成了许多小的空闲分区(外碎片),每次都从低地址开始,开销大。

  2. 循环首次适应算法,在FF的基础上+起始查询指针,只是下一次查找的那个空闲分区
    使空闲分区分布均匀,减少查找开销;但又缺大空闲分区,不利于大作业

  3. 最佳适应算法BF
    从全部空闲区中找能满足作业要求且最小的空闲分区,分区链按容量从小到大。

  4. 最坏适应算法WF
    总挑选最大的空闲分区分割给作业使用,分区链按容量从大到小
    防止产生碎片,空间浪费最少! . 有利于中小作业 …查找效率高,first就是。缺乏大的空闲分区…


  1. 快速适应算法//分类搜索法:按分区容量大小,分类索引搜索
    操作系统(四)存储器管理_第10张图片
  2. 伙伴系统:固定分区与动态分区方式的折衷
  3. 哈希算法

动态重定位分区分配

无法利用的外碎片
操作系统(四)存储器管理_第11张图片操作系统(四)存储器管理_第12张图片
自然是动态运行时装入方式啦~~再辅之重定位寄存器(保存作业在内存中的起始地址), "紧凑 "之后,程序移动了位置,只需要更改重定位寄存器的内容为新的起始地址!
操作系统(四)存储器管理_第13张图片操作系统(四)存储器管理_第14张图片

4.对换(Swapping)

操作系统(四)存储器管理_第15张图片
操作系统(四)存储器管理_第16张图片操作系统(四)存储器管理_第17张图片
其实swapping伴随着较大的系统开销(CPU时间、I/O开销)
没事尽量不启用对换,内存紧张时,启用对换,把部分进程调出,缓解一下紧张状况,之后再暂停swapping程序~~


5.分页存储管理方式

,那前面第三部分提到了连续分配方式会形成许多“碎片”,即便是通过“拼凑”能在一起但也是要付出很大的开销的!!
,但是现在呢~~有另外三种方式可以将进程直接分散的装入多个不相邻的分区中,充分利用内存空间就是——分页、分段、段页

分页:把用户程序的地址空间划分成为若干大小相等的区域,每个区域称作页面or页.
把内存空间划分成若干和页大小相等的物理块,这些块叫frame,(物理)块.
操作系统(四)存储器管理_第18张图片
页表:系统为了让每个页找到内存中对应的物理块,而为每个进程建立一张页面映射表
——fuction:页号到物理块号的地址映射

重点来啦!!!!
操作系统(四)存储器管理_第19张图片操作系统(四)存储器管理_第20张图片
来个例子清晰一点,,,,根据除法–>页号–>块号–>块号*页面大小–>+页内偏移 = 物理地址操作系统(四)存储器管理_第21张图片
//通常是先读内存中的页表,第二次读真正的数据(两次访问内存)
命令的有效执行T?取指令+取数据+执行指令 = 1+2+1 =4次访问内存时间

加个快表??? … 提高效率?是的没错,取数据的时候time减少了…

//图中,,页号>=页表长度(越界中断)操作系统(四)存储器管理_第22张图片操作系统(四)存储器管理_第23张图片

两级页表:
外层页表–>内层页表–>内存空间
页目录 + 页表页 + 位移

6.分段存储管理方式

分页主要是为了提高系统资源利用率
//页内分散,页间连续

分段是为了满足用户(程序员)的需求:方便编程、信息共享保护、动态增长、动态链接
//段内连续,段间分散
段号从0开始,每一段段内也从0开始,相对于本段地址0开始
操作系统(四)存储器管理_第24张图片
页是信息的物理单位,段是信息的逻辑单位,它含有一组其意义相对完整的信息。
页的大小由系统决定是相等;段的长度不固定,决定与用户的程序。
分页是一维的,单一线性空间;分段进程的地址空间是2维的,有段号和段内地址。
操作系统(四)存储器管理_第25张图片

段页式

综合了分页和分段的优点,同时逻辑信息完整可信息共享
段号 + 页号 + 页表,,,访问一次数据,3次访问内存段表、页表、数据本身
操作系统(四)存储器管理_第26张图片

本章小结,

先略

你可能感兴趣的:(操作系统(四)存储器管理)