分页存储管理的基本概念

将内存分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个”页框“,或称”页帧”、“内存块”、“物理块”。 每个页框有一个编号,即“页框号”(或者“内存块号”、“页帧号”、“物理块号”)页框号从0开始

将用户进程的地址空间页分为与页框大小相等的一个个区域,称为“”或“页面“。每个页面也有一个编号,即”页号”,页号也是从0开始

如何实现地址的转换

  1. 要计算出逻辑地址对应的页号
  2. 要知道该页号对应页面在内存中的起始地址
  3. 要算出逻辑地址在页面内的“偏移量”
  4. 物理地址 = 页面始址 + 页内偏移量

如何计算

  • 页号 = 逻辑地址 / 页面长度 (取除法的整数部分)
  • 页内偏移量 = 逻辑地址 \% 页面长度 (取余)
  • 页面在内存中的起始位置 = 内存块的块号 * 内存块的大小

页表

为了能知道进程的每个页面在内存种存放的位置,操作系统要为每个进程建立一张页表

  1. 一个进程对应一张页表
  2. 进程的每一页对应一个页表项
  3. 每个页表项由“页号”和“块号”组成
  4. 页表记录进程页面和实际存放的内存块之间的对应关系
  5. 在内存中,页表项的长度是相同的,页号是”隐含“的

内存块的起始地址 = 内存块的块号 * 内存块大小

易混概念

  • 页表长度:这个页表中总共有几个页表项,即总共有几个页
  • 页表项长度:每个页表项占多大存储空间
  • 页面大小:一个页面占多大的存储空间

基本地址变换机制

基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。

通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F页表长度M

进程未执行时,页表的始址 和 页表长度 放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。

地址变换过程

  1. 根据逻辑地址算出页号、页内偏移量
  2. 页号的合法性检查(与页表长度对比)
  3. 若页号合法,再根据页表起始地址、页号找到对应页表项 (CPU第一次访问内存:查页表)
  4. 根据页表项中记录的内存块号、页内偏移量 得到最终的物理地址
  5. 访问物理内存对应的内存单元 (CPU第二次访问内存:访问目标内存单元)

具有快表的地址变换机构

什么是快表

快表,又称联想寄存器(TLB),是一种访问速度比内存快的多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表

有点类似于Cache,当CPU要将逻辑地址转换为物理地址中时,先会去TLB中找这个页号对应的内存块号,如果没找到的话再去内存中的页表找这个页号对应的内存块号,并且会将内存中页表的这个页表项复制到TLB中。

局部性原理

  • 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很可能再次执行;如果某个数据被访问过,不久后该数据很可能再次被访问。(因为程序中存在大量的循环)
  • 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)

引入快表后,地址的变换过程

  1. CPU给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表TLB中的所有页号进行比较。
  2. 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表命中,则访问某个逻辑地址仅需要一次访存即可。
  3. 如果没有找到匹配的页号,则需要访问内存中的页表,找到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后访问该物理地址对应的内存单元。因此,若快表未命中,则访问某个逻辑地址需要两次访存注意:在找到页表项后,需要将该页表项放入快表中,以便以后可能的再次访问。但如果快表已满,则需要按照一定的算法对旧的页表项进行替换)

两级页表

单极页表存在什么问题?如何解决

  • 问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框

    当某个进程占用内存较大时候,将会使用到很多页,也就会在页表中有很多页表项,而查询页表的方法(页表项的位置 = 页表始址 + K*页表项大小)需要所有的页表项都连续存放。 这样将占用较大的一块连续内存存放页表,这将失去了内存中离散存放的优点。

  • 问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问几个特定的页面

    根据局部性原理,很多时候,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让所有的整个页表都常驻内存

问题一的解决办法:

​ 创建页表的页表,即页目录表,又称顶级页表、外层页表,原来的页表称为二级页表,将二级页表中能够满足一个页面大小数量的页表项当作一个页面,并将此页面的页表项存放到页目录表中。

问题二的解决办法

​ 可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存。 若想访问的页面不在内存中,则产生缺页中断(内中断),然后将目标页面从外存中调入内存。

两级页表问题需要注意的几个细节

  1. 采用多级页表机制,则各级页表的大小不能超过一个页面。若两级页表不够,可以分更多级。

  2. 两级页表的访存次数分析(假如没有快表机构)

    第一次访存:访问内存中的页目录表

    第二次访存:访问内存中的二级页表

    第三次访存:访问目标内存单元

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇