分页系统的实际实现问题

分页系统的实际实现问题     

操作系统在四个阶段要做与分页相关的工作:进程创建,缺页中断时,进程执行,进程结束时。

   当在分页系统创建一个新进程时,操作系统首先要确定程序和数据在初始时有多大,并为他们创建一个页表,然后在内存中为页表分配内存空间以及初始化,当进程被换出时,页表不用留内存中。另外,操作系统要在磁盘交换区分配空间,以便在某进程交换出区时有磁盘空间可以用,操作系统还要用程序和数据对交换区进行初始化,也就是留个备份的意思,这样当新进程发生缺页中断时,可以直接调入需要的页面,某些系统直接从磁盘上的可执行文件对程序正文进行分页,以节省磁盘空间和初始化时间。最后,操作系统把磁盘交换区信息和页面信息存入进程表中。

   当调度一个新进程时,重置MMU,刷新TLB,完全扫除旧进程的痕迹。必须让新进程的页面成为当前页表,通过复制该页表或将一个指向该页表的指针放到硬件寄存器中,当进行进程初始化时,可以将进程的一部分或全部装入内存。

当缺页中断发生时,系统必须通过读硬件寄存器来知道是哪个虚拟地址发生了中断,并通过该信息,计算需要哪个页面,并在磁盘上定位,它必须要找到合适的页框来存放置新页面,必要时置换老的页面,将所需的页面读入页框。最后备份PC程序计数器,使程序计数器指向引起缺页中断的指令,并重新执行该页面。

 当进程退出时,操作系统必须释放进程占用的页面页表以及在硬盘上占用的空间,如果某些页面是共享的,等待最后一个使用它的进程终止再释放。

  缺页中断处理:·

1.      硬件陷入内核,在堆栈中保存程序计数器,大多数机器将当前指令的各种信息状态保存在特殊的CPU寄存器中,

2.      启动一个汇编代码例程保存通用寄存器和其他易失性的信息,以免被操作系统破坏,这个例程将操作系统作为一个函数来调用。

3.      当操作系统发现一个缺页中断时,尝试发现需要哪个虚拟页面,通常一个硬件寄存器包含了这个信息,如果没有的话,操作系统必须检索程序计数器,取出这条指令,分析它在中断发生时在干什么,

4.      找到缺页中断的虚拟地址后,操作系统检查此地址是否有效、存取与保护是否一致,如果不一致,发出信号kill掉这个进程。如果都正常,系统检查是否有空闲页框,若没有,执行页面置换算法寻找一个淘汰掉、

5.      如果选择页框脏,则写入磁盘,并进行一次上下文切换,挂起产生缺页中断的进程。让其他进程运行直至磁盘传输完毕,无论如何,此时页面被标记为忙。以免它被其他进程占用。

6.      一旦页面干净,无论是立刻还是写入磁盘后,操作系统寻找所需页面在磁盘上的地址,装入页框,此时进程仍然被挂起,会有其他进程运行。

7.      当磁盘中断发生时,表明页面已经装入,页表更新好

8.      恢复发生缺页中断指令以前的状态程序计数器重新指向这条指令,

9.      调度引发缺页中断的进程,操作系统返回调用它的汇编语言例程

10.  该例程恢复寄存器和其他状态信息,返回到用户空间继续执行,好像缺页中断没有发生一样。

  指令备份

当程序访问不在内存中的页面,引起缺页中断的指令会半途停止并引发操作系统的陷阱,在操作系统取出所需的页面后,它需要重新启动引起陷阱的指令,使用一个隐藏的内部寄存器,在每条指令执行之前,把程序计数器的内容复制到寄存器,通过信息,操作系统可以消除引起缺页中断的指令引起到的指令所造成的所有影响。

   锁定内存中的页面

  当计算机有虚拟内存并不意味着I/O不起作用了,虚拟内存和I/O通过微妙方式相互作用,设想一个进程刚刚通过系统调用从文件或其他设备中读取数据到其地址空间中的缓冲区,在等待I/O完成时,该进程被挂起,另一个进程被允许运行,而这个进程产生一个缺页中断。

如果分页算法是全局算法,包含I/O缓冲区的页面也有很小机会被选中换出内存,如果一个I/O设备正在对该页面进行DMA传输的过程中,把这个页面移出去会导致部分数据写入他们存储的缓冲区,部分卸载最新的页面,一个方法是锁住正在做I/O操作的内存中以保证他不会被移除内存,称作钉住页面,另一种方法是在内核缓冲区完成所有的I/O操作,然后将数据复制到用户页面。

   后备存储

在磁盘上分配页面空间的算法是在磁盘上设置特殊的交换分区,甚至从文件系统划分一块独立的磁盘(以平衡I/O负载)。大多数UNIX是这样处理的。在这个分区里没有普通的文件系统,以消除将文件偏移转化成块地址的开销,取而代之的是,始终使用相应分区的起始块号。

   当系统启动时,该分区为空,并在内存以单独的项给出它的起始和大小,最简单的情况下,当一个进程启动时,留出与这个进程一样大的交换区块,剩余的为总空间减去这个交换分区,进程结束时释放其磁盘上的交换分区,交换分区以空闲块列表的方式组织

   与每个进程对应的是其交换区的磁盘地址,即进程映像保存的地方,这一信息记在进程表里,写回一个页面时。将虚拟地址空间中页面偏移量加到交换区的开始地址,但是在进程启动前必须初始化交换区,一种方法是整个进程映像复制到交换区,以便随时将所需内容装入,另一种方法是将整个进程装入内存,并在需要时换出。

     这种方法导致的问题:进程启动后大小可能增大,必须为正文、堆栈、和数据分别保留交换区,并且允许这些交换区在磁盘上多一个块。

      另一个极端是事先什么也不分配,在页面交换出来时为它分配磁盘空间,缺点是每个页面都要为其记录一个地址,即每个进程都要有一张表,记录每一个页面在磁盘上的位置

策略和机制的分离

存储管理系统分为三部分:

1.      一个底层的MMU处理程序

2.      一个作为内核一部分的缺页中断处理程序

3.      一个运动在用户空间中的外部页面调度程序

所有关于MMU工作的细节都封装在MMU处理程序中,该程序的代码是与

机器相关的,而且系统每应用到一个新平台都要重写一次。

 缺页中断处理程序上与机器无关的代码,包含大多数分页机制,策略主要由作为用户进程运行的外部页面调度程序所决定

当一个进程开始运行时,就可能出现缺页中断,此时,缺页中断处理程序找出需要哪个虚拟页面,并发送一条消息给外部页面调度程序告诉它发生了什么问题,外部页面调度程序从磁盘中读入所需的页面,把它复制到自己的地址空间,然后告诉缺页中断处理程序从外部页面调度程序的地址空间中清除该页面的映射,然后请求MMU处理程序把它放到用户地址空间的正确位置,随后重新启动该进程

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值