当前位置:首页 » 服务存储 » 分页存储管理系统有快表
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

分页存储管理系统有快表

发布时间: 2023-06-06 08:24:32

1. 基本分页存储管理方式的页面与页表

1) 页面和物理块
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号,如0#块、1#块等等。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。
2) 页面大小
在分页系统中的页面其大小应适中。页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率。然而,如果选择的页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。因此,页面的大小应选择适中,且页面大小应是2的幂,通常为512 B~8 KB。 分页地址中的地址结构如下:
对于某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按右图所示公式求得:
其中,INT是整除函数,MOD是取余函数。例如,其系统的页面大小为1 KB,设A = 2170 B,则由上式可以求得P = 2,d = 122。 页表的功能可以由一组专门的寄存器来实现。一个页表项用一个寄存器。由于寄存器具有较高的访问速度,因而有利于提高地址变换的速度;但由于寄存器成本较高,且大多数现代计算机的页表又可能很大,使页表项的总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现,因此,页表大多驻留在内存中。在系统中只设置一个页表寄存器PTR(Page-Table Register),在其中存放页表在内存的始址和页表的长度。平时,进程未执行时,页表的始址和页表长度存放在本进程的PCB中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。于是,这一错误将被系统发现并产生一地址越界中断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。右图示出了分页系统的地址变换机构。 由于页表是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。因此,采用这种方式将使计算机的处理速度降低近1/2。可见,以此高昂代价来换取存储器空间利用率的提高,是得不偿失的。
为了提高地址变换速度,可在地址变换机构中增设一个具有并行查寻能力的特殊高速缓冲寄存器,又称为“联想寄存器”(Associative Memory),或称为“快表”,在IBM系统中又取名为TLB(Translation Lookaside Buffer),用以存放当前访问的那些页表项。此时的地址变换过程是:在CPU给出有效地址后,由地址变换机构自动地将页号P送入高速缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此相匹配的页号,便表示所要访问的页表项在快表中。于是,可直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中。如在块表中未找到对应的页表项,则还须再访问内存中的页表,找到后,把从页表项中读出的物理块号送地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中,亦即,重新修改快表。但如果联想寄存器已满,则OS必须找到一个老的且已被认为不再需要的页表项,将它换出。右图示出了具有快表的地址变换机构。

2. 一个具有快表的分页存储系统。访问一次内存需要100纳秒,访问一次快表需要20纳

设命中率为x
则120=100x+(100+180*2)(1-x)
x=94.4%
应该对哈~~

3. 求一道操作系统查表时间题目求解

作业名 到达段仔时间 估计斗郑运行时间(分钟) 优先数 完成时间 执行顺序
A 10:00 50 5 10:50 1
B 10:20 60 7 11:50 2
C 10:50 40 3 15:30 6
D 11:20 80 8 13:10 3
E 11:40 30 6 14:50 5
F 12:00 70 9 14:20 4
作业调度是将作业后备队列中的一批作业调入内存,现在作业已经在内存,所以作业调度已经执空燃颂行完毕。计算作业完成时间看进程的调度算法--优先数(优先数大者优先)调度算法.
10:00时只有A到达,所以先执行A;A完成时10:50时B、C到达,B优先数高,所以再执行B;
11:50D、E又到达,执行D,D完成时F也到达了,此时执行F,之后以次执行E、C。

4. (存储管理)01.分页式存储管理

将内存划分为若干个大小相等的分区,叫做块;将逻辑空间划分出与块大小一致的分区,叫做页。作业运行时,通过地址重定位技术,实现页与块的对应。这样就以页的方式来管理存储块,就叫分页式存储管理。

在分配存储块时,会根据作业的逻辑地址的大小计算所需要多少个存储块,然后查找空闲块并更新空闲块的状态为占用;回收存储块时,会将作业关联的所有空闲块的状态设置为空闲。记录空闲块状态的方法有两种:位图法和链表法。

在分配存储块之后,就在页表中,增加页和块对应关系的记录;同理,回收存储块时,就会删除对应记录。

访问存储块时,就会根据逻辑地址的页号,在页表找到对应的块号,然后再通过块号计算出物理地址,找到对应的存储块。如下图:

补充

页表:记录页号与块号对应关系的表,包含页号和块号两个字段。

逻辑地址:由 “页号” 和 “页内地址” 组成。其中页内地址是通过页大小来决定。

例如:逻辑地址长度为 16 位,页大小是 1kb (二的十次幂),那么页内地址占低十位,高六位是页号。如下:

在重定位存储块时,需要访问页表。为了加快重定位,就会通过快表(联想存储器,记录常用的页号和块号的对应关系)来快速通过页号找到对应的块号。但是如果不能通过快表找到对应的块号,那么就会按照查找页表的方式来完成重定位。

5. 采用快表进行分页存储管理,最坏情况下要几次访问内存

最坏情况3次,最好情况2次。
最坏情况是:现在快表中查询页号,但是没有查到系统给出的页号(这是第一次访问内存),所以只能再去页表中查询相应的页号,进而得到物理块号(这是第二次访问内存),最后一次是得到了物理地址后访问真的系统所需数据,这是第三次。
最好的情况的话就是第一步在快表中查询到了相应的页号,从而就没有第二部了,直接到了第三部,这种情况下,需要访问2次内存

6. 基本分页存储管理

  阅读前请先阅读 内存管理基础 。从本文开始就介绍不连续分配的几种方式,本文主要介绍基本分页存储管理。

  假设进程A的大小为23MB,但是每个分区的大小只有10MB,如果进程只能占用一个分区,显然是放不下的。
  解决思路:如果允许进程占用多个分区,那么可以把进程拆分成 10MB + 10MB + 3MB三个部分 ,再把这三个部分别放在三个分区中(这些分区不要求连续).....

  将内存空间分为一个个大小相等的分区(如每个分区4KB,每个分区就是一个 “页框” ,或称 “内存块” “物理块” 。每个页框有一个编号,即 “页框号” ,或 “内存块号” “物理块号” ,页框号 从0开始 )。将用户进程的地址空间也分为与页框大小相等的一个个区域,称为 页面 。页框的大小不能太大,否则可能会产生过大的内存碎片。
  操作系统 以页框为单位为各个进程分配内存空间。 进程的每个页面分别放入一个页框中,即进程的 页面和内存的页框 一一对应 的关系。

  进程分页后,进程的各个页面可以放在不连续的页框中,所以如何实现逻辑地址到物理的地址的转换?
  如下图,将下面的进程分页,假设每页大小为50B,那么就分为4个页面。

  手动计算方法:
   页号 = 逻辑地址 / 页面长度(取整数部分)。
   页内偏移量 = 逻辑地址 % 页面长度
   页面在内存中的起始位置 :操作系统需要用某种数据结构记录进程各个页面的起始位置。
  对于计算机,通常将 页面的大小划分为2的整数次幂 。假设用32个二进制位表示逻辑地址,页面大小为取2 12 B = 4096B = 4KB。

  如逻辑地址2,用二进制表示00000000 00000000 0000 0000 00000010 ,前24位二进制对应的十进制值就是逻辑地址2对应的页号,即0号页,而后12二进制位对应的十进制值就是偏移量。如果0号页在内存中的起始地址为X,那么逻辑地址2对应的物理地址就是 X + 2.
  同理,逻辑地址4097,用二进制表示00000000 00000000 0001 0000 00000001 ,前24位二进制对应的十进制值就是逻辑地址4097对应的页号,即1号页,而后12二进制位对应的十进制值就是偏移量。如果0号页在内存中的起始地址为Y,那么逻辑地址4097对应的物理地址就是 Y + 1.
  结论: 如果每个页面的大小为2 k B,用二进制表示逻辑地址,则末尾的K位表示页内偏移量,其余部分就是页号。
  因此,如果让 每个页面的大小为2的整数次幂, 计算机就可以很方便的得出一个逻辑地址对应的页号和页内偏移量。
  如果一个页面的大小为2KB,那分页存储管理的逻辑地址结构为:

  地址结构包括两个部分:前一个部分表示页号,后一个部分表示页内偏移量W。

  在知道如何计算页号和偏移量后,要计算实际的物理地址,还需要知道页号在内存中的起始地址,如何知道每个页面在内存中存放的位置——操作系统要为 每个进程建立一张页表。

  按照之前的方法计算出逻辑地址所对应的页号N,然后根据页表区查询实际的内存块号M,由于每个内存块号的大小都是相等的,所以实际地址 = M * 内存块大小 + 偏移量。

  在实际上,页表中是没有页号的,那怎么找到实际对应的内存块号呢?
  假设某系统物理内存大小为4GB,页面大小为4KB,则每个页表项至少应该占用多少字节?

  各页表项会 按顺序连续地 存放在内存中,如果该页表在内存中存放的地址为X,则M号页对应的页表项存放的地址为:X + M * 3B
  因此,页表的页号可以是隐含的。只需要知道 页表存放的起始地址 页表项长度 ,即可找到各个页号对应的页表项存放的位置,找到位置后就可以读取该位置的值,即实际内存块号。
  举个例子,如果按照逻辑地址计算出了偏移量为20,页号为1,页表中的页号是隐藏的,那么根据页表在内存中的起始地址20(假设的值),以及页表项长度3B,那么页号为1所对应的实际内存块号的值所在的地址就是:20 + 3 * 1 = 23的位置,然后在该位置的值,该值就是实际内存块号,如果是4的话,那么实际地址就是: 4 * 页面大小(4096B) + 20 = 16404。

  基本地址变换结构可以借助进程的页表将逻辑地址转换为物理地址。
  通常在系统中设置一个 页表寄存器(PTR Page-Table Register) ,存放 页表在内存中起始地址F 页表长度M
  进程在未执行时,页表的起址和页表长度放在 进程控制块(PCB)中 ,当进程被调度时,操作系统内核会把它们放在页表寄存器中。

  逻辑地址到物理地址变换的过程:

  比较页表长度,页表项长度和页面大小三个概念:

  在分页存储管理(页式管理)系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。因此, 页式管理中地址是一维的。 即只要给出一个逻辑地址,系统就可以自动算出页号、页内偏移量两个部分,并不需要显示告系统这个逻辑地址中,页内偏移量占多少位。
  基本地址变换结构需要访问两次内存: 第一次访问内存查找页表;第二次访问物理内存对应的内存单元。

  对于上图,会很频繁地访问10号块中的指令、23号块。
   时间局部性 :如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行:如果某个数据被访问过,不久之后该数据很有可能再次被访问。(因此程序中存在大量循环)。
   空间局限性 :一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的。如上面的数组,每次循环一次都会访问邻近的下一个元素地址)。
  在基本地址变换机构中,每次访问一个逻辑地址,都需要查询内幕才能中的页表。由于局部性原理,可能连续很多次查找到的都是一个页表项。既然如此,就可以利用这个特性减少访问页表的次数——快表。

   快表 ,又称 联想寄存器(TLB) ,是一种 访问速度比内存快很多 的高速缓冲存储器,用来存储当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为 慢表。
  快表的地址包换过程:
  (1) CPU给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较。
  (2) 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再根据内存块号中与页内偏移量算地物理地址。最后访问该物理地址对应的内存单元。因此如果快表命中,则访问某个逻辑地址只需 一次 访问内存即可。
  (3) 如果没有找到匹配的页号,则就需要访问页表,需要两次访问内存,在第一次访问内存查询得到页号后,需要将页号添加到快表中,以便后面再次被访问。如果快表已满,则必须按照一定的算法对旧的页表项进行替换。
  由于查询快表比查询页表的速度快很多,因此只要快表命中,就可以节省很多时间。因为局部性原理,一般来说快表的命中率可以达到90%以上。

7. 基本分页存储管理

假设是按字节编址

考虑支持多道程序的两种连续分配方式

原因:连续分配要求进程占有的必须是一块连续的内存区域
能否讲一个进程分散地装入到许多不相邻的分区,便可充分利用内存

基本分页存储管理的思想:把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分

页框/页帧:内存空间分成的一个个大小相等的分区(比如4KB)
页框号:页框的编号,从0开始,从低地址开始

页/页面:用户进程的地址空间分为和页框大小相等的一个个区域
页号:页/页面的编号,从0开始

进程的最后一个页面可能没有一个页框那么大,页框不能太大,否则可能产生过大的内部碎片

操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中,也就是说,进程的页面与内存的页框有一一对应的关系
每个页面不必连续存放,也不必按照先后顺序,可以放到不相邻的各个页框中

进程在内存中连续存放时,通过动态重定位实现逻辑地址到物理地址的转换。在装入模块之后,内存中指令使用的依然是逻辑地址,直到指令执行的时候才会进行地址转换。系统会设置一个重定位寄存器,用来存放装入模块存放的起始位置,重定位寄存器中的值加上逻辑地址就是该逻辑地址实际对应的物理地址

如果采用分页技术

页框大小为4KB,地址空间为4GB的系统
页号为前20位,页内偏移量为后12位

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

一个进程对应一张页表
进程的每一页对应一个页表项
每个页表项由页号和页框号组成
页表记录进程页面和实际存放的页框之间的对应关系

每个页表项的长度是相同的,页号是隐含的
各页表项会按顺序连续存放在内存中,如果该页表在内存中的起始地址是X,4GB/4KB系统的页框有

用于实现逻辑地址到物理地址转换的一组硬件机构

通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M(M个页表项)
进程未执行时,页表的起始地址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把他们放到页表寄存器中

基本分页存储管理中地址是一维的,即只要给出一个逻辑地址,系统就可以自动计算出页号、偏移量,不需要显式告诉系统偏移量是多少

理论上,页表项长度为3即可表示内存块号的范围,但是为了方便页表查询,会让页面恰好能装得下整数个页表项,令每个页表项占4字节
4KB页面,可以放4096/3 =1365个页表项,有4096%3 =1B的碎片,访问1365及之后的页表项时,还要考虑前面的页框中的碎片,才能得到页表项的物理地址,比较麻烦

进程页表通常存放在连续的页框中,这样就能用统一的计算方式得到想要得到的页表项存储的位置

地址变换过程中有两次访存操作:查询页表、访问目标内存单元

局部性原理

如果这个程序将程序对应的指令存放在10号内存块,将程序中定义的变量存放在23号内存块,当这个程序执行时,会很频繁地反问10、23号内存块

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

基本地址变换机构中,每次要访问一个逻辑地址,都要查询页表,由于局部性原理,可能连续多次查询同一个页表项

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

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

一般来说,快表的命中率可以达到90%以上

单级页表存在的问题

对问题1

可将页表进行分组,使每个内存块刚好可以放入一个分组。为离散分配的页表再建立一张页表,称为页目录表,或外层页表
各级页表的大小不能超过一个页面

针对两级页表

对问题2

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

两级页表访存次数分析:如果没有TLB,第一次访存是访问内存中的页目录表,第二次访存是访问内存中的二级页表,第三次访存是访问目标内存单元