操作系统在储存需要干什么?
分配和回收
扩容
逻辑地址到物理地址的转换
程序运行流程
编译-链接-装入(内存)
将高级语言转换为机器语言
将各个模块链接成一个可执行文件,并编地址
将模块装入内存
- 绝对装入
- 编译时,将相对地址转换为绝对地址(物理地址),需要预先知道放在那,一遍只适用于单道
- 静态重定位
- 装入时,将相对地址转换为绝对地址,在装入时需要分配全部空间(区别于动态重定位)
- 动态重定位
- 设置一个重定位寄存器(存放起始地址),在运行时,通过寄存器还原出物理地址可以先将部分代码装入内存
内存的扩充
-
覆盖技术
- 将一个程序划分为常用和不常用,分别储存在固定区(常驻内存)和覆盖区(数据用完就调出内存)
-
交换技术
- 也就是进程挂起,在磁盘中开辟出一块交换区(swap)来储存这些挂起的进程,当内存紧张时把优先级低的进程从内存调入交换区。
-
虚拟存储技术
- 程序不需要全部装入内存,动态装入,详细在第四章
内存的分配与回收
外部碎片 空闲区空间太小而无法利用
内部碎片 已经被分配给进程的内存区域,却没有被利用
连续分配
连续分配 分配的是一块连续区域
-
单一连续分配
-
一个程序占整个内存
-
优点
- 简单;无外部碎片;不需要内存保护
-
缺点
- 内部碎片太多 ;内存利用率低
-
固定分区分配
-
分成大小相等的区域,或者大小不等的区域(增加灵活性),每个区域装入一道作业
-
优点
- 无外部碎片
-
缺点
- 会有内部碎片
-
动态连续分配
- 不再预先划分内存,而是在装入时动态分配,由此引出了几个问题
-
如何记录这些内存
- 使用空闲分区,并制作一张空闲分区表可以使用链表或者数组
-
如何分配
-
首次适应算法(综合最优)
- 每次从低地址开始,放入第一个合适的空闲区
- 优点
- 算法开销小,高地址部分会有大的空闲分区
-
邻近适应算法
- 每次从上一个位置开始,依次向高地址寻找
- 优点
- 算法开销小,
- 缺点
- 每个空闲区都有占用,很难为大进程分配大分区
-
最佳适应算法
- 分配到能够装入进程且最小的空闲区中
- 优点
- 会保留大的空闲分区
- 缺点
- 算法开销大,产生小的外部碎片
-
最坏适应算法
- 分配到最大的空闲分区中
- 优点
- 产生的外部碎片少
- 缺点
- 算法开销大,难以保留大分区
-
排序问题
- 首次和邻近是按地址编址,也就是初始编址所以算法开销小
- 最佳和最坏的实现需要按照空间编址,所以算法开销大
-
-
紧凑技术
- 移动内存中的程序,让多个小的的外部碎片“合并”能用的空闲分区。在移动过程中地址会发生变化,需要利用重定向技术,设置重定向寄存器记录初始位置。
-
如何回收
- 有相邻就合并,无相邻需要增加表项。
我说写着这么熟悉,很久以前写过了…我选择偷懒
总结
- 储存的分配和回收
- 连续分配,并给出了动态的几种算法
- 离散分配的段页式
- 储存的扩容
- 虚拟存储技术,并在段页式的基础上加上了虚拟技术
- 虚拟技术提出页面替换产生的内存分配合更换策略之后就是替换算法
- 地址转换
- 重定位