存储管理-页式管理

匆匆过客 提交于 2019-12-05 07:30:55

存储管理-页式管理

页式管理解决什么问题

  • 分区式管理,存在着严重的碎片问题使得内存的利用率不高
    1.固定分区,因为每一个分区只能分配给某一个进程使用,而该进程可能占不满这个分区,就会有内部碎片

    2.动态分区,会产生大量的外部碎片,虽然可以使用紧凑技术,但是这样时间成本过高了

出现这种情况的原因是分区管理必须要求进程占用一块连续的内存区域,如果让一个进程分散的装入到不同的内存分区当中的话,这样就可以充分的利用内存,并且不需要紧凑这种技术了。比如把一个进程离散的拆分放到零散的内存碎片中去,这样就可以更为高效的利用内存。也就是产生了非连续的管理方式。

比如就是把一个进程拆分为若干部分,分别放到不同的分区中,比如一个进程23M,可以拆分为10M,10M,3M放到不同的分区中


如果分区分的更小,23M拆分为11个2M的,和一个1M的,每个分区是2M,那么总共会装满11个分区,剩下一个分区装不满,也仅仅浪费1M的空间,也就是分区越小的话,那么就是内存利用率就会越高。

  • 分区式管理时,进程的大小受分区大小或内存可用空间的限制
  • 分区式管理也不利于程序段和数据的共享

页式管理的改进

  • 页式管理只在内存存放反复执行或即将执行的程序段与数据部分
  • 不经常执行的程序段和数据存放于外存待执行时调入。

页式管理的基本概念

页框(页帧):将内存空间分成一个个大小相等的分区,每个分区就是一个页框。

页框号:每一个页框有一个编号,这个编号就是页框号,从0开始

页(页面):将进程分割成和页框大小相等的一个个区域,也叫页

页号:每一二个页面有一个编号,叫做页号,从0开始
注意:由于最后一个页面可能没有页框那么大,所以页框不可以太大,否则会产生过大的内存碎片

操作系统会以页框为单位为各个进程分配内存空间,进程的每一个页面分别放入一个页框中,也就是进程的页面和内存的页框具有一一对应的关系

注意:各个页面不需要连续存放,可以放到不相邻的各个页框中

如何实现地址的转化


1.首先需要知道一个进程内的页对应物理内存中的起始地址a是多少
2.其次要知道进程页内地址b是多少
3.逻辑地址对应的实际物理地址就是c=a+b

如何计算?比如逻辑地址80
确定页号:页号=逻辑地址/页面长度 1=80/50
页内偏移量:页内偏移量=逻辑地址%页面长度 30=80%50
每个进程页面对应物理内存中页框的首地址:这是通过页表查询到的,比如查询到对应物理内存首地址是4500
那么对应最终物理地址就是4500+30=4530

页表

页表的存在是为了让我们知道进程中的一个页的页号对应它存放在物理内存中的页框号,进而求出页框号对应的首地址

逻辑地址的结构


假如页号有k位,那么页数就是2^k个
假如页内地址m位,那么页内地址有2^m个

静态页面管理

在作业或进程开始执行之前,把作业或进程的程序段和数据全部装入内存的各个页面中,并通过页表(page mapping table)和硬件地址变换机构实现虚拟地址到内存物理地址的地址映射。

内存页面分配与回收

静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。

依赖数据结构:

页表:

1.页表在内存中占有一块固定的存储区。页表的大小由进程或作业的长度决定。
2.对于一个每页长1K,大小为20K的进程来说,如果一个内存单元存放一个页表项,需要分配给该页表20个存储单元。
3.页式管理时每个进程至少拥有一个页表。

请求表:
1.用来确定作业或进程虚拟空间的各页在内存中的实际对应位置。为此,系统必须知道每个作业或进程的页表起始地址和长度。
2.此外,请求表还包括每个作业或进程要求的页面数。请求表整个系统一张

存储页面表:

记录内存各页面是否已被分配出去,以及未分配页面的总数。

位示图法:在内存中划分一块固定区域,每个单元的每个比特代表一个页面。如果该页面已被分配,则对应比特位置1,否则置0。

一个划分为1024个页面的内存,如果内存单元长20比特,则位示图要占据1024/20=52个内存单元。

空闲页面链法:
1.空闲页面链中,队首页面的第一个单元和第二个单元分别放入空闲页面总数与指向下一个空闲页面的指针。其他页面的第一个单元分别存放指向下一个页面的指针。
2.空闲页面链的方法使用空闲页面本身的单元存放指针,因此不占据额外的内存空间。

2.分配算法

1.首先,基于请求表获取进程或作业要求的页面数。
2.然后,基于存储页面表检查是否有足够的空闲页面。
3.如果没有,则本次无法分配。
4.如果有则分配设置页表,填写请求表中的相应表项;按一定查找算法搜索出所要求的空闲页面,并将对应的页面号填入页表中。

3.地址变换

地址变换过程全部由硬件地址变换机构自动完成。

设一个3页长的进程页号为0、1、2,其对应的页面号分别为2、3、8。设每个页面长度为1K,指令LOAD 1,2500的虚地址为100。

1.首先,需要一个保存页表始址和页表长度用的控制寄存器。系统把所调度执行的进程的页表始址和长度从请求表中取出置入控制寄存器中。
2.然后,由控制寄存器的页表始址,找到页表所在位置。并由虚地址100可知,指令LOAD 1,2500在第0页的第100单元。由于第0页与第2个页面相对应,因此,该指令在内存中的地址为2048+100=2148。
3.当CPU执行到第2148单元的指令时,CPU要从有效地址2500中取数据放入1号寄存器中。为了找出2500对应的实际物理地址,地址变换机构首先将2500转换为页号与页内相对地址组成的地址形式。即p=2,w=452。
4.由页表,可知第2页对应的页面号等于8。最后,将页面号8与页内相对地址w=452相连,得到待访问的物理内存地址8644。

快表:

取一个数据或指令至少要访问内存两次以上。
1.一次访问页表以确定所取数据或指令的物理地址
2.另一次是根据地址取数据或指令

提高速度:
1.把页表放在寄存器中,但寄存器价格太贵。
2.在地址变换机构中加入一个高速联想存储器,构成一张快表。在快表中,存入那些当前执行进程中最常用的页号与对应的页面号,从而提高查找速度。

静态页式管理的问题

动态页式管理分为请求页式管理和预调入页式管理。
1.由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,该作业或进程只好能等待。
2.而且,作业或进程的大小仍受内存可用页面数的限制。

动态页式管理

请求页式管理和预调入页式管理在作业或进程开始执行之前,不把作业或进程的程序段和数据段一次性地全部装入内存,而只装入经常反复执行和调用的工作区部分。其他部分在执行过程中动态装入。

请求调入

需要执行的某条指令不在内存,或执行某条指令需要访问的其他数据或指令不在内中,则发生缺页中断,系统将外存中相应的页面调入内存。

预调入

系统对外存中的页进行调入顺序计算,估计这些页中指令和数据的执行和被访问顺序,并按此顺序将它们顺次调入和调出内存。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!