文章目录
💾物理内存管理(主存)
🔧连续内存分配
内存碎片问题
——空闲内存不能被利用
- 外部碎片:在分配单元间的未使用内存
- 内部碎片:在分配单元中的未使用内存
分区的动态分配
原理 | 优势 | 劣势 | |
---|---|---|---|
第一适配 | 从低地址开始寻找一个合适的分区,重分配需要检查自由分区是否可合并 | 简单,易于产生更大的空闲块 | 产生外部碎片 |
最优适配 | 寻找最适合分配请求的分区,重分配需要检查自由分区是否可合并 | 简单,适合小尺寸分配 | 产生外部碎片,小的空闲块难以分配 |
最差适配 | 寻找最不适合分配请求的分区,重分配需要检查自由分区是否可合并 | 适合中等尺寸分配 | 产生外部碎片,易于破碎大的空闲块以致大分区无法被分配 |
压缩式碎片整理
压缩从而获得连续的内存块
交换式碎片整理
🪛非连续内存分配
连续内存分配的缺点:
- 内存利用率低
- 有外碎片、内碎片的问题
故使用非连续内存分配来改善问题
优点 | 缺点 | |
---|---|---|
连续内存分配 | 1. 内存利用率低 2.有外碎片、内碎片的问题 | |
非连续内存分配 | 1.更好的内存利用和管理 2.运行共享代码与数据 3.支持动态加载和动态链接 | 软件方案:开销大 硬件方案:分段、分页 |
📒分段Segmentation
分段寻址方案:
硬件实现方案:
段表由操作系统建立
📃分页Paging
帧:非连续的物理内存
页:连续的虚拟内存
分页寻址方案:
页表由操作系统建立
硬件实现方案:
页表Page Table
页表空间和时间问题的解决:
-
缓存Cache
常用的页表项放入CPU中的快表TLB,不需要多次访问内存
-
间接访问
二级、多级页表
-
方向页表
使得页表只与物理地址大小有关,而与逻辑地址大小无关
- 基于页寄存器的方案
- 基于关联内存的方案
- 基于哈希查找的方案
💽虚拟内存管理
起因:
让更多程序跑在有限的内存中
覆盖技术
:跑比较大的程序,发生在程序内部
只把需要的指令和数据保存到内存中(分时占用内存)
粒度:程序功能模块
缺点:程序员需要将程序划分为不同功能模块,负担大
交换技术
:跑比较多的程序,发生在程序间
把暂时不能执行的程序送到外存中
粒度:一个程序
缺点:把进程的整个地址空间都换进换出,开销大
虚存技术
:跑更大更多的程序
以更小的页粒度为单位进行导出导入
粒度:页或段
目标:
- 像覆盖技术一样,不是把程序的所有内容都放在内存中
- 像交换技术一样,能够实验进程在内存与外存之间的交换
程序局部性原理:
程序在执行过程中一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域,提高访问效率
- 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内
- 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小的区域内
基本概念 :
在页式存储管理的基础上,添加请求调页和页面置换功能
基本特征:
- 大的用户空间:提供给用户的虚拟内存空间通常大于实际的物理内存(虚拟内存=物理内存+外存)
- 部分交换:虚拟存储的调入和调出是对部分虚拟地址空间进行的
- 不连续性:物理内存分配的不连续
虚拟页式内存管理:
页式内存管理:
请求调页:
当发生缺页异常时,会请求调页
页面置换:
将不常用的数据放到外存中,常用的数据放到内存中
页面置换算法
:
功能与目标:
功能:当缺页中断发生,需要调入新的页面而内存已满时,选择内存当中的哪个物理页面被置换
目标:尽可能地减少页面的换进换出次数(即缺页中断次数)
页面锁定:用于描述必须常驻内存的操作系统的关键部分或时间关键的应用进程。实现方法:在页表中添加锁定标志位lock bit
局部页面置换算法:
针对一个正在运行的程序而言
-
最优页面置换算法(OPT,optimal)
基本思路:计算逻辑页面下次访问之前,还需等待多长时间,选择下次访问等待时间最长的作为置换页面
缺点:这是一个理想情况,只作为最佳评价标准。
-
先进先出算法(FIFO,First In First Out)
基本思路:选择在内存中驻留时间最长的页面作为置换页面
实现:链表,队列
缺点:性能比较差,调出的页面有可能是经常要访问的页面,并且有Belady现象
-
最近最久未使用算法(LRU,Least Rectenly Used)
基本思路:当一个缺页中断发生时,选择最久未使用的页面作为置换页面
实现:链表,队列
缺点:开销大,需要查找链表中是否存在与访问页面相同的页号,若有则抽出。
满足栈算法,不会出现Belady现象
-
时钟页面置换算法(Clock)LRU算法的近似
基本思路:
-
将各个页面组织成环形链表(类似于时钟表面),把指针指向最老的页面(最先写入的页面)
-
当发生缺页中断时,考察指针指向的最老页面
-
若访问位为0,作为置换页面,然后指针下移一个格
-
若访问位为1,把该位置为0,指针往下移动一格,直到找到置换页面,然后指针下移一个格
访问页面存在指针不移动,缺页时指针才移动
-
缺点:有可能将可写的页换出,增加了磁盘读取的次数
-
-
二次机会法
基本思路:Clock算法的优化,除利用used bit外,还利用dirty bit来减少磁盘读取次数
选择used bit和dirty bit都为0的页面作为置换页面,然后指针下移一个格(优先将只读的页换出去,减少可写的页被换出)
-
最不常用算法(LFU,Least Frequently Used)
基本思路:当一个缺页中断发生时,选择访问次数最少的页面作为置换页面
缺点:需要查找访问计数器,开销大
LRU和LFU的区别:
LRU:考察的是多久未访问,时间越短越好
LFU:考察的是访问的次数或频度,访问次数越多越好
问题:一个页面在进程开始时使用得很多,但以后就不使用了
解决方法:定时把次数寄存器右移一位
-
Belady现象:在采用FIFO算法时,有时会出现分配的物理页面数增加,缺页率反而提高的异常现象
-
LRU、FIFO、Clock的比较
全局页面置换算法:
针对多个正在运行的程序而言,根据程序不同运行阶段动态分配、调节物理页帧的大小
-
工作集模式
工作集类似于一个滑动窗口
工作集:一个进程当前正在使用的逻辑页面集合
常驻集:在当前时刻,进程实际驻留在内存当中的页面集合
使工作集尽量包含于常驻集,从而减少缺页中断
-
工作集页面置换算法
基本思路:选择不在工作集中的页面作为置换页面
-
缺页率页面置换算法
基本思路:根据缺页率动态调整常驻集、工作集
当缺页率高的时候,增加工作集——将缺失页添加到工作集
当缺页率低的时候,减少工作集——从工作集中移除没有在[t1,t2]被引用的页面
t1:第一次缺页中断的时间
t2:第二次缺页中断的时间
抖动问题:随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减小,缺页率不断上升