操作系统 第九章

来源:互联网 发布:linux 保存退出 编辑:程序博客网 时间:2024/06/07 15:43

按需调页,使用懒惰交换->只有在需要页时,才调入内存,
交换程序(swapper)对整个进程进行操作
调页程序(pager)只是对进程的单个页进行操作

对标记为无效的访问会产生页错误陷阱

纯粹按需调页(pure demand paging)

一条指令可能访问多个页的内存(一页用于指令,其它页用于数据)则一页可能产生多个页错误, 不好的系统性能。 局部引用(locality of reference)

页表:有效无效位
次级存储器 :用来保存不在内存中的页, 快速磁盘,交换设备, 用于交换的这部分磁盘称为交换空间(swap space)

请求调页的关键要求 :能够在页错误后重新执行指令, 在出现页错误时,保存中断进程的状态(寄存器, 条件代码, 指令计数器)

若页错误出现在指令获取时, 可以再次获取指令
若出现在获取操作数时, 那么可以再次获取指令, 再次译码指令,然后再次获取操作数。

9.2.2 按需调页的性能

p为页错误的概率, p接近于0, 页错误越少, 那么有效访问时间为 :
有效访问时间 = (1-p) * ma + p * 页错误时间

按需调页的另一个重要方面 : 交换空间 的处理和使用
磁盘I/O到交换空间通常比到文件系统要快。 因为 交换空间 按大块来分配的, 并不使用文件查找和间接分配方法
如果在进程开始时将整个文件镜像复制到交换空间, 并从交换空间执行按页调度, 那么有可能获得更好的调页效果,另一选择是开始时从文件系统中进行按需调页, 但是当出现页置换时则将页写入交换空间, 这种方法确保只有所需的页才从文件系统中调入, 而以后出现的调页时从交换空间中读入的。

9.3 写时复制
通过采用类似页面共享的技术, 采用系统调用fork创建进程的开始阶段可能不需要按需调页, 这种技术提供了快速进程创建, 且最小化新创建进程必须分配的新页面的数量

写时复制(copy-on-write) : 允许父进程与子进程开始时共享同一页面,这些页面标记为写时复制页,即如果任何一个进程需要对页进行写操作, 那么就创建一个共享页的副本。
注意 只有可能修改的页才需要标记为写时复制,不能修改的页(即包含可执行代码的页)可以为父进程和子进程所共享,写时复制是一种常用技术,为许多操作系统所采用,如Windows XP, Linux和Solaris

采用写时复制 从哪里分配空闲页?
许多OS提供 空闲缓冲池 这些空闲页在进程栈或队必须扩展时可用于分配, 或用于管理写时复制页,操作系统通常采用 按需调零(zero-fill-on-demand)的技术以分配这些页。 按需调零页在需要分配之前先填零,清除了以前的内容。
fork()不同于写时复制的fork() , fork()会将父进程挂起。子进程使用父进程的地址空间。如果子进程修改父进程地址空间的任何页, 修改过的页在父进程重启时是可见的。
9.4 页面置换
过度分配(over-allocating)
常用解决方法 :页置换(page replacement)

9.4.1 基本页置换
帧分配算法(frame-allocation) 和 页置换算法(page-replacement algorithm)
如果在内存中有多个进程,那么必须决定为每个进程各分配多少帧, 当需要页置换时,必须选择要置换的帧
内存的引用序列称为引用串(reference string)

9.4.2 FIFO页置换
9.4.3 最优置换(optimal page-replacement algorithm)
9.4.4 LRU页置换
FIFO :页调入内存的时间
OPT :页将来使用的时间
最优置换和LRU置换都没有Belady异常, 都属于同一类算法, 称为 栈算法(stack algorithm)

9.4.5 近似LRU页置换
1.附加引用位算法
操作系统把每个页的引用位转移到其8位字节的高位,包含着该页在8个时钟周期内没有使用,无符号整数,最小值的页为LRU置换页
数量可降为0, 只有引用位本身, 第二次机会页置换算法(second-chance page-replacement algorithm)
2. 二次机会算法
基本算法是FIFO置换算法
一个页如果经常使用以至于引用位总是被设置,不会被置换
实现算法 (有时称为时钟算法): 采用循环队列
3.增强型二次机会算法

9.4.6 基于计数的页置换
* 最不经常使用页置换算法(LFU)
* 最常使用页置换算法(MFU) : 理论为具有最小次数的页可能刚调入,还未使用

9.4.7 页缓冲算法
系统保留一个空闲帧缓冲池
在牺牲帧写出之前,所需要的页就从缓冲池中读到空闲内存,当在牺牲帧以后写出时,它再加入到空闲帧池

9.4.8 应用程序与页置换
有的操作系统允许特殊程序将磁盘作为逻辑块数组使用,而不需要通过文件系统的数据结构,这种数组有时称为生磁盘(raw disk), 而对数组的I/O则称为生I/O。
虽然有些应用程序使用其特有的磁盘存储服务更为高效,但是绝大多数程序使用通用文件系统服务会更好

9.5 帧分配
若采用纯按需调页

9.6 系统颠簸
局部置换算法(local replacement algorithm) (或 优先置换算法(priority replacement algorithm))能限制系统颠簸
局部置换 : 一个进程开始颠簸,那么它不能从其他进程拿到帧,且不能使后者也颠簸
如果进程颠簸,那么绝大多数时间内也会排队来等待调页设备,由于调页设备的更长的平均队列,页错误的平均等待时间也会增加。因此,即使对没有颠簸的进程, 其有效访问时间也会增加。

局部模型(locality model)
9.6.2 工作集合模型
工作集合模型(working-set model)是基于局部性假设的
工作集合窗口(working-set window)

9.7 内存映射文件

9.7.3 内存映射I/O
当通过内存映射串口发送一长串字节时,CPU写一个数据字节到数据寄存器,并设置控制寄存器的一个位以表示有字节可用。
设备读取字节,并清除控制寄存器的位以表示可以接收下一个字节。
接着,CPU可传输下一个字节,如果CPU采用轮询方式来检测控制位,这种操作称为程序I/O(programmed I/O, PIO)
如果采用接收设备就绪后可发下一个字节的中断的方式,称为中断驱动(interrupt driven)

原创粉丝点击