您的位置:首页 > 其它

读书笔记-现代操作系统-3储存管理-3.6有关实现的问题

2016-07-12 10:52 344 查看

3.6 有关实现问题

3.6.1 与分页有关的工作

创建进程时

操作系统确定程序和数据在初始时有多大,并为它们创建一个页表。为页表分配空间并对其初始化。

操作系统需要在磁盘交换区中分配空间,以便在一个进程换出时在磁盘上有放置此进程的空间

用程序正文和数据对交换区进行初始化,这样当新进程发生缺页中断时,可以调用需要的页面。

操作系统必须把有关页表和磁盘交换区的信息储存在进程中

进程执行时

为新进程设充值MMU,刷新TLB,以清除以前进程遗留下的痕迹,进程的页表必须称为当前的页表

把进程的一部分或全部页面装入内存已减少缺页中断。

缺页中断时

通过读硬件寄存器来确定是哪个虚拟地址造成了缺页中断,并计算出页面在硬盘的位置

必须找到合适的页框来存放新页面,必要时还要置换老的页面,

把所需要的页面读入页框。

备份程序计数器,使程序计数器指向引起缺页中断的指令,并重新执行该指令

进程终止时

操作系统释放进程的页表、页面和页面在硬盘上占用的空间。如果这些页面是与其他进程共享的,当最后一个使用他们的进程终止的时候,才可以释放内存和磁盘上的页面。

3.6.2 缺页中断处理

顺序:

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

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

3. 尝试发现需要哪个虚拟页面。通常根据硬件寄存器确定。

4. 操作系统检测地址是否正确,检测存取与保护是否有效且一致。如果不一致则杀死进程或发出一个信号,如果一致且有效,则检测是否有空闲页框。如果没有空闲页框,则执行页面置换算法寻找一个页面来淘汰。

5. 如果选择的页框“脏了”,安排磁盘写回磁盘,并发生一次上下文切换,,挂起产生缺页中断的进程,让他进程运行直至磁盘传输结束。该页框需要被标记为忙

6. 一旦页框干净后(立刻还是写回后)操作系统查找需要页面在磁盘上的地址,通过磁盘操作将其装入。注意此时该进程还保持在中断挂起状态,CPU可以运行其他进程

7. 当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映它的位置。页框也处于正常状态。

8. 恢复发生缺页中断前的状态。

9. 调度引发中断的程序,返回汇编语言例程

10. 恢复寄存器和其他状态信息,返回用户空间执行。

3.6.3 指令备份

对于操作系统来说准确的判断指令是从哪里开始通常是不可能的。

通常,CPU的设计者们提供了一种解决方案,就是通过使用一个隐藏的内部寄存器。在每条指令执行之前,把程序计数器的内容复制到该寄存器。

有些计算机还有第二个寄存器,用来提供哪些寄存器已经自动增加或者减少已经增减的信息数量。

3.6.4 锁定内存中的页面

虽然有虚拟内存,但是并不意味着IO就没用了。IO用于读取文件或读取设备信息。

有时候IO缓冲区和缺页调用有冲突,IO缓冲区很小的几率被选出调出缓冲区。通常这样的情况的解决办法是锁住正在做IO操作的内存中的页面以保证它不会被移出内存。锁住一个页面通常称为在内存中钉住(pinning)

3.6.5 后备存储

本节讨论当页面被从内存换出的时候应该放到硬盘的哪个位置上?

通常的简单算法都是在磁盘上设置一个特殊的交换分区,甚至从文件系统划分一块独立的磁盘(以平衡IO负载)。这个分区里没有普通的系统文件这样就消除了将文件偏移转换成块地址的开销,而始终使用响应的起始块号。

对静态交换区分页

系统启动的时,交换分区为空。进程启动的时候,留出与这个进程一样大的交换区块。交换分区的空闲块以列表形式给出。

每个进程对应的其交换区的磁盘地址,即进程映像所保存的地方。这一信息是记录在进程表里面。

当写回页面的时候,将虚拟地址空间中的页面偏移量加到交换区的开始地址处。

但是在进程启动前必须初始化交换区,可以将整个进程放进交换区,也可以全放进内存。

这一模式的问题是当进程启动后可能会增大,数据和堆栈可能会增长,这样最好为正文、数据和堆栈分别保留交换区,并且允许这些交换块多于一块。

动态备份页面

事先不做任何分配,在页面换出时为其分配页面,在换入时回收磁盘。这样做内存中进程不必固定于任何交换空间。缺点是内存中的每个页面都要记录相应的磁盘地址。

不论何种方法都不能保证总是实现固定的交换分区。

如果没有磁盘分区可用的时候,可用利用正常文件系统中的一个或多个较大的,事先定位的文件。如Windows。

初次之外我们还注意到,通常程序的正文部分是不变的,而且每个程序正文都来自某个可执行的程序,这样如果堆栈和数据段过量,可以丢弃部分程序段内容, 因为程序段的内容即使丢弃了也可以从执行文件读取回来。

3.6.6策略和机制的分离

储存管理系统可以分为三个部分:

1. 一个底层MMU处理程序

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息