操作系统复习:基本存储管理

操作系统复习:存储管理(一)

1 基本概念

1.1层次化存储结构

外存–内存–Cache–RF

  • 外存:IO设备的访问需要一定的工具
  • 内存空间:系统区和用户区;代码+数据
    • 系统区:OS常驻内存部分
    • 用户区:“内存管理”的对象
1.2 内存管理的主要任务
记录各个存储区域的状态

内存管理的数据结构:

  • 位示图(Bitmap):0表示空闲,1表示占用

  • 空间页面表:首页面号+空闲页面的个数组成一对,若干对的集合

  • 空闲块表

实施分配

分配策略(放在哪里?如何让程序知道自己需要的代码被装载到了何处?):见1.5

分配的方式:

  • 方式:静态/动态(程序运行时是否允许相关代码和数据在内存空间中被迁移)

  • 动态:提高内存利用率;反应程序的动态性,更为合理

回收内存
1.3内存共享

代码共享:多道程序运行时提高内存利用率

数据共享:实现进程通信

1.4存储保护

程序–(具有访问权限)–内存空间

保护机制由硬件实现(异常) 软件维护开销太大(为什么?)

1.5地址映射

理解地址空间:

1 编写程序时:符号名空间,符号地址

2 汇编+编译后形成目标代码:相对地址;首地址为0,也就是逻辑地址;地址空间

​ 不能用逻辑地址在内存中读取信息!!!

3 内存中的存储单元的地址:物理地址/实地址/绝对地址 ;内存空间

地址映射(重定位);静态/动态

2 分区管理

2.1 固定分区

实现:内存分配表,记录每个分区的分配状态

优缺点:开销小;不利于不同大小的程序的管理—或者反过来说,程序的大小因内存管理方案而受到了极大的限制(总之淘汰)

2.2 可变分区

数据结构:已分配表+未分配表,首地址+长度(经典记录方式,后面存储实现几乎都这样)+程序名

分配策略:首次适配算法/最佳适配算法/最坏适应算法(分配最大的)

回收:需要考虑与上下空闲分区的合并

内存保护:界限寄存器=基址寄存器+限长寄存器

​ *保护键方法:分区和进程分别持有锁和钥匙,进程将钥匙存放在PSW中(还是由硬件来作保护)

碎片问题:内碎片(程序装载内存区域内部的),外碎片(装载区域之间的)

​ 不够了需要拼接,拼接开销巨大(很多重定位)

优缺点:优点也就跟上面一样口胡了,缺点方面,一是碎片问题(内存剩余容量足够装载却因为是碎片无法利用),二是功能上的欠缺:不能实现内存扩充(或者说不能动态装载程序/没有虚存),内存空间仍然对程序大小产生限制。

3 页式存储管理

分区管理在碎片浪费空间太多和管理碎片的时间开销过大这两件事情上需要进行权衡,权衡的过程也是新技术孕育和诞生的过程。解决碎片问题的焦点其实不在于碎片,而在于分区管理不允许离散地装载同一程序。这也好理解:要是离散了,倒也不影响内存管理时照常使用传统的内存分配表,但是程序做内存映射时可就麻烦了,已分配区表需要增加额外的位来标志同一程序的不同块的先后顺序;那不需要离散的程序又用不到这些位,这些位空闲时也得不到合理的使用,那就挺蠢的。

总之,页式存储管理的诞生的重要意义不只是说定个512B~2KB的固定页面然后发现挺好用,而是将内存分配表一分为二,一个给内存,一个给进程,功能也进行分离,自己管自己的。

废话结束,页式存储管理的内容是:将内存空间和地址空间以页为单位进行划分,内存分配和回收以页为单位,全地址的重定位问题也简化为了页的重定位,我们用内存分配表和页表这两个数据结构分别来维护上述两类行为。

3.1 空间划分

单个页面的尺寸太大了解决不了碎片浪费的问题,太小会导致存储页表的开销过大,所以页面尺寸得好好选个数。不过一定是2的整数幂次,除非二进制的时代崩塌了2333。

综合诸因素(书上这么说的,我实在不知道这个结果到底是经过了一些好的指标的测试还是拍脑门凭感觉设置的),大多数分页系统所采用的是页面尺寸是512到2K字节。

3.1 页表

地址空间划分为以512B~2KB大小的页面为单位的若干页,每个页面用一定数量的存储空间来记录它对应的物理页在哪里。

【计算】假设一个进程地址空间为2GB,页的大小为4KB,那么这个进程需要的页面数为219;假设一个物理页需要4字节存放其地址,那么一个页表项的内容就是:(当前页表项序数就是逻辑页页数)【物理页(32bit)】,这就是一个页表项的内容。 页表项大小4B · 页面数219 = 页表大小2MB,再换成以页为单位就是512页。

3.2 内存分配表

以页为单位,记录每个物理页的分配状态。

3.3 内存保护

页表起始寄存器 + 页表长度寄存器,越界检查(硬件完成)。进一步说,整个重定位(地址翻译/内存映射)当然也都是由硬件去完成了,

3.4 重定位过程

0.(前期准备)页表保护寄存器+页表从当前进程加载到内存中;

  1. 逻辑地址切分为页号和页内地址,页内地址用于最后在映射到的物理页中作偏移;
  2. 逻辑页号通过保护寄存器的越界检查;-------> 3.越界异常,硬件处理中断。
  3. 到内存中查页表,得到物理页号;
  4. 物理页号+偏移=物理地址,完成最终寻址。
3.4.1 快表

1–>查快表【逻辑页|物理页】–>找到页号–>4

​ -->没找到–>2–>3–>LRU等替换策略更新快表–>4

【计算】访问主存200ns,访问高速缓存40ns,快表hit rate=90%,重定位寻址时间对比

无快表:200+200=400(ns) 有快表:(200+200)x 10% +(200+40)x 90% = 256(ns),快了36%

[^2021.1.16 11:53]: OMG昨天的完全没保存 枯了orz
[^2021.1.16 11:54]: 不能放弃!重写就好了!

4 段式存储管理

页式主要是解决碎片问题,是从内存的空间利用情况的角度来优化的,它不知不觉中已经牺牲了别的东西:页式分配对用户是不可见的;也就是说,用户无法决定自己的代码可以在哪里被分割;进而,程序的访存效率受到了较大的影响,那些非常需要连续访问的代码段在内存中不连续,为访存带来了不必要的开销。但是我们又不希望回到分区管理的模式。接着,段式存储管理出现,它给了用户“自行划分页面”的权利。它是分区和分页在用户视角下的折衷选择;它也是分页在实现方式上的一个孪生兄弟。

4.1 空间划分

程序人为地被划分为若干段,每段被赋予一个段号,内存中存放程序相关内容时,也以段为单位进行分配和管理。

4.2 段表

每个进程维护一个自己的段表,段表由三个部分组成:逻辑段号+物理基址+段长。段表中的条目按照段号由0开始从小到大连续排序。另外,进程也维护段表的基址+界限寄存器,用于段表被装载到内存之后,保护段表的访问。

这里我不懂为什么需要段号,既然段号是从0开始连续的,那由表头偏移量来查表就行了,就跟页表一样

4.3 内存分配表

已分配表+未分配表,表项=基址+段长+标志,跟分区管理一样的。那么分配时也有首次适配、最好适配、最坏适配;回收时要合并空闲段;也会有较大的碎片问题。

4.4 优缺点

用户可见;碎片问题又出来了(还真是拆东墙补西墙)

另外,用户拥有了“二维地址空间”(X轴:段号 ; Y轴:地址号)

5 段页式存储管理

如果要说前三个方案的关系的话,段式比较像是分区迭代后的版本,虽然还是带着碎片问题,但它能和页式平起平坐。于是才有了进一步地,以页式和段式为基础的优秀融合怪——段页式存储管理。

5.1 空间划分

从用户角度仍然将程序按照程序员的意愿划分为长度、数量不定的若干段,段内的程序逐页划分,零头向上取整。内存则严格逐页划分,分配和管理都以页为单位。

5.2 段页表

(程序员标注后的)逻辑地址 = 逻辑段号 + 段内地址 -> 逻辑段号 + 逻辑页号 + 偏移 -> 物理段号 + 物理页号 + 页内偏移 -> 物理段号 + 段内偏移 -> 物理地址

5.3 内存分配表

​ Bitmap(位示图),内存仍然以提前划分好的页为单位来管理和分配,也就是说段页式保证了页式的内存管理和段式的用户权利(从而提升效率)。

​ 所以必然是好上加好了。

5.4 重定位过程

主要是提几句数据结构:每个进程有一个段表和若干个页表,运行时会放到内存上去,正常重定位就会有三次访问内存(因此快表更有价值了);还有,基址+段长的寄存器也是常驻,每次访问段表、页表都需要越界检查,不要遗漏。

6 覆盖技术和交换技术

本节实现的是内存扩充,在程序规模大于内存能提供的空间限额时,需要对内存重用,重用就是软件概念下的“内存扩充"的本质。不同的重用方式有着不同的效率和限制性。

6.1 覆盖技术

在内存不足以直接装载后入程序时、由程序员预设好的方式,让每个后入程序段在运行时有序地覆盖内存。

需要保证被覆盖内容不影响当前以及未来的程序运行(覆盖技术不涉及将过去已被覆盖程序换回来)。

从用户级实现内存扩充,不过局限性是显然的,人为设计覆盖策略本就是一种开销;对于大规模的程序,人脑也无能为力了。

应用的具体例子是MS-DOS系统。

6.2 交换技术

交换技术是进程在内存和外存的动态调度,不在运行态的程序可以被系统调出内存,暂时放在外存的后备存储区。存储区中有所有进程的副本,当进程被换出时,只需要换出那些被修改过的内容以减小对响应时间的影响。变成运行态的进程则可以换入内存。

应用:分时系统

调度策略:时间片轮转法/基于优先度的调度算法

交换时机:有进程长时间未被调度/内存不够用了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值