上篇介绍了存储器的相关知识,偏重的是硬件结构,本篇介绍存储管理的相关知识,偏重的是软件管理。
1 存储管理概念
操作系统,包括嵌入式系统,通常利用存储管理单元MMU(Memory Management Unit)来提供内存保护机制,实现系统内核与应用程序,应用程序与应用程序之间的隔离。
内存保护包括两个方面:
- 防止地址越界:对于多个应用程序,每个应用程序都有自己独立的地址空间。
- 防止操作越界:对于多个应用程序共享的内存区域,每个应用程序都有自己的访问权限。
存储管理的方式,通常可以分为一下几类:分区存储,页式存储,段式存储
2 分区存储
分区存储又可分为两类:
- 固定分区存储:分区大小是固定的可变分区存储:分区大小是可变的
2.1 固定分区存储
固定分区,是指分区的个数、位置、大小一旦确定后,就不再变化了。另外,分区的大小可以是相等的,也可以是不相等的。
对于新任务到来后的内存分配原则,有两种:
- 多个输入队列:对于每一个用户分区,都有一个相应的输入队列。当一个新任务到来时,就把它加入到对应的队列中,要求这个队列对应的分区,是能够装得下该任务的最小分区。单个输入队列:所有的用户分区只设置一个输入队列。当一个新任务到来时,就把它加入到对应的队列中,当某个分区空闲时,就从队列中选择合适的任务去占用这个分区,在任务选择时,可以有两种分配方法:
-
- 方式一:选择离对首最近的且能够装入这个分区的任务。当选中的是较小的任务时,则会浪费大量内存空间。方式二:先搜索整个队列,选择能够装入这个分区的最大任务,尽可能减小空间浪费。
对于固定分区:
- 优点:易于实现,系统开销较小(空闲空间管理、内存分配与回收算法复杂度低)缺点:内存利用率不高,产生内存碎片;分区总数固定,限制了并发程序的个数
2.2 可变分区存储
可变分区,是指分区不是预先划分的,而实动态创建的,在装入一个程序时,系统根据它的需求和内存空间的使用情况来决定是否分配。
当一个程序开始运行,要求装入内存时,系统就会从空闲区划出一块进行分配;当程序运行完则释放存储区域,变为空闲区。
在具体实现可变分区管理时,需考虑三个方面问题:
-
- 内存管理的数据结构:系统会维护一个分区链表,记录每个内存分区的情况(分配状态、起始地址、长度等)内存的分配算法:当新任务到来时,需决策分配到哪个空闲分区,通常有4种分配法 :
-
- 最先匹配法:从链表头,按顺序找到第一个能装入新任务的空闲分区。接着把该空闲分区中按照任务大小分割,剩余的部分仍是一个空闲分区,将任务装入,并更新分区链表下次匹配法:与最优匹配法类似,区别是每次分配后记录位置,下次再分区时从此位置开始查找,而不是从固定的链表头开始查找最佳匹配法:将新任务状态与其大小最接近的空闲分区中。这种方法最大的缺点是产生的空闲分区可能很小而无法使用最坏匹配法:每次都选用最大的分区进行分配,避免出现不可用的极小分区,但较大的空闲分区也不被保留
-
内存的回收算法:当任务运行结束释放内存时,若有相邻的空闲分区,则需要合并为一个大的空闲分区,并更新分区链表
对于内存的分配算法,可以看下如下实例:某计算机系统内存大小128k,采用可变分区分配方式进行内存分配,当前系统的内存分块情况如下图左图,现有一个作业4要分配9k的内存,这这种分配算法的分区情况如下图右边4个子图所示
可变分区改善了固定分区的一些缺点,但作为分区存储本身,仍有一些无法解决的问题:
- 当进程运行所需的内存大于系统内存时,则无法将整个进程一起调入内存,从而无法运行该程序
3 页式存储
页式存储,将进程空间分配为一个个页,同时将系统内存也分配为一个个页,例如都是4K的大小。
这样,运行程序时,每次将需要运行的逻辑页状态内存中,运行完再装入下一个要运行的页,这样就解决了空间极大的进程运行的问题。
对于逻辑页,可以用页号和页内地址表示:
- 页号:与内存中的物理块号并不是对应的,需要通过查询“页表”得到对应的物理块号业内地址:或称页内偏移量,与内存中的物理偏移地址是一致的
比如上图中,其地址长度32位,页号占用20位,页内地址占用12位,则页面总数为2^20=1024K=1M个,页面大小为2^12=4K
对于页表的表示,如下图,左边是进程中的页号,通过查询页表,可以得到右边内存中对应的块号。
通过页表的方式,可以实现从逻辑地址到物理地址的转换。
- 逻辑地址:页号+业内偏移物理地址:物理块号+页内偏移地址
两种地址的页内偏移是一样的,所以地址转换,只需要先计算出页号与物理块号的转换关系,即可进行地址转换。
页式存储的地址转换,可看如下实例:
题目:页面大小L为1k字节,页号2对应的内存块号b=8,将逻辑地址A=2500转换为物理地址E
由题目可得如下分析:
- 页面大小1k,则页内地址占用10位逻辑地址2500转为16进制为0x09C4,取低10位为业内地址,即0x01C4,页号为0x02由题目知页号为0x02对应的内存块号为8,对应的16进制为0x08,将其与业内地址组合,可得物理地址为0x0x21C4,十进制即为8644。
或直接使用十进制计算:
页号P=A/L=2500/1024=2,由题目知,其对应的内存块号为8
业内偏移w=A%L=2500%1024=452
则物理地址为:
E=b*L+w=8*1024+452=8644
页式存储的优缺点:
- 优点:内存利用率高,内存碎片小,分配与管理简单缺点:增加了系统的开销,可能产生抖动现象
4 段式存储
段式存储与页式存储比较相似,区别是段式存储不是按照固定的大小分割内存,而是根据进程的逻辑功能进行空间画法,这样便于内存共享,只是每段的空间大小不同。
4.1 基本原理
与页式存储类似,段式存储每段的表示,由段号和段内地址组成。
从逻辑地址到物理地址的转换,则是通过段表的查询来实现。
看一个实例,例如,某进程的段表内容如下,当访问段号2,段内地址400的逻辑地址时,进行地址转换则会出现越界异常
段号 | 段长 | 内存起始地址 | 权限 | 状态 |
---|---|---|---|---|
0 | 100 | 6000 | 只读 | 在内存 |
1 | 200 | -- | 读写 | 不在内存 |
2 | 300 | 4000 | 读写 | 在内存 |
因为段号2对应的段长只有300,而段内地址400则超出了范围,地址4400为非法地址
4.2 段页式存储
段页式存储,则是将段式存储和页式存储结合起来使用,对进程空间先分段,再分页。
段页式存储优缺点:
- 优点:空间浪费小,便于存储共享与存储保护,可以动态链接缺点:管理的复杂度与开销增大,需要的硬件增加,执行速度下降
5 总结
本篇介绍了存储管理的相关知识,包括存储管理的分类:分区存储、页式存储和段式存储,已经不同存储方式的地址转换方式与优缺点等。