操作系统存储管理

目录

一 概述

1.1 地址重定位

1.2 内存保护

1.3 覆盖技术

1.4 交换技术

1.5 程序的局部性原理

二 连续分配

2.1 单道程序存储管理

2.2 固定分区存储管理

2.3 可变分区存储管理

三 非连续分配

3.1 页式存储管理

3.2 段式存储管理

3.3 段页式存储管理

四 虚拟存储技术

4.1 虚拟存储管理

4.2 页面置换算法

4.3 工作集与驻留集模型

4.4 虚拟页式设计


一 概述

        存储管理, 就是对存储器进行管理, 通常说的存储管理, 主要指对内存的管理

 冯 · 诺依曼体系结构:

存储器的层次结构:

程序的装入和链接:

内存分区的布局:

1.1 地址重定位

        物理地址: 即内存地址, 只有通过物理地址, 才能对内存单元进行直接访问。

        物理地址编号: 物理内存划分很多大小相等的存储单元, 如字节或字, 每个单位有一个编号, 如0x0000000到0xFFFFFFF

        逻辑地址: 即相对地址或虚地址, 用户的源程序编译后形成目标代码, 首地址为0开始。

        地址映射: 将用户程序中的逻辑地址转换为运行时有机器直接寻址的物理地址

1.1.1 静态地址映射

        当用户程序被装入内存时, 直接对指令代码进行修改, 一次性实现逻辑地址到物理地址的转换。程序一旦装入内存后, 就不能再移动了。

1.1.2 动态地址映射

        在程序运行过程中, 需要访问内存单元时, 再进行地址转化, 一般由硬件基地址寄存器支持。

1.2 内存保护

        防止一个用户进程去访问其他用户进程的内存区域,

        实现: 增加一个限长寄存器, 用来记录相应内存分区的长度。

原理图:

1.3 覆盖技术

        把程序按照自身逻辑结构, 划分为若干功能上相对独立的程序模块。按照原理, 使任意时刻程序只有一部分内容放在内存中。

具体原理:

  1. 将程序必要部分常驻内存
  2. 将程序的可选部分, 平时放在外存中, 需要才装入到内存
  3. 对于不存在相互调用关系的模块, 可以共用一个内存分区 

1.4 交换技术

        通过换入换出, 将一些暂时不能运行的进程送到外存中。

        换出: 把一个进程整个地址空间保存到外存的一个交换区中。

        换入: 将外存中某个进程的地址空间读入到内存。

1.5 程序的局部性原理

        程序在执行过程中的一个较短时期内, 所执行的指令地址和指令操作数地址具有时间局部性空间局部性

        时间局部性: 一条指令的一次执或数据的一次访问行和下一次执行或访问, 都集中在一个较短时期内。

        空间局部性: 当前正在执行的指令和它邻近的几条指令, 正在访问的数据与邻近的几个数据, 都集中在一个比较小的区域内。 

        说明: 程序的运行过程中, 某一段时间内只有小部分内容处于活跃状态, 其他大部分内容可能处于休眠状态。TLB(快表),CPU中的高速缓存Cache便是基于局部性原理

二 连续分配

2.1 单道程序存储管理

        把内存分为两个区域: 系统区用户区。每次把一个应用程序装入到用户区运行, 该进程始终独占整个用户区。

特点:

  • 适合单用户, 单任务操作系统, 实现简单, 易于管理, 内存回收容易。
  • 每次只能运行一个程序, 内存使用效率不高。
  • 没有内存保护 

三种实现方式:

备注:        

        第二种方式中, 操作系统放在内存地址的最高端, 放在只读存储器中, 主要用于嵌入式系统

        第三种方式中, 是早期个人计算机系统采用的方法, 操作系统分为两部分, 一部分在ROM中, 开机首先会被执行, 进行一些硬件检测和初始化工作, 然后把操作系统装入内存。

2.2 固定分区存储管理

        在单道程序上, 把用户区分为若干个分区, 分区大小固定不变。

两种实现方式:

        1) 多个输入队列: 为每个分区设置一个输入队列, 缺点是小分区队列容易满, 大分区的队列往往是空的。

        2) 单个输入队列: 设置一个统一的输入队列, 某个分区空闲时, 选择合适的进程装入。

原理图:

单个输入队列算法

        1) 最先匹配法:选择距离队首最近的, 能够装入该分区的进程。装入小进程时会产生较大内部碎片。

        2) 最佳匹配法: 选择能够装入该分区的最大进程, 尽可能少浪费空间。

固定分区的数据结构:

特点:  

  1. 内存利用率不高, 内部碎片造成浪费,
  2. 分区总数固定, 限制并发执行的程序个数
  3. 缺乏内存保护
  4. 程序大小不能超过最大分区

内部碎片:

2.3 可变分区存储管理

        不预先划分好固定的区域, 而是动态创建, 系统根据进程需求和内存使用情况来决定是否分配。

        分配过程: 初始化空间是一块完整的大空闲区, 随着内存的分配与回收, 原来的一整块大空闲区会形成若干占用区和空闲区。

原理图:

可变分区的数据结构:

        使用分区链表, 按照地址的递增顺序排列, 每个结点对应一个分区, 分区包含各种信息。

分区链表原理图:

分区分配算法:

        1) 最先匹配法: 从头开始找, 第一个符合的空闲结点, 尽量保证高地址部分的大空闲区。

        2) 下次匹配法: 在上个分配结点继续往下找, 较大空闲分区不易保留。

        3) 最佳匹配法: 将申请内存的进程装入到大小最为接近的空闲分区, 缺点是分割以后剩余的空闲分区可能会很小, 从而无法使用到。

        4) 最坏匹配算法: 每次分配, 总是将最大的空闲区分割使用, 避免空闲区越来越小, 但大分区也将没有。

分区回收算法原理图:

特点:

  • 避免了固定分区出现的内部碎片
  • 可能会存在外部碎片, 通常是一些较小的空闲分区。

外部碎片问题:

内存紧缩技术:

        把所有进程尽可能往内存地址的低端移动, 地址高端形成一个较大的空闲分区, 但需要大量CPU时间及会出现地址重定位问题。

原理图:

三 非连续分配

3.1 页式存储管理

        把内存划分为许多固定大小的内存快, 称为物理页面页框, 把逻辑地址空间也划分为大小相等的快, 称为逻辑页面或简称页面。页面大小一般是2的整数次幂。以页面单位进行分配, 分配的物理页面不一定的连续的。

原理图:

3.1.1 数据结构

        页表: 一张一维的表格, 数组下标为逻辑页面号, 下标对应的是物理页面号。

页表图:

逻辑地址:

        物理页面表: 使用位视图描述内存空间分配情况

3.1.2 地址映射:

        逻辑页面号 = 逻辑地址 / 页面大小

        页内偏移 = 逻辑地址 % 页面大小

原理图:

快速查找硬件(TBL):

        基于程序的局部性原理, 存放最近一段时间内最常用的页表项, 减少访问内存次数, 提高效率。

3.1.3 特点 

  • 没有外碎片, 内碎片大小不超过页面大小。
  • 非连续分配
  • 程序必须全部装入内存才能运行
  • 页面较大, 能装下一整个程序时, 退化为固定分区分配

3.2 段式存储管理

        在逻辑地址空间中, 对于程序中的每一个逻辑单元(如程序, 全局变量, 栈, 库函数等), 设立一个完全独立的地址空间, 称为, 以段为单位进行可变分区分配。

原理图:

3.2.1 数据结构

段表图: 

3.2.2 地址映射

3.2.3 特点

  • 没有内部碎片
  • 针对不同类型的段采取不同的保护方式, 可以按段位单位进行共享
  • 程序需全部装入内存才能运行; 存在外部碎片。
  • 段的个数为1时, 退化为可变分区分配

3.3 段页式存储管理

        在分段的基础上, 对段进行分页。

段页式存储管理的逻辑地址:

地址映射图:

四 虚拟存储技术

        把物理内存与外存相结合; 装入程序时, 将当前需要执行的部分页面或段装入到内存即可执行, 当需要执行的指令或数据不在内存中, 称为缺页或缺段, 会产生一个硬件中断, 在中断处理程序中, 即可将相应的页面或段调入到内存。

4.1 虚拟存储管理

        在页式存储管理的基础上, 增加请求调页页面置换功能。

虚拟内存原理图:

页表表项图: 

缺页中断原理图:

虚拟段页式存储管理的地址映射图:

 ​​​​​​

4.2 页面置换算法

        即交换技术延伸。

4.2.1 最优页面置换算法

        对于保存在内存中的每一个逻辑页面, 计算它的下一次访问还需等待的时间, 选择等待时间最长的呗作为置换的页面。

        特点: 最优算法, 无法实现, 作为其他算法性能的评价依据。

4.2.2 最近最久未使用算法(Least Recently Used)

        基于程序局部性原理, 发送缺页中断时, 从内存中选择最近一段时间内最久没有被使用的页面。

        实现: LRU算法需要记录各个页面使用时间的先后顺序, 维护一个页面链表, 最近使用的作为首结点, 缺页中断则淘汰链表末尾页面, 实现时系统开销大。

4.2.3 最不常用算法(Least Frequently Used)

        发送缺页中断时, 选择访问次数最少的页面。

        实现: 对每一个页面设置一个访问计数器。

4.2.4 先进先出算法(First-In First-Out)

        选择在内存中驻留时间最长的页面, 将其置换。

        特点: 使用队列, 实现简单, 性能比较差。可能出现Belady现象

        Belady现象: 分配的物理页面越多, 反而缺页率越高的异常现象。

4.2.5 时钟页面置换算法

        改进先进先出算法, 使用循环链表, 多增加一个访问位, 从驻留时间最长的开始, 将从未被访问过的淘汰出局, 被访问过的则将访问位设为0。

原理图:

4.3 工作集与驻留集模型

4.3.1 工作集

        指进程当前正在使用的逻辑页面的集合, 使用二元函数W( t , △ )来表示, 其中 t 表示当前执行的时刻, △表示工作集窗口。

工作集示意图:

4.3.1 驻留集

        指当前时刻, 进程实际驻留在内存中的页面的集合。如果工作集是驻留集的子集, 则进程将会顺利运行, 反之则会造成很多缺页中断。

        抖动: 因频繁在内存与外存间替换页面, 从而使进程的运行速度非常慢, 

4.4 虚拟页式设计

4.4.1 页面分配策略

        对于进程, 应该分配多少物理页面的方案。

        固定分配策略: 驻留集大小是固定的, 可根据程序的大小按比例分配。但若分配页面数太少, 则可能会发生抖动, 分配太多则浪费资源。

        可变分配策略: 根据缺页率(缺页的次数与内存次数之间的比率), 动态调整所占用的物理页面。

缺页率算法:

4.4.2 页面大小

        页面越小, 内部碎片就越少, 页面中暂时不会被使用的程序部分就越少; 页面越小, 页表项就越大, 占用的空间就越大, 现代操作系统页面一般为4KB

4.4.3 页表结构

        多级页表: 一级页表结构下, 以页面4KB为例, 一个进程的页表需占4MB(1048576个页表项)。多级页表则可以避免这个问题。

示意图:

        反置页表: 物理页面号为索引, 逻辑页面号与进程标识符为内容。通过页号与进程标识符来找到块号, 从而找到物理地址。

示意图:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值