操作系统(七)

可变分区模式和动态存储技术

内存管理的可变分区模式(varaiable partition),又称变长分区模式,是指将内存用户区划分为若干个区块,每个分区任一时刻只有一个程序,且为连续完整存放。但划分的时机,大小和位置是动态的,即在系统运行从开机到关机这段时间内,各分区的大小,位置等划分情况,是随着个用户程序的来去而变化的。该模式视为类进一步克服和改善固定分区模式在内存空间利用率方面的缺点。

可变分区模式下相关的实现策略有:

(1)必须维持一张内存空间块表来动态跟踪记录内存空闲块(或自由块、未用块、指未被任一用户程序占用的处于空闲状态的分区)和已用块(正被某一用户程序占用的内存分区)。其数据结构可以采用链表,位图和伙伴系统等。

(2)当一个用户程序到来而内存中有多个够大空间块时,分配哪块给该用户程序呢?有5种分配方式:

  • 最先分配:顺序扫描整个自由块表,遇到的第一个足够大的块,但不一定是整个表中唯一一个够大的或者长度正好合适的块。
  • 下次分配:顺序扫描整个自由块表,遇到第二个足够大的块开始分配。这种算法比最先分配效率差,但是在案程度排序时比最先算法效率佳。
  • 最佳分配:扫描整个自由块表,以获得最适合的自由存储块,长度足够大且剩余空间最小。这种方法效率较低,同时会导致很多不容易分出去的称为外部存储碎片的小空闲块;动态地址扩充余地较小。
  • 最坏分配:最大自由块分开成为进程需要的块和最大的剩余空间。这种算法所产生的剩余块最大,还可以被利用。
  • 快速适配算法:根据通常要求的长度把自由块分类而并非排序,为管理这些表,需要维护一张含有几项指针的指针表。这个指针表的第一项指向4KB的自由块表,第二项指向8KB自由块表,第三项指向12KB自由块表,等等。使用这种方法,寻找一个所要求的存储块速度很快。但是,同其它按长度排序的算法一样,都有一个共同的特点:当进程终止或退出时,寻找相邻块进行合并很浪费时间。如果不合并自由块,那么用不了多久存储区就会变成许多不能用的小碎片。

 

不连续的模式

页模式

内存管理的页模式是将内存固定划分为等长页面或物理页,将程序也划分成为等长的页或称逻辑页。页与页面通常等长,将程序各页装入内存各空闲页面。一个程序的所有也不一定要顺序地撞在连续的,相邻的空闲页面中。页模式分为两种:一种是要求程序都要一次全部装入,称为实存页模式;一种是程序可以而且一般不一次全部装入。程序的逻辑编制是连续编址。

由于一个程序的所有页对应的内存页面是随机分散的,因此存在执行时动态地址映射(即动态重定位)的需要,这就需要为每个在内存的程序建立一张表,反映该程序在内存的分布情况,成为进程页表(page table, address map)。进程页表的行数为进程的实际页数或最大允许数,第N行的值为第N頁在内存中对应页面的基地址(因此对进程表的访问是直接存取的。)在装入后执行时,需要内存硬件地址映射机构(translation mechanism,在MMU的地址),根据页表进行执行时需要动态地址映射和保护。在程序中,CPU产生的内存地址是逻辑地址,被MMU划分为逻辑页号(pagenumber, logical page number)和页内位移(page offset)两部分。MMU以进程页表的逻辑索引得到物理页号(physical page number, page frame number),然后将物理页号与页内位移相结合,就得到物理地址,再由MMU送给内存。这种地址映射方式称为线性或直接转换。

当任一程序要求进入内存开始执行时,亦即建立一个进程时,内存的例行工作如下:首先,要得到进程所需长度(页数),查内存页表看是否足够多的页空闲,

有则将页面分配给该进程并修改内存页表,将程序从外存装入内存。

虚存页模式的基本工作过程和结构

当程序不能完全装入内存时,需要考虑的是程序开始装入多少和当要访问的内容不在内存中的时候怎么办?根据进程页表中相应页表项的值,可以确定访问的页面是否在内存。若不在,则发生缺页中断,将相应的页从外存调入内存,然后继续该次访问。这种在实际读写页时才通过缺页中断调入页的做法,称为请求调页。当访问的页面不再内存,内存中空间不够,不能装入时,有3种策略。第一种是等待,等待其它进程释放。第二种是拒绝,到相应的发生问题的进程撤销,以后再重新执行。

第三种是淘汰,在已经装入的内存空间中寻找不再使用或近期不再使用的页,将其暂时换到外存交换区,然后使用的时候再换进内存。几乎所有的虚存管理都是用了这种策略。

虚存的概念和作用

虚存是为提高内存利用率而提出的一种技术。虚存有页式存、段式存储、段页式三种。虚存的作用与优点如下:

可以解决大程序在小空间内运行的问题,即可以在比用户逻辑空间更小的物理空间上运行程序。

提高了内存的利用率:增加了多道数,增加了CPU利用率和系统吞吐量(但响应时间或轮转时间并没有增加)。一个进程的执行过程中,未执行或访问的那些代码页和数据页都不会进入内存。

相对于交换技术,虚存减少了装入或交换需要的I/O。虚存每次换入换出以页为单位,而单纯的交换技术每次换入换出是以整个进程空间为单位的。

相对于覆盖,用户程序不必自己分块,简化了用户程序的设计难度。

减轻了用户程序的存储管理负担。

页式实现专题讨论

进程页表的存放

1)全部存放在内存中

在该方式下,需要为每个进程建立一个进程页表的基址寄存器(page-table base register PTBR)用户程序执行过程中每次访问时MMU要根据当前进程的进程页表基址寄存器的值以及此次访问地址的逻辑页号,访问当前进程的进程页表(在内存)得到此次地址映射的物理页号,拼得物理地址后再访问相应的页。在上述过程中,可看到一下4点:

  • 每次进程切换时,不需要保存和恢复当前进程的整个页表,只需要保存和恢复PTBR就好了。
  • 在上述过程中,进程页表是由硬件访问的,其格式由硬件指定。
  • 对进程页表的访问是直接存取的。
  • 用户每次执行一条指令都需要访问两次内存,第一次访问是进程页表,第二次访问才是进程需要的数据本身。

 

2)全部存放在寄存器中

进程页表全部放在寄存器中称为快表,该方案有下面几个特点:

一组高速寄存器是每次进程切换是需要保存和恢复的内容之一,也就是说在每次进程切换的时候都需要保存表中的内容。

这组保存进程表的高速寄存器的成本较高,导致其容量有限。4GB进程空间和4KB的页长来说,其进程表需要1M行,这意味着需要1M个高速寄存器。这样成本太高,不能实现。需要采用第三种方案——部分快表实现。

3)全部放在内存中,但部分内容放在寄存器中。

在这种方案下,完整的进程放在内存中,但其正用的部分放在寄存器中。

每次进程切换时需要保存和恢复快表内容。与完全快表方式不同的是,每次进程切换是需要保存页表基址寄存器的内容。 通常将进程页表的基址地址当作快表的第一行,或设专门的进程页表基址寄存器。

由于只是进程页表的部分内容在快表中,显然快表内容不再连续排列,因此快表中不仅仅存储物理页号,同时也要存储逻辑页号。为了加快块表测查找速度,这种方案下的块表通常是按内存寻址的。

大虚存地址空间的进程页表两级结构: 页目录和页表页

进程页表所占的空间比较大,但是进程页表通常投没有被填满。因此可以采用动态分配,动态伸缩的策略。也就是说,在进程建立时并不马上分配完整的进程页表空间。而是用到某页时才将其物理页号放入页表。显然,这时页表中的逻辑页号不再是连续的了。因此页表中的每行要同时存放逻辑页号和物理页号。

由于页表中所占的巨大内存空间,和其他大部分内容在大部分时间内未使用的原则,故进程页表也被列入淘汰的范围。也就是说,在必要时,进程列表也会被交换到硬盘交换分区。

以上两种措施都会导致一个进程页表的多个页面之间的不连续。这就进一步意味着页表页本身之间不能连续。这就进一步意味着页表页本身也需要索引。对此,操作系统通常把页的地址索引成为页目录。采用页表和页目录共同构成二级页表提供硬件支持。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值