1.存储空间的分配与回收
页式存储管理分配内存空间以物理页面为单位:简单的内存分配表可以用一张“位示图”构成。位示图中的每一位与一个内存块对应,每一位的值可以是0或1,0表示对应的内存块为空闲,1表示已占用。在进行内存分配时,先查看空闲块数是否能满足程序要求。若不能满足,则不进行分配,程序就不能装入内存:若能满足,则根据需求从位示图中找出一些为0的位,把这些位置成 1,并从空闲块数中减去本次分配的块数,然后按照找到的位计算出对应的块号。当找到一个为0的位后,根据它所在的字号、位号,按如下公式就可计算出对应的块号:
块号=字号x字长+位号
把程序装入到这些内存块中,并为该程序建立页表。
2.页式存储管理的地址转换
为实现页式存储管理,系统要提供页表起始地址寄存器和页表长度寄存器以及要高速缓冲存储器的支持。页表指出该程序逻辑地址中的页号与所占用的内存块号之间的对应关系。页表的长度由程序拥有的页面数而定,页表是硬件进行地址转换的依据,每执行一条指令时按逻辑地址中的页号查页表。若页表中无此页号,则产生一个“地址错”的程序性中断事件。若页表中有此页号,则可得到对应的内存块号,按计算公式可转换成访问的内存的物理地址。
物理地址的计算公式为:物理地址=内存块号x块长+页内地址
根据二进制乘法运算的性质,一个二进制数乘以 2^n结果实际上是将该数左移n位。所以,实际上是把内存块号作为绝对地址的高位地址,而页内地址作为它的低地址部分。
3.页表
3.1 多级页表
当系统支持 32位的逻辑地址空间时,若页面大小为4KB,则页表将包含1M个表项。假设每个表项由4字节组成,那么仅仅是为了存储页表就要为每个进程分配 4MB 的物理地址空间。假设用户地址空间为 2GB,页面大小为 4KB,则一个进程最多可以有219页。若用4字节表示一页的物理页号,则页表本身就占用2MB,即需要512个页面存放。存放页表的页面为页表页。
一般来说,页表页可以不连续存放,因此需要对页表页的地址进行索引。在大多数操作系统中采用二级页表,即由页表页和页目录一起构成进程页表。第一级表示页目录,保存页表页的地址;第二级表示页表页,保存物理页面号(即内存块号)。在 Windows操作系统中,页目录被称为页目录项(Page Directory Entry,PDE),页表被称为页表项(Page Table Entry,PTE)。
3.2 散列页表
当地址空间大于32位时,一种常见的方法是使用以页号为散列值的散列页表。其中每个表项都包含一个链表,该链表中元素的散列值都指向同一个位置。这样,散列页表中的每个表项都包含3个字段:①虚拟页号,②所映射的页框号,③指向链表中下一个元素的指针。
3.3 反置页表
在反置页表中,每个物理页框对应一个表项,每个表项包含与该页框相对应的虚拟页面地址以及拥有该页面进程的信息。因此,整个系统中只存在一个页表,并且每个页框对应其中一个表项。由于一方面系统中只有一个页表,而另一方面系统中又存在着多个映射着物理内存的地址空间,因此需要在反置页表中存放地址空间标志符。这样就保证了一个特定进程的逻辑页面可以映射到相应的物理页框上。
4.快表
为了提高存取速度,在地址映射机制中增加一个小容量的联想寄存器(相联存储器),它由高速缓冲存储器组成。利用高速缓冲存储器存放当前访问最频繁的少数活动页面的页号,这个高速缓冲器被称为“快”也称为转换检测缓冲器(Translation Lookaside Buffer, TlB)。快表只存放当前进程最活跃的少数几页,随着进程的推进,快表的内容动态进行更新。
更新原理:当某一用户程序需要存取数据时,根据该数据所在的逻辑页号在快表中找出对应的内存块号,然后拼接页内地址,以形成物理地址。如果在快表中没有相应的逻辑页号,则地址映射仍然通过内存中的页表进行;在得到内存块号后需将该块号填到快表的空闲单元中;若快表中没有空闲单元,则根据置换算法置换某一行,再填入新得到的页号和块号。查找快表和查找内存页表是并行进行的,一旦发现快表中有与所查页号一致的逻辑页号就停止查找内存页表,而直接利用快表中的逻辑页号。
例:假定访问内存的时间为 200ns,访问高速缓冲存储器的时间为40ns,高速缓冲存储器为 16个单元时,查快表的命中率为90%。于是,按逻辑地址转换成绝对地址进行存取的平均访问时间为:(200+40)x90%+(200+200)X10%=256(ns)
不使用快表需两次访问内存的时间为 200X2=400ns。可见使用快表与不使用快表相比,访问时间下降736%。
5.虚拟存储器
(1)实现虚拟存储器需要以下的硬件支持:①系统有容量足够大的外存。②系统有一定容量的内存。③硬件提供实现虚-实地址映射的机制。④缺页中断处理程序。⑤页表
(2)在一个虚拟存储系统中,决定虚拟存储空间最大容量的要素是计算机系统地址位宽。虚拟存储技术是动态的扩充内存容量。
(3)虚拟存储器的工作原理如下:当进程开始运行时,先将一部分程序装入内存,另一部分暂时留在外存;当要执行的指令不在内存时,由系统自动完成将它们从外存调入内存的工作,当没有足够的内存空间时,系统自动选择部分内存空间,将其中原有的内容交换到磁盘上,并释放这些内存空间供其他进程使用。
6.页表增加项
在使用虚拟页式存储管理时需要在页表中增加以下的表项:
页号 | 页面的编号 |
有效位 | 又称驻留位、存在位或中断位,表示该页是在内存还是在外存 |
页框号 | 页面在内存中时所对应的内存块号 |
访问位 | 又称引用位或参考位,表示该页在内存期间是否被访问过 |
修改位 | 表示该贞在内存中是否被修改过 |
保护位 | 是否能读/写/执行 |
禁止缓存位 | 采用内存映射 I/0的机器中需要的位 |
其中,访问位和修改位可以用来决定置换哪个页面,具体由页面置换算法决定
7. 缺页中断
若在页表中发现所要访问的页面不在内存,则产生缺页中断。 当发生缺页中断时,操作系统必须在内存中选择一个页面将其移出内存,以便为即将调入的页面让出空间。
整个缺页处理过程简单阐述如下:①根据当前执行指令中的逻辑地址查页表的驻留位,判断该页是否在内存。②该页标志为 “0 ”,形成缺页中断。保留现场。中断装置通过交换 PSW 让操作系统的中断处理程序占用处理器。③操作系统处理缺页中断,寻找一个空闲的页面。④若有空闲页,则把磁盘上读出的信息装入该页面中。⑤修改页表及内存分配表,表示该页已在内存。⑥如果内存中无空闲页,则按某种算法选择一个已在内存的页面,把它暂时调出内存。若在执行中该页面已被修改过,则要把该页信息重新写回到磁盘上,否则不必重新写回磁盘。当一页被暂时调出内存后,让出的内存空间用来存放当前需要使用的页面。页面被调出或装入之后都要对页表及内存分配
表作修改。⑦恢复现场,重新执行被中断的指令。当重新执行该指令时,由于要访问的页面已被装入内存,所以可正常执行下去。
8. 页面调度3个策略
虚拟存储器系统通常定义3种策略进行页面调度:调入策略,置页策略和置换策略。
8.1 调入策略
虚拟存储器的调入策略决定了什么时候将一个页由外存调入内存之中。 在虚拟页式管理中有两种常用调入策略:①请求调页(Demand Paging)Paging):只调入发生缺页时所需的页面。实现简单,但易产生较多的缺页中断,容易产生抖动现象。②预调页(Prepaging):在发生缺页需要调入某页时,一次调入该页以及相邻的几个页。
8.2 置页策略
当线程产生缺页中断时,内存管理器还必须确定将调入的虚拟页放在物理内存的何处。用于确定最佳位置的一组规则称为 “置页策略 ”。选择页框应使 CPU 内存高速缓存不必要的震荡最小。
8.3 置换策略
如果缺页中断发生时物理内存已满,“置换策略 ” 被用于确定哪个虚页面必须从内存中移出,为新的页面腾出空位。
(1)固定分配局部置换 (Fixed AllocationAllocation,Local Replacement) 。①可基于进程的类型,为每一进程分配固定的页数的内存空间,在整个运行期间都不再改变。②采用该策略时,如果进程在运行中出现缺页,则只能从该进程的 W个页面中选出一个换出,然后再调入一页,以保证分配给该进程的内存空间不变。
(2)可变分配全局置换 (Variable AllocationAllocation,Global Replacement) 。①采用这种策略时,先为系统中的每一进程分配一定数量的物理块,操作系统本身也保持一个空闲物理块队列。②当某进程发生缺页时,由系统的空闲物理块队列中取出一物理块分配给该进程。③但当空闲物理块队列中的物理块用完时,操作系统才从内存中选择一块调出。④该块可能是系统中任意一个进程的页。
(3)可变分配局部置换 (Variable AllocationAllocation,Local Replacement) 。①同样基于进程的类型,为每一进程分配一定数目的内存空间。②但当某进程发生缺页时,只允许从该进程的页面中选出一页换出,这样就不影响其他进程的运行。③如果进程在运行的过程中频繁地发生缺页中断,则系统再为该进程分配若干物理块,直到进程的缺页率降低到适当程度为止。
9.“抖动”现象
如果刚被调出的页面又立即要用,因而又要把它装入,而装入不久又被选中调出,调出不久又被装如此反复,使调度非常频繁。这种现象称为“抖动”或称“颠”。
10.先进先出页面置换算法(First-In First-0ut,FIFO)
FIFO算法简单,容易实现。把装入内存的那些页面的页号按进入的先后次序排好队列,每次总是调出队首的页,当装入一个新页后,把新页的页号排入队尾。由操作系统维护一个所有当前在内存中的页面的链表,最老的页面在表头,最新的页面在表尾。当发生缺页时,置换表头的页面并把新调入的页面加到表尾。