存储管理的任务
存储管理一共有三个存储管理任务:
--存储分配
--地址映射
--存储保护
--存储共享
--存储扩充
存储分配:
- 分配基本内存空间
- 增加新的内存空间
- 回收内存空间
逻辑地址:表示相对地址,在外存中。
物理地址:绝对地址,标识内存中的每一个存储单元,在内存中
地址映射:
程序装入内存之后,由操作系统将逻辑地址改为逻辑地址+起始地址,得到的实际的物理地址。
映射的种类:
动态映射:在编译时候,对他进行映射。
静态映射:在程序装入内存时,一次性完成地址转换。(有专门的地址管理部件来进行地址的计算)
存储保护:
防止地址越界,防止操作越权。
存储共享:
为了进程通讯和节约内存空间,两个或者多个进程共用内存中相同的分区。为了节约存储空间。
存储扩充:
采用软件手段,在硬件的配合下,将部分外存空间虚拟为内存空间,并将内存和外存有机的结合起来,得到一个容量相当与外存,速度接近于内存,价格十分便宜的虚拟存储系统。
上面我们简单介绍了操作系统中存储器的使用功能。现在我们来对上面的这些功能处理中遇到的问题来做一些详细的介绍:
内存划分与分配技术
静态划分:
划分预先进行的,创建新进程的时候,在内存中找到一个合适的分区分配给他们。一旦划分完毕,分区大小和数目将不再改变。静态划分分为分区和分页两个方式。
动态划分:
创建新进程时,根据进程申请的空间大小,依照某种方式(下面的四个算法)在这个分区中动态的划分一部分空间。
动态划分涉及到一些动态划分的算法:
首次适应算法:
从一个内存的某一端开始查找,选择一个超过进程申请大小的空闲分区。如果找到的分区的大小恰好与申请的进程的存储空间的大小相同或者相差的很少的话,这个时候,我们就将这个分区全部分配给这个申请进程。否则,系统将这个分区划分为两个分区,一个分区的长度等于进程申请的空间大小,并将其分配给申请进程。然后,将另一个子分区链接到空闲分区链表中。
下次适应算法:
下次适应算法能记住上次分配分区的位置,下次实施分配时,从上次的分配位置之后开始查找,选择一个大小足够的空闲分区。
最佳适应算法:
最差适应算法:
伙伴系统:
就是将系统中的空间,不断二分。
注:在合并的时候,只有伙伴(刚刚之前拆分的存储空间),才可以合并。
程序装入技术
可执行程序的装入步骤:
程序装入
绝对装入:程序运行之前,按照程序的逻辑地址,将程序和数据装入内存指定的地方。(和绝对地址对应)
重定位装入:允许程序装入与逻辑地址不同的物理内存空间。即程序可以装入到内存的任何位置,其逻辑地址与装入内存后的物理地址无关。
运动时动态装入:程序的地址转换不是在装入时进行,而是在程序运行时动态运行。通过重定位寄存器内的起始物理地址和指令或者数据的逻辑地址逐条计算出物理地址。(和相对地址对应,需要重定位寄存器(硬件支持))
程序链接
静态链接:
静态链接效果图:
动态链接:
动态链接可以分为装入时动态链接和运行时动态链接。
一、装入时动态链接(Load-Time Dynamic linking):是在目标模块装入内存时,边装入边链接。即在装入一个目标模块时,若发现一个外部模块调用,即引起装入程序去找出相应的外部模块,并将它装入内存以及修改目标模块中的相对地址。 二、运行时动态链接(Run-Time Dynamic linking): 这种链接方式,可将某些目标模块的链接,推迟到执行时才进行。即在执行过程中,若发现一个被调用模块尚未装入内存时,由OS去找到该模块,将它装入内存,并把它链接到调用者模块上。
简单存储管理技术
为了实现的简单,操作系统必须要将待执行的程序全部装入内存。
连续存储:
需要内存中的一块连续的足够大得分区。
非连续存储:
允许进程的程序和数据分别装在内存的不同分区中。
非连续存储的存储方法:
简单分页存储管理:
页框:系统事先将物理内存划分成许多尺寸相等的页框,并将进程划分成许多大小相同的页面,页面与页框大小相等。
页面:装入内存时进程被分割成许多个页面,每一个页面的指令和数据是连续的,他们的地址相对于其所属页的第一条语句的地址,称为页内偏移量。就是说进程逻辑地址被分为两个部分:页号和页内偏移量。
页表:系统为每一个进程建立一张页面映射表。用于记载进程中的各个页面到物理内存中页框的映射信息。
页表寄存器:页表基地址寄存器用来指向页表的起始地址;页表长度寄存器用来指示页表的大小,即对于当前任务,它总共包含有多少个页面。
下面是一个页面存储管理的地址转换过程
(文字描述)
(图片描述)
简单分段存储管理:
段的概念:基于模块化的程序设计时,常常需要将一个大任务划分为若干相对独立的子任务,对应的子任务编写子程序,称为段。就是说一个段,就是一个大程序中的子程序。
处理:当一个进程被装入物理内存时,系统将为该进程的每一段独立的分配一个分区。同一个进程中的多段不必存放在连续的多个分区中。
段表:每一个进程建立一个,用于描述进程的分段情况,记载进程的各个段的物理内存中分区的映射情况。(其中包括段号,段长,段基址以及对本段的存取控制权限等信息)
段的操作:
简单段页式储存管理(上面两种技术的组合):
概述:采用分段方法组织用户程序,采用分页方法分配和管理内存。
逻辑地址:
数据结构:
地址变换过程:
虚拟存储管理技术
虚拟存储:通过系统提供缺页/段中断功能和交换技术,动态装入进程的程序代码和数据,使得一个打得用户程序能在一个相对较小的内存空间中运行,也使得有限的内存能同时容量更多的进程。
虚拟存储的地址转换方式:
虚拟存储管理的方式:
虚拟存储分页系统:
虚拟存储分段系统:
虚拟存储段页式系统:
虚拟存储系统的软件策略:
- 驻留集管理:虚拟存储系统中,每个进程驻留在内存的页面集合,或进程分到的物理页框集合。
- 页面放置策略:系统应当在内存的什么位置为活跃进程分配页框。可以考虑首次适应算法,下次适应算法,最佳适应算法,最差适应算法等等。
- 页面获取策略:系统需要何时把一个页面装入内存
- 页面置换策略:当发生缺页中断且无足够内存空间时,需要置换已有的某些(个)页面。
- 页面置换算法:最佳置换算法,最近最少使用算法,先进先出算法,时钟算法。(与上面的页面置换策略相结合,是页面置换策略中的一部分。)
- 页面清除策略:将由页面置换算法选择的被修改的置换页面保存到外存。如果是未修改的页面,则不保存到外存,也不需要保存到外存。
驻留集管理中有固定分配策略和可变分配策略:
可变分配策略:
当进程的缺页率和高的时候,驻留集太小,需要增加页框;当缺页率一段时间内都保持很低时,可以在不会明显增加进程缺页录的前提下,回收其中一部分页框,减小进程的驻留集。
固定分配策略:
为每一个进程分配固定数量的页框。即在每一个活跃的驻留集尺寸在运行期间固定不变。
页面获取策略有下面两种:
请求调页方式:仅当进程执行过程中,通过检查页表发现相应页面不在内存中,才装入改页面。
预调页方式:当进程创建时,预先为进程装入多个页面。
页面置换策略有下面两种方式:
局部置换策略:系统在进程自身的驻留集中判断当前时候存在空闲页框,并在其中进行置换。
全局置换策略:?在整个内存空间内判断有无空闲页框,并允许从其他进程的驻留集中选择一个页面换出内存。
页面置换策略中的页面置换算法:
最佳置换算法:被置换的页面是将来不在访问,或者在最远的将来才会被访问的页面。(这个算法无法实现)?
最近最少使用算法:根据页面装入内存以后的使用情况,选择淘汰最近最久未使用的一个页面,置换这个页面。
先进先出置换算法:淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。在实现时,只需把一个进程已调入内存的页面,按照先后次序链接成一个队列,并设置一个指针,使它总是指向最老的页面。
时钟算法:
时钟置换算法图解:
时钟置换算法的实际例子:
(星号表示U为1,没有表示U为0)
页面清除策略
主要用到一种页缓冲技术。