请求分页式存储管理

  • 分页式存储管理技术的扩展,是一种常用的分页式虚拟存储管理技术

  • 基本原理:
    作业信息被分为多个页面,其副本存放在辅助存储器中。当作业被调度运行时,仅装入需要立即访问和使用的页面,在执行过程中如果需要访问的页面不在主存中,则将其动态装入。

  • 请求分页式存储管理中OS内核各阶段内容

    • 进程创建时
      1. 创建进程页表
      2. 分配磁盘交换区
      3. 初始化页表
      4. 修改进程控制块内存管理相关信息
    • 进程被调度执行
      1. 设置页表基址寄存器为当前被调度进程页表
    • 进程执行过程中发生缺页异常时
      1. 页面加载、页面替换
    • 进程终止执行时
      1. 释放进程所占页框
      2. 释放页表所占内存空间
      3. 释放磁盘交换区空间
  • 页表扩展
    请添加图片描述

  • 硬件支撑

    • 操作系统的存储管理需要依靠低层硬件的支撑来完成,该硬件称为主存管理单元MMU
    • MMU的主要功能,完成逻辑地址到物理地址的转换,并在转换过程中产生相应的硬件中断(缺页中断、越界中断)
    • MMU的主要组成:
      • 页表基址寄存器
      • 快表TLB
    • MMU的工作流程
      请添加图片描述
  • 更详细的转换过程
    请添加图片描述

  • 页面装入策略,何时将一个页面装入主存?

    • 请页式调入,缺页中断驱动,一次调入一页
    • 预调式调入,按某种预测算法动态预测并调入若干页面
  • 消除策略,何时将修改过的页面写回辅存?

    • 请页式清除,仅当一页被选中进行替换时,该页内容已修改则写回辅存。(清除与替换成对)
    • 预约式清除,内容被修改页面成批写回辅存,写回操作在该页面被替换前,而非替换时。
    • 页缓冲技术:
      仅清除淘汰的页面,并使清除操作和替换操作不必成对出现。
      • 实现:
        • 淘汰页面进入两个队列:修改页面队列非修改页面队列
        • 修改页面队列中的页不时被成批写出并加入非修改页面队列,非修改页面队列中的页面,当再次引用时回收,或者淘汰掉以作替换
  • 页框分配原则

    • 缺页中断、I/O中断频繁会降低运行效率,因此应尽可能减少缺页中断的次数。
  • 页框分配涉及的问题

    • 分配多少?
      • 分配给进程的空间越小,主存容纳的进程数越多
      • 进程仅有很少的部分驻留主存,缺页中断率会很高
      • 分配给进程的主存空间超过一定限度,也不会明显降低缺页中断率
    • 如何分配?
      • 替换算法作用于全局还是一个进程
  • 页面分配策略

    • 固定分配,在一个进程的生命周期中,分配给它的页框数固定。
    • 平均分配、按比例分配、优先权分配
    • 可变分配,在一个进程的生命周期中,当进程缺页次数较多时,分配给它较多的页框,反之,则分配给较少的页框。
  • 页面替换策略

    • 局部替换策略,通常与固定分配结合使用
    • 全局替换策略,通常与可变分配结合使用
  • 如何评价页面替换算法

    • 应尽量避免“抖动”现象的出现
    • 衡量指标——[[缺页率f]]
  • 影响缺页中断率的因素:

    • 页面替换算法
      • [[最佳页面替换算法]]
      • [[随机页面替换算法]]
      • [[先进先出页面替换算法(FIFO)]]
      • [[第二次机会页面替换算法]]
      • 时钟页面替换算法
      • [[最近最少用页面替换算法(LRU)]]
    • 主存页框数
    • 页面大小
    • 程序特性
  • 典型的全局页面替换算法:

    • [[全局最佳页面替换算法]]
    • [[工作集模型]]和[[工作集置换算法]]
    • 模拟工作集替换算法
      • [[老化算法]]
      • [[时间戳算法]]
    • [[缺页频率替换算法]]
  • 请求分页虚拟存储管理的实现

    • 页面大小,考虑因素:
      • 页表大小
      • 主存利用率
      • 读写一个页面的时间
        • 等待时间:移臂时间 + 旋转时间
        • 传输时间
      • 最佳页面尺寸,512B~8KB之间
        • 主要考虑减少页框内部碎片和页表占用的存储空间两个方面考虑
    • 页面交换区/交换文件
      • 专用的磁盘区域用于保存被淘汰的页面内容
      • 采用交换区映射表管理
    • 锁定主存页
      • 某些页面在进行I/O操作时不能被替换
    • 写时复制
      • copy on write技术,在页面级的优化应用
  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的分页存储管理代码示例: ```c #include <stdio.h> #include <stdlib.h> #define PAGE_SIZE 4 // 假设页面大小为4字节 struct PageTableEntry { int valid; // 页面是否有效 int frame; // 页面所在的物理内存框架号 }; void pageFault(int logicalAddress, struct PageTableEntry* pageTable, int* physicalMemory) { int pageNumber = logicalAddress / PAGE_SIZE; // 计算所访问的页面号 // 如果该页面在物理内存中没有分配,进行页面置换 if (!pageTable[pageNumber].valid) { int frameNumber = rand() % (sizeof(physicalMemory) / sizeof(int)); // 随机选择一个物理内存框架 pageTable[pageNumber].frame = frameNumber; // 将页面映射到选择的物理内存框架 pageTable[pageNumber].valid = 1; // 将页面标记为有效 physicalMemory[frameNumber] = pageNumber * PAGE_SIZE; // 将页面从磁盘读入物理内存中 } // 计算页面内的偏移量 int offset = logicalAddress % PAGE_SIZE; // 访问指定页面内的数据 int physicalAddress = pageTable[pageNumber].frame * PAGE_SIZE + offset; int data = physicalMemory[physicalAddress]; printf("数据访问成功!物理地址:%d,数据:%d\n", physicalAddress, data); } int main() { int logicalAddress; struct PageTableEntry pageTable[10]; // 假设有10个页面 int physicalMemory[40]; // 假设有40个物理内存框架 // 初始化页面表 for (int i = 0; i < 10; i++) { pageTable[i].valid = 0; // 所有页面都标记为无效 } // 生成随机访问的逻辑地址 printf("请输入逻辑地址:"); scanf("%d", &logicalAddress); // 调用页面错误处理函数 pageFault(logicalAddress, pageTable, physicalMemory); return 0; } ``` 这段代码实现了一个简单的分页存储管理模拟。代码中定义了一个页面表`struct PageTableEntry`,用于存储每个页面的有效性和所在的物理内存框架号。页面错误处理函数`pageFault`负责处理页面错误(缺页错误),当发生页面错误时,根据页面表的信息选择一个物理内存框架进行页面置换,并将页面从磁盘读入物理内存中。 在`main`函数中,首先初始化页面表,并通过用户输入获取一个逻辑地址。然后调用页面错误处理函数进行页面访问,输出访问结果。 请注意,这只是一个简单的示例代码,可能无法完整地模拟分页存储管理的所有细节和算法,仅供参考和理解。实际的分页存储管理代码需要根据具体的需求和场景进行设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值