当前位置: 首页 > article >正文

【哈工大_操作系统理论】L2223 多级页表与快表段页结合的实际内存管理

L3.3 多级页表与快表

一页大小是4K,最大的浪费其实就是一页都空着,所以最大浪费是4K。则为了避免浪费,页大小必须小一些。

1、问题:需要很大内存空间存放页表

  • 一般内存大小为4G,页大小为4K,则有1M个页表象(一百多万个,太大了)。
  • 每个页表象一般需要4个字节,则每个页表占4M大小。假设100个进程,则需要400M内存。
  • 实际上,程序虽然分为多个页,但并不是每个程序都很大包含很多页,却并不是每个页的逻辑地址都使用,则并不是每个页都需要有表象。并不是每个页表都要包含这1M个页表象,引出第一种方法。

2、第一种方法:只存放用到的页

  • 失败-因为页号不连续,导致每次需要比较查找页号以找到对应页框号,需要额外多次访问页表,效率低
  • 既要页号连续,又要让页表占用内存少 -> 多级页表

3、多级页表

原本1M个表象,每个表象4字节,需要4M的空间来存储页表。而现在:

  • 页目录号需要2^10个,每个4字节,需要4K

  • 其中只有3个目录占用,只需要3个页号目录,每个页号目录也是2^10,则目录指向的页表象是4K,三个则12K

  • 所以总共需要16K
    在这里插入图片描述

  • 多级页表提高了空间效率,降低了时间效率。每增加一级都要多访问一次内存

4、快表

TLB:相连快速存储,属于寄存器,存放在CPU中

  • 记录最近使用的页号;

  • 若不在TLB中,则再去查多级页表(快表+多级页表)
    在这里插入图片描述

  • TLB命中率越高越好,即TLB越大越好,但很昂贵,需要折中


L3.4 段页结合的实际内存管理

  • :用户程序通过分段管理虚拟内存(程序员希望用段)
  • :操作系统通过分页管理物理内存,高效利用内存(物理内存希望用页)

1、段面向用户,页面向硬件

用户程序 -> 分段存放到虚拟内存 -> 每段再分页存放到物理内存

  • 虚拟内存:无非就是割出了一段地址空间来存放段程序
  • 逻辑地址 -> 虚拟地址 -> 物理地址
    在这里插入图片描述

2、重定位(地址翻译)

段地址翻译 + 页地址翻译
在这里插入图片描述

3、实际的段、页式内存管理

  1. 在虚拟内存中割出一块区域(分配虚存)

  2. 建立段表,映射到虚拟内存
    在这里插入图片描述

  3. 在物理内存中找到空闲区域(分配内存)

  4. 建立页表

  • linux0.11中设计多个进程共用同一个页表,因为每个进程虚拟地址互不重叠,而使用32位虚拟地址前20位为页目录和页号,则页目录和页号不同,所以用同一套页表映射后物理地址是不同的
    在这里插入图片描述

  • 右移22位,得到页目录号,每个页目录号占4字节,所以乘4得到页目录号地址,则右移20位。(但是需要与一下,把后面两位清零,实现效果才一样)
    在这里插入图片描述

  • 在子进程位置创建一章(页目录号)

  • 在子进程的章上新建节(页号)get_free_page
    在这里插入图片描述

  • 把父进程这一节内容拷贝到子进程这一节上
    在这里插入图片描述

  1. 重定位具体使用内存
  • 通过内存管理单元 MMU 硬件实现地址自动转换
    在这里插入图片描述

http://www.kler.cn/news/353709.html

相关文章:

  • 【黑马redis高级篇】持久化
  • 除GOF23种设计模式之简单工厂模式
  • langchain更新再体验:加入一个prompt
  • 15分钟学Go 第3天:编写第一个Go程序
  • JavaWeb 22.Node.js_简介和安装
  • 卸载Python
  • 120多套各种类别微信小程序模板源码
  • Linux LCD 驱动实验
  • R语言中,.RData 和 .rds 的区别
  • RISC-V笔记——语法依赖
  • SpringMVC后台控制端校验-表单验证深度分析与实战优化
  • 【LeetCode每日一题】——1413.逐步求和得到正数的最小值
  • 【ROS2实操三】动作通信
  • Flume面试整理-常见的Channel类型
  • Nginx配置全解析
  • 【Neo4j】图数据库Neo4j 认证专家考试题目总结(判断/单选/多选),正确率高达99%
  • python爬虫实战案例——从移动端接口抓取微博评论,采用cookie登陆,数据存入excel表格,超详细(15)
  • Python数据分析库pandas高级接口dt的使用
  • PLSQL高级编程-面向对象编程
  • 初始化列表、静态成员、友元