背景概念
- 计算机中的存储器分为:内存、外存
- 处理器可以直接访问内存,也就是cpu只能从内存中取指令干活。只有在启动输入输出设备之后才能和外存交换信息
- 计算机运行不同的程序,这些程序的可执行文件都在内存里,需要由os统一管理才不会乱。
存储体系
存储组织形式包括:寄存器-缓存-内存-外存(速度由左至右越来越慢)
存储管理的功能
一、内存空间是什么
由存储单元(字或节)组成的一维连续地址空间,用来存放当前正在运行的程序代码和数据。
二、内存的分配和回收
1、记住每个存储区域的状态,使用相应表格记录内存空间使用状态,是已分配or空闲。(记录当前谁在上班,谁在休息)
2、用户提出申请之后,按需分配,修改表格
3、回收用户释放的区域,并修改表格。
三、存储保护
由于os和用户程序都在内存里,可能互相干扰和冲突,因此需要存储保护:地址越界保护、权限保护(读写可执行权限)
四、地址转换
- 名字空间:汇编和语言编写的代码里通过符号名来访问程序和数据,这些符号的集合
- 相对地址空间/地址空间:存放相对地址的集合(目标程序中的地址是相对地址,又叫逻辑地址)
- 绝对地址空间/存储空间:物理内存的绝对地址的集合
分配内存一定是分配一段连续的地址空间,起始地址不固定,而且逻辑地址和绝对地址基本都不一致,因此必须进行地址重定位(地址映射/地址转换)。
重定位
1、静态重定位
步骤:
在程序执行之前重定位,生成重定位表,此时表内仍是相对地址,然后把装配模块和重定位表一起装入内存,然后根据内存起始位置直接修改地址相关指令。
优点:
无需硬件支持
缺点:
重定位后不能再在内存里移动、
只能放在连续空间内
2、动态重定位
步骤:
在程序执行过程中进行重定位,只有每次访问内存单元才地址转换。os知道实际起始地址,通过减去相对基地址后把差值存在定位寄存器里,在cpu执行访存指令的时候再把差值和相对地址相加,即得到了绝对地址。
优点:
装入内存时不用修改模块里的地址、
碎片少、
装入存储区域不必相邻,只要有对应的定位寄存器即可
缺点:
需要硬件支持(寄存器和加法器)
存储共享
多个进程共同使用同一程序,此程序存放的内存区就是共享内存区,包括代码共享和数据共享。
分区存储管理
基本思想:把内存划分成若干个连续的区域,称为分区。
特点:每个分区只存储一个程序,且程序只能在它所驻留的分区中运行。
问题:内碎片、外碎片的产生
维护的数据结构:分区表(分区链表)
一、固定式分区
思想:预先把内存分成若干大小不同,但固定的区域,设置分区表(区号、区域大小、区域起始地址、是否已被分配标志),运行中不可更改各分区大小。
原理:找到一个能容下作业所需内存量大小的空闲的分区给它。
缺点:总有浪费,因为基本不可能出现分区大小和作业所需内存量大小刚好相等的情况。
二、可变式分区
思想:装入程序时才划分内存分区,使得作业所需内存量刚好和分区大小相等,分区个数也可变。回收撤除作业时,会检查回收的分区是否与其他空闲分区邻接,如果是则合并形成连续更大的空闲分区。
关键点:①如何记录占用方式 ②分配和回收算法
①分区说明表
两张:P表和F表
P表:说明已分配的分区
F表:说明空闲的分区
②分配算法
1、最佳适应算法(best fit):从全部空闲区中找到能满足作业需求量最小的空闲分区分配之。(重点关注如何让碎片小)【要求表项从小到大排序】
2、最先适应算法(first fit):按序查找,把最先找到的满足需求的空闲区分配之(主要减少查找时间)【要求分区从低地址到高地址排】
3、最坏适应算法(worst fit):使剩下的空区最大,减少空区碎片机会
4、下次适应算法(next fit):将空闲区链成环形链,每次分配从上次分配的位置开始查找合适的空闲区。