操作系统学习(三)
存储器管理
目录
内存分配有三种方式:
目的:提高内存的利用率
- 连续
- 非连续
- 虚拟
内存保护有两种:
- 越界保护
- 读写保护
地址映射(转换)
内存扩充
back
程序的装入和链接
程序要在系统中运行,必须先装入内存,然后变成一个可执行的程序,通常有一下几个步骤:
- 编译
- 链接
- 装入
作业的整个过程
- 开始
- 编辑
- 编译
- 链接
- 装入
- 运行
- 完成
如图:
进程的整个生命周期在作业的运行状态
back
地址映射(转换),重定位
定义:逻辑地址到物理地址的转换叫地址映射
- 逻辑地址(相对地址)
- 装入模块中指令和数据的地址是相对于装入模块的首字节二编址的,因此被称作相对地址或逻辑地址
- 用户编程时用到的地址,从“0”开始。相对地址的集合被叫做相对地址空间,或者逻辑地址空间,也简称为地址空间
- 物理地址(绝对地址)
程序运行时在内存中真实的地址
- 地址映射
逻辑地址到物理地址的转换过程
back
程序的装入
- 绝对装入:固定的地方
- 可从定位装入:装入时完成
静态重定位:
- 动态装入:动态运行时装入
动态重定位:重定位不应该在装入时进行,而应该将它推迟到程序真正执行时进行
比较:
名称 | 外存中形式 | 内存中形式 | 特点 | 实现 | 时间 |
---|---|---|---|---|---|
绝对装入(固定的地方) | 物理 | 物理 | 固定 | 软件 | 编译 |
可重定位装入(装入时完成) | 逻辑 | 物理 | 不固定 | 软件 | 装入 |
动态装入(动态运行时装入) | 逻辑 | 逻辑 | 可移动,不固定 | 硬件 | 运行 |
back
程序的链接
- 静态链接方式
指在程序运行之前,将各目标模块及它们所需的库函数,链接成一个完整的装入模块,以后不再拆开
- 装入时动态链接
装入时动态链接是指链接在装入时进行,优点是便于对程序模块进行修改和更正,并且可以对外存中的目标模块实现共享
- 运行时动态链接
在执行过程中,若发现一个被调用模块尚未装入内存,便立即由OS找出该模块,将它装入内存,并把它链接到调用者模块上,优点:便于实现目标模块的修改、更新和共享,还可以加快内存的装入过程,提高内存利用率
back
单一连续分配
将内存分成系统区和用户区
两部分,系统需仅供OS使用。
优点:
- 管理简单,开销小
缺点:
- 资源利用率低
back
固定分区分配
将内存的用户空间划分成若干个区域,这些分区的大小和边界在系统运行期间不再变化,并只允许在每个分区中装入一道作业
优点:
- 可以使多道程序共存于内存中
缺点:
- 内存中程序的道数仍将受到分区个数的限制
- 当用户程序与分配到的分区大小不符时,将造成分区内存存储空间的浪费,产生内部碎片
- 用户程序的大小受到分区大小的严格限制
back
动态分区分配
每次装入作业时,动态地为作业从可用内存中划分出一个分区,其大小刚好能满足作业的实际需要,内存中分区的个数和每个分区的大小将随着系统中运行的作业情况而变化
分配算法:
- 首次适应算法
将空闲分区按起始地址递增的次序排列,每次分配均从空闲分区表或空闲分区链首开始顺序查找,并从第一个能满足要求的空闲分区中划分出作业要求的空间分配出去
优点:
- 快
缺点:
- 难以利用小空闲的分区
- 增加查找的开销
- 循环首次适应算法
由首次适应算法演变而成,每次分配均从上次分配的位置之后开始查找
优点:
- 使得空闲分区分布得更均匀,减少查找空闲分区的开销
缺点:
- 使存储器中缺乏大的空闲分区
- 最佳适应算法
将空闲分区按大小递增的次序排序,将能满足最小的空闲分区分配出去
缺点:
- 每次分配后所个剩下来的剩余部分总是最小的,会在内存中留下大量难以利用的小空闲分区
- 最坏适应算法
将空闲分区按大小的次序排列,将能满足要求的最大空闲分区分配出去
优点:
- 产生碎片的几率最小
缺点:
- 使内存区缺乏大的空闲分区,不利于大作业
back
回收
当作业进行完成的时候,需要进行回收。系统将检查是否有空闲分区与回收区相邻,如果有,那么修改空闲分区或空闲分区链将他们进行合并。回收区合并后得到的新空闲分区将根据分配算法按它的起始地址或分区大小插入空闲分区表或空闲分区链