lab2 物理内存管理原理

一、连续内存分配

最先匹配(First-fit):找到的第一个大于我要分配的大小的空闲块
最佳匹配(Best-fit):找到那个比我大,但是又是大的最小的那个
最差匹配(Worst-fit):找到那个比我大,但是又是大的最多的那个

二、非连续内存分配

1、段氏存储管理

在这里插入图片描述
如下图所示:在程序P运行过程中,CPU要访问逻辑地址中的某个位置,已经知道段号与偏移。操作系统中维护段表,段表记录段号对应的基址与长度,首先MMU比对偏移量与段号对应的长度,如果偏移量大于长度说明操作不合法内存异常,否则是合法的,此时将段基址与偏移相加得到真实物理地址,然后进行访问。
在这里插入图片描述

2、页氏存储管理

32位机器里面,4K(4096)是常见的一种页帧的大小

通过页表进行逻辑地址到物理地址的转换
(下图非常重要)
在这里插入图片描述

页表概述

每个页面对应一个页表项
页面中的内容随进程运行状态而动态变化
页表基址寄存器告诉我们页表的起始位置在哪
在这里插入图片描述
如何实现页与帧之间的地址转换呢?也就是如何实现逻辑地址与物理地址之间的转换。如上图:操作系统维护页表,页表内存储页号与帧号之间的映射关系。页表基址表明了页表存储在什么地方。比如当程序P执行过程中,CPU要访问(p, o),操作系统通过页表得到帧号f,通过(f, o)找到物理内存地址。而由于帧和页的大小是2的幂次方,因此实际上地址就是将 f 左移 S 位之后加上 o 即得到物理地址。

在这里插入图片描述
页表内除了存储前面提过的帧号,还存储了一些页表项标志位:
存在位,记录该页号是否有对应的帧;
修改位,记录页面的内容是否修改了;
引用位,记录是否有对该页面的引用。
在这里插入图片描述
标志位为0意味着没有给页分配帧,就可以动态的进行变化。

页式访问的性能问题:

内存访问的性能问题:访问一个物理内存单元需要两次访问内存。第一次先访问页表进行查询,第二次才是访问物理内存获取数据。
页表的大小问题:页表可能非常大。比如一个64位机器(字节内存),假如一页大小为1024字节(),那么一共可以产生页(帧),64位的系统想要表示一个帧的地址就需要64位,也就是8字节,也就是说想表示一个帧,即使不考虑标志位也需要8字节,那使用很多页面,比如全部使用页,就需要字节,仅仅存储页表就要这么多字节占用了很多空间。
针对这些问题,也有一些对应的解决方案:

缓存:程序执行时具有连续性即相邻性,访问了一个数组第一个元素,下一个极有可能访问第二个元素,因此当我缓存下来页表项,利用缓存可以极大可能地访问到想要的数据。
间接访问:将长页表切断,实际就是多级页表,一层层去查询。

快表(TLB: Translation Look-aside Buffer):

快表是指缓存近期访问过的页表项。它有以下特点:

TLB使用关联存储(associative memory)实现,具备快速访问性能,因为关联存储在CPU内;
如果TLB命中,可以直接访问物理内存;
如果TLB未命中,仍需查询页表,并将对应表项更新到TLB中。
在这里插入图片描述

多级页表:

多级页表顾名思义,类似于树的概念,一级一级往下查询,图示如下:比如图中是三级页表,逻辑地址的表示由四元组 表示。p1、p2、p3 分别表示在各级页表中的偏移,o 则表示物理内存中的偏移。通过多级页表可以有效减少每级页表的长度。
在这里插入图片描述
具体操作中,比二级页表的操作如下:一级页表的起始地址存储在CPU寄存器CR3中,然后一级一级根据偏移获取实际内存地址。
在这里插入图片描述

页寄存器与反置页表:

页寄存器

反置页表也是为了减少页表占用存储空间的一种做法。对于大地址空间系统,比如64位系统,多级页表变的非常繁琐,比如5级页表,正常情况下总共需要6次查询。并且逻辑地址空间的增长速度快于物理地址空间。每个进程有一个页表,随进程数量增加页表占用的存储空间也会增加。

针对上述情况,出现了页寄存器,页寄存器与反置页表思路相同:

不让页表与逻辑地址空间的大小相对应;
让页表与物理地址空间的大小相对应。
通过这个思路就可以使页表占用空间与进程数目没有关系,而至于物理内存的大小有关。接下来我们首先对页寄存器进行介绍,理解了页寄存器就可以轻松理解反置页表。页寄存器将每个物理帧与与一个页寄存器关联,寄存器内存储以下内容:
使用位:此帧是否被进程占用;
占用页号:对应的逻辑页号 p ;
保护位:比如可读、可写等性质。

由上面的内容我们可以看到页寄存器的优点是与逻辑地址空间大小无关,并且大小相对物理内存而言很小。缺点是需要在页寄存器中存储页号,也就是帧号是键,页号是帧,而进程运行时CPU产生的是逻辑地址页号,因此需要在页寄存器中搜索逻辑地址的页号。那么这种搜索是比较困难的。实际操作中,采用hash将页号映射到帧号,提高检索效率。这样又产生一个问题就是hash冲突,出现冲突时遍历冲突链表,找到需要的帧号。同时还可以将快表的思想融入进来,缓存使用过的页号帧号映射。引入快表又引入了新的问题,快表存储在CPU缓存中容量被限制到很小,同时快表的功耗是很大的。

反置页表

接下来我们看下反置页表。反置页表也是基于hash映射查找页对应的帧,但是反置页表将进程号也考虑进来,对进程号和页号同时进行hash。这里我自己的理解是最初给进程分配帧的时候就是根据哈希值进行分配的,因此查找时自然可以根据哈希值进行查询。冲突解决方式依然是链表的方式解决,查询发现第一个地址内的进程号与页号与需要的进程号与页号不一致时则继续查询链表中的下一个节点。过程如下图:哈希值加反置页表基址得到反置页表中的位置,验证进程号和页号,命中则根据hash结果查询物理内存。
在这里插入图片描述
具体实现看下图。pid和vpn(virtual page number)共同参与哈希,得到一个物理地址,根据这个地址去查询反置页表,验证pid和vpn是否匹配,不匹配则查询next中存储的地址,此时匹配,则访问此时对应的物理地址。
在这里插入图片描述

哈希页表

在这里插入图片描述
哈希页表中每个元素由三个字段组成:虚拟页码,映射的帧码,指向链表内下一个元素的指针。
逻辑地址包含两部分,一部分作为哈希键值,另一部分作为物理地址偏移,根据哈希键值查哈希表,如果存在哈希冲突,遍历冲突链表,直到找到那个与哈希键值对应的元素,进而找到物理页基址,然后加上物理页偏移就找到了物理地址。
聚箤页表就相当于哈希页表。哈希页表对于稀疏地址空间特别有用。

3、段页式存储管理

给每个段加一级页表
段页式存储管理的实现如下图。逻辑地址由段号+页号+业内偏移组成。首先根据寄存器得到段表基址,段表基址加段内偏移得到段表项,段表项内存储页表基址,页表基址加业内偏移得到帧号,帧号加业内偏移得到实际物理内存地址。
在这里插入图片描述
段页式存储管理将段式存储管理和也是存储管理的优势结合在了一起。最明显的一个是可以非常方便地实现进程间的段共享。如下图,只要两个进程中共享段指向相同的页表基址,就可以实现内存共享。
在这里插入图片描述
段页式存储管理有很多优点,也有一些弱点,同样可以采用快表缓存、多级页表做间接访问、反置页表等方式去改进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值