操作系统笔记
原作者视频地址:https://www.bilibili.com/video/BV1YE411D7nH?spm_id_from=333.337.search-card.all.click
本人为自学整理的文档
第三部分:内存管理
基本概念:操作系统对内存的划分和动态分配
内存管理的主要功能
1.对内存的分配与回收
2.从逻辑上对内存空间进行扩充
3.用户进程中的逻辑地址和物理内存中的物理地址进行高速转换
4.存储保护
进程运行的基本原理
1.进程的生成
编译:源程序->目标模块->目标模块整合函数库形成程序包
链接:将链接程序形成装入模块(静态链接;装入时动态链接;运行时动态链接,占用内存空间小),形成逻辑地址
装入:装载程序到内存,形成进程(绝对装入,装入绝对地址;可重定位装入,静态重定位装入,计算出绝对地址后一次完成不可修改;动态运行时装入,执行时才计算绝对地址装入内存),形成物理地址
2.内存保护
内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。内存保护可采取两种方法:
1)在CPU中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
2)采用重定位寄存器(或基址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器:内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。
3.内存扩充(逻辑上扩充,物理上不变):
1.覆盖—>将内存划分成固定区和覆盖区,必须要求进程明确指出哪些可以覆盖以及覆盖的层次(已经淘汰)
2.交换—>将使用完时间片而进入阻塞状态的进程挂起,挂到外存(内存调度/中级调度)
内存分配
1.连续分配管理方式
(1)单一连续分配(整个用户区都给用户进程使用)
优点是实现简单;无外部碎片(分配前用户进程以外的无法使用的内存空间);不一定需要内存保护
缺点是只能用于单用户、单任务OS;有内部碎片(分配的内存内部未使用完的空间);存储器利用率低
(2)固定分区分配(用户区分配固定大小的分区)
(分区说明表:记录各分区的分配与回收状态)
优点:无外部碎片,因为可以覆盖
缺点1:大程序可能要用到覆盖,覆盖技术降低性能
缺点2:内存利用率低,有内部碎片
(3)动态内存分配
(空闲分区表/链:记录各分区的分配与回收状态)
选择哪个分区给新进场?
首次适用算法(低地址开始找合适的,形成很多碎片空间)
最佳适应算法(分区容量递增排序:最小空闲空间,形成无法使用的极小空间,即外部碎片)
最坏适应算法(分区容量递减排序:最大连续空间,导致缺少大容量空间)
临近适应算法(从上次查找处向后找)
2.非连续分配管理方式(进程拆分成不同部分)
(1)基本分页存储管理方式
内存分成大小相等的分区,每个分区就是一个页框,或称页帧、内存块、物理块。OS以页框为基本单位分配内存。
进程的内容划分成多个部分称为页面, 页表在PCB里,用页表记录每个块号和页号对应。
页号=逻辑地址/页面长度(取除法的整数部分)
页内偏移量=逻辑地址%页面长度(取除法的余数部分)
页面在内存中的起始位置:操作系统需要用某种数据结构记录进程各个页面的起始位置。
逻辑地址为80的内存单元:应该在1号页,该页在内存中的起始位置为450,逻辑地址为80的内存单元相对于该页的起始地址而言,
页内偏移量=80%50=30,页号=80/50=1,“偏移量”应该是30。实际物理地址=450+30=480
1.要算出逻辑地址对应的页号P,注意要比较页号P和页表长度M,页面长度M是加载到寄存器的内容长度,如果页号P大于等于页面长度M时,意味着那部分的内容还没加载到内存里,这时就会发生越界中断。
2.要知道该页号对应页面在内存中的起始地址
3.要算出逻辑地址在页面内的“偏移量”
4,物理地址=页面始址+页内偏移量
注意区分页表项长度、页表长度、页面大小的区别。页表长度指的是这个页表中总共有几个页表项,即总共有几个页:页表项长度指的是每个贞表项占多大的存储空间:页页面大小指的是一个页面占多大的存储空间)
如果每个页面大小为2KB,用二进制数表示逻辑地址,则末尾K位即为页内偏移量,其余部分就是页号。
快表的工作机制是优先查快表(快表命中率要求不低于90%),快表查不到再查慢表。
局部性原理:时间局部性–>多次访问同一个对象,将其同步到快表;空间局部性–>被访问过的相邻的对象有可能被访问。
上面连续存放的页表占用大量连续空间,又因为进程特定时间内只访问部分页面,因此可以将页表分组/分页,又要建立页目录表管理离散页表,则此时得到物理地址的步骤:
从PCB中读取一级页表的起始地址,再查一级页表(页目录表),页号对应的块号存储这二级页表的地址,根据二级页号查内存块号,加偏移量计算物理地址
注:分成两个页表是为了离散存储,提高内存利用率。用户进程并没有把所有信息加载到内存,所以无论哪个页表都存在
这样一个问题:读取页表拿到的逻辑地址可能读不到对应的页表项,因为还没加载到内存,这时应该将外存的程序模块加入进来,这时会产生一个缺页中断,把外存的页加载进来
(2)基本分段存储管理方式(段内地址有可能越界,页内地址就不会越界)
按自己的逻辑将用户程序分段,得到段表
段表—将逻辑地址转为物理地址
为了实现进程,从逻辑地址到物理地址的转换功能,在系统中设置了段表寄存器,⽤于存放段表始址和段表长度TL。最进⾏地址转换时,系统将逻辑地址的段号和段表长度TL进⾏⽐较。
分页和分段方式对比:
1.分页强调的是物理上的单位,要进行内存的管理,为了提高内存利用率,分段是逻辑单位,是为了管理业务模块,是进行用户程序的管理
2.根据页表计算出页号和偏移量,而分段的段号是程序员要自己给出的
3.分段更容易信息共享和保护
(3)段页存储管理方式
补充知识点:
1.在一个进程中,段表只有一个,而页表可能有多个。
2.为什么要进行内存管理?在单道批处理系统阶段,一个系统在一个时间段内只执行一个程序,内存的分配极其简单,即仅分配给当前运行的进程。引入多道程序的并发执行后,进程之间共享的不仅仅是处理机,还有主存储器。然而,共享主存会形成一些特殊的挑战。若不对内存进行管理,则容易导致内存数据的混乱,以至于限制进程的并发执行。因此,为了更好地支特多道程序并发执行,必须进行内存管理。
3.多级页表解决了什么问题?又带来了什么问题?多级页表解决了当逻辑地址空间过大时,页表长度会大大增加的问题。引入了一次访盘需要多次访问内存甚至磁盘的问题,大大增加一次仿存的时间。
4.编址空间的大小取决于硬件的仿存能力。
5.分页式存储管理有内部碎片,分段式存储管理有外部碎片,固定分区存储管理方式有内部碎片,段页式存储管理方式有内部碎片。
6.页表的功能由一组转的存储器实现,其始址放在页表基址寄存器。