单用户单道程序
每次只用装入一个作业,这个作业执行完毕释放内存之后再装入下一个
是最简单的存储管理方式,主存只有一个作业在执行,存储保护很容易实现
因为主要用于古早的单道批处理系统,单用户单任务系统,所以这里使用比较古早的”作业“的概念
多用户多道程序
把主存划分为多个区域,每个区域给一个进程使用
固定式分区
多道程序最简单的存储器管理方式
- 先把主存话分成几个大小不等的区域
- 进程装入的时候选择一个空闲的,适合该进程的最小的分区分配给该进程
- 如果找不到合适的空闲区则让其等待
上图中会把150大小的分配给进程
缺点:会浪费一部分主存
比如上面的例子中,大小100 的进程占用了大小150的分区,就有50大小的主存没有利用上。
此时需要记录每一个分区的大小和占用情况才能在装入新进程的时候选择。
分区说明表
固定式分区采用分区说明表记录上述信息,在将一个空闲分区分配出去之后,修改它在分区说明表中的对应占用标识。在一个进程释放一个分区的时候,也要在分区说明表中修改对应分区的占用情况。
可变式分区
根据进程的大小动态的划分主存。主存中分区的数量和大小因而是不确定的。
分配空闲区的算法
每次有一个进程即将装入的时候,选择一个合适的空闲区(选择的方式见下文)。把这个空闲区中的一部分分给该进程(刚好够用的大小就行),剩下的部分仍保持空闲。
首次适应法
找到第一个可以满足进程的空闲区。把这个空闲区中的一部分分给该进程(刚好够用的大小就行),剩下的部分仍保持空闲
选择大小120的分配后
最佳适应法
找到所有空闲区中最小的可以满足进程的空闲区 (最优指的是分配后剩下的空闲区最小)
举个例子:
选择大小110的分配后
缺点:因为要遍历每一个空闲区,所以时间话费比较大;而且每次分配之后剩下的空闲区会比较小,因此会出现很多无用的碎片
(比如剩下大小为10的空闲区,可能之后根本没有这么小的进程来,那它就被闲置了,浪费了)
最坏适应法
找到所有空闲区中最大的可以满足进程的空闲区 (最优指的是分配后剩下的空闲区最大)
这样分配之后剩下的空闲区就比较大,解决了最优适应法中出现的问题
缺点:但是这样之后可能就满足不了大的进程了
(在上面那个例子中用最坏适应法会选择150大小的空闲区,分配之后剩下的50大小空闲区,如果之后出现一个150大小的进程,那就满足不了它了)
空闲区管理(分区说明表和空闲链表
空闲区链表,每块空闲区开头的一点空间中有:
- 状态位0是空闲,1是已经分配,
- 分区大小
- 指向下一个空闲分区的指针(双向链表的话有两个)
分区说明表比固定式分区的分区说明表要多一个已分配分区的表
覆盖与交换技术
”覆盖“和”交换”是两种技术,都是为了解决比较大的进程不能整个放入小主存的问题。
大概知道点行了,考试不考很细
覆盖
多用于早起操作系统,只针对一个进程内部。
覆盖技术允许同一个进程中的不会同时执行的代码段共用一段主存。
(据说需要用户程序编程的时候就给出覆盖结构,具体是怎么覆盖上去的,我不了解,书里也没有,老师可能说了,但是这节课我确定我在玩手机,反正考试也不要求 )
交换
多用于现代操作系统,是针对不同的进程之间
交换技术常用在分时系统(之后补上要是我还记得就挂个传送门 )
交换就是把当前正在运行的进程的全部或者部分信息从主存移到外存,再从外存把其他进程或者部分的进程移到主存。
然后交换的时候尽可能的保证交换的部分尽量少
“交换”技术可以和多用户多道程序系统结合
这两种听着都挺麻烦的