内存管理
OS系统的基本知识,隔久又见忘了,写下博文温故而知新!
由于本章节内存管理中主要讲述连续分配方式、基本分页分配方式和基本分段分配方式。所以一些细枝末节的东西能减即简。围绕主题,突出重点。
1、存储管理必须能够实现内存分配、地址变换、存储保护、存储共享、存储扩充等功能;
2、连续分配方式包含四大部分:
A、单一连续分配(针对单道程序系统,内存只需要划分为系统区和用户区)
B、固定分区分配:将内存空间划分为多个分区,每个分区只装入一道作业,在OS初始时就确定大小。该方式存在两个BUG,其一,系统能运行的最大作业受到最大分区的尺寸的限制;其二,作业大小不可能和分区大小完全吻合,于是会有一个浪费区域称为内碎片。
C、动态分区分配:事先不划定分区的大小,根据进程的大小动态为之分配内存空间。此方式内存管理常用数据结构为空闲分区表和空闲分区链。分配策略有FF、NF、BF、WF。
D、可重定位分区分配:需要内存紧凑技术(即将空闲小分区合并成一个大空闲分区)和重定位(将逻辑地址转换成物理地址)。
重定位又可划分为静态重定位(当用户程序加载到内存时,一次性实现逻辑地址到物理地址的转换,当程序位置改变,地址需要重新计算),动态重定位(在进程执行过程中进行地址变换,即逐条指令执行时完成地址转换,需要重定位寄存器(内存管理单元,Memory Management Unit)的支持,MMU存储进程的首地址,计算物理地址时,由逻辑地址+首地址得出)
3、交换和覆盖
A、交换:指把内存中暂时不用的程序和数据换出到外存上,以释放内存空间,当换到外存的数据再次使用时,再把它们换入内存。
B、覆盖:指把程序划分成若干个功能相对独立的程序段,按照其自身逻辑结构将那些不会同时执行的程序段共享同一块内存区域(正因为不会同时运行,所以前面运行完的程序,后面可在同一内存位置将覆盖)。这是因为程序太大啦!超出内存范围,就需要将程序划分若干功能相对独立的程序段,分时执行。
4、基本分页分配方式
A、将作业的逻辑地址划分成一系列同等大小的部分
B、给页编号,即22位=4MB;页内偏移量,即10位=1KB
C、页表:页号与块号的映射关系表
D、地址变换原理:
i)、将逻辑地址拆分为页号与页内偏移量
ii)、将页号与页表长度比较,判断是否越界
iii)、查找页表,寻找页号对尖的块号
iv)、将块号与块内偏移量组合,即为物理地址
E、多级页表:外层页号与内层页号建立一级页表;内层页号与物理块号建军立二级页表。
F、出现的问题:
i)、要求整个作业都要装入内存运行,即没有解决大作业小内存问题
ii)、纯粹从存储的角度去考虑,没有考虑到程序本身的逻辑关系
5、基本分段分配方式
完善了逻辑上完整性,代码段的动态增长,动态链接,保护与共享。
A、段:为了一个程序提供多个相互独立的地址空间
实现了段长度的扩充,段的动态链接以及段的保护和共享。
B、逻辑地址分成:段号、段内地址
C、段表:段号、起始地址(基址)、段长
D、地址变换原理
i)、将逻辑地址拆分成段号与段内地址;
ii)、段号与段表长度比较,判断是否越界;
iii)、段号为索引,查找段号在段表中的位置,进而得到基址;
iv)、段内地址与段长比较,判断地址是否有效;
v)、物理地址即为基址与段内地址之和。
6. 基本段页式存储
6.1. 步骤
³ 用户程序先分段,每个段内部再分页(内部原理同基本的分页、分段相同)
6.2. 地址结构
分三部分:段号、段内页号、页内地址
6.3. 地址映射(逻辑地址--->物理地址)
³ 逻辑地址----- >段号、段内页号、业内地址
³ 段表寄存器--- >段表始址
³ 段号+段表始址---- >页表始址
³ 页表始址+段内页号----->存储块号
³ 块号+页内地址------>物理地址
6.4. 地址变换原理及步骤
请看上图,给出逻辑地址的段号、页号、页内地址,开始进行地址变换:
1) 在被调进程的PCB中取出段表始址和段表长度,装入段表寄存器
2) 段号与控制寄存器的页表长度比较,若页号大于等于段表长度,发生地址越界中断,停止调用,否则继续
3) 由段号结合段表始址求出页表始址和页表大小
4) 页号与段表的页表大小比较,若页号大于等于页表大小,发生地址越界中断,停止调用,否则继续
5) 由页表始址结合段内页号求出存储块号
6) 存储块号&页内地址,即得物理地址
以上即为段页式存储的原理及整个过程……
7、保护
除了进地段长越界检查外,在进程段表中增加权限位。
8、共享
通过不同进程表中的行指向同一段基址来实现。
9、分页存储管理与分段存储管理的主要区别如下:
i)、页是信息的物理单位,分页的主要目的是减少内存的外碎片,提高内存的利用率。分页是由于系统管理的需求,而不是用户的需求。段是信息的逻辑单位,分段的目的是为了程序的完整性,是为了满足用户的需求。
Ii)、页的大小是固定的,取决于系统,由系统自动把地址分成页号和块号。段的长度是不固定的,并且可以不断变化。
Iii)、分页的地址空间是一维的(怎么理解呢?不也是拆分成页号和页偏移量么),即单一的线性地址空间,程序员只需利用一个记忆符就可以标识一个地址;分段的地址空间是二维的,程序员在标识一个地址时,既要给出段名,又要给出段内地址。
本文章第六部分参考博文链接:
https://blog.csdn.net/wang379275614/article/details/13765599