操作系统-存储器管理
一个free talk。
计算机用于存储记忆的部分。
所有存储介质都算在其中。
存储管理,就是如何使用计算机的存储设备来存储内容的方式。
好比,你怎么利用你的抽屉来放东西。
所以很多人提出了观点。
都是一些,实际解决中,抽象出来的方式。
所以,如果自己可以设计更好的,那就可以用更好的,只要能解决问题,就行。
存储器主要存什么?
程序和数据。
一个程序要运行,程序代码以及相应的被使用的数据,都将被装载入内存之中。
这里我们将这两个东西绑在一起。
程序装入发展史
1.绝对装入
逻辑地址和物理地址,直接一一对应。
(这种方式,很直接,但是简直是写程序的时候,你要知道底层,不适合推广,不通用。
说起来操作系统引导的时候,读的那些内容,绝对是逻辑地址对应物理地址了吧。
)
2.静态重定位装入
物理地址不是原来 程序的逻辑地址,
逻辑地址变成偏移地址,然后,物理地址= 基础地址+偏移地址。
(当然这只是一种思路,可以有其他的换算方式。当然我听说过这一种。
中断发生的时候,去中断表中找对应的代码,也算是一种重定向吧。这个其实挺常见。
)
静态= 逻辑地址到物理地址的变化过程在程序运行前完成,在执行期间不再改变。
3.动态重定位装入
静态的方式,程序运行时,不能再内存中移动或是重新定位地址。
在虚拟存储器管理中,用户程序代码多次换出还如内存,每次地址都会变。
所以需要这种。
4.覆盖技术
当内存不够用,
代码不是一次性执行完,分成多个阶段,那就阶段一运行完,
阶段二放入内存,覆盖阶段一的代码位置,继续运行
这种方式,肯定比直接全部装入运行慢,因为要再读阶段二,
但是,内存不足的情况下,可以运行更大的程序。
5.紧凑技术
连续存储空间管理
1.单一连续分配
2.固定 分区分配方式
内存切成固定大小,可以是等大的,也可以是不等大的
3.可变分区分配方式
将空闲的分区以链表的方式连起来,也可以是索引表的方式
分区分配算法:
1.首次适应法
从头开始,循环链表,找到可以放得直接放进去
2.循环首次适应法
每次循环到一个位置,从那个位置继续循环,找到直接放进去,不从头开始
3.最优适应法
遍历,找到最小的,放得下的。
4,最差适应法。
最大的放得下的。
5.快速适应法
设置多个空闲分区链,
每个链根据空闲分区的大小来设置,
分配的时候,根据要分配的大小去不同的位置找。
分配的时候,空间,减去用去的 = 剩余的,然后加到链表中。
回收的时候,如果,腾出来的空间,是相邻的就合并。
分页存储
内存,按页切割,每个页大小相同
然后程序维护分页表。
物理地址计算,逻辑地址有个页号,以及偏移地址。
页表存了页号对应的逻辑地址
快表。TLB
多级分页。
分段
分页虽然挺好的,但是一旦程序发生了变化,动态加载导致段寄存器变成,那么整个页表都要收影响,
所以按段来进行切割。
段页式
两种合并
虚拟存储器
缺页中断
#调页算法
决定何时将进程需要页调入内存
1.请求就调入
2.预先调入
#分配策略
应该分配多少物理内存给程序
1.平均分配
2.进程按比例分配
3.优先权分配
#内存置换策略
决定内存中哪些被换出
(可以全局置换,程序A缺页,置换出去的,所有操作系统中的程序的某一页。
局部置换,程序A缺页,置换出去的是,该程序的某一页。
一般全局的好一点,因为,有的程序就是不怎么跑,把那段代码换出去。
不然有可能局部置换,换的很频繁,因为空间不足。
有的分配的多的,其实都没跑,空间一直没回收回来。)
--------页面置换算法:
1.先进先出
2。最佳置换
3.最近最久未被使用
就是如果最近没被使用,最久没被使用,缺页的时候移除去。
实现方式:计数器,堆栈式。堆栈好。
4.时钟置换算法
有一个状态值,记录了是否被访问过,一个记录是否被修改过,