操作系统基础37-请求调页的性能
2020-12-29 01:08·重学IT的老猫
请求调页可以显著影响计算机系统的性能。为了说明起见,下面计算一下请求调页内存的有效访问时间。 对大多数计算机系统而言,内存访问时间(用ma表示)的范围为10〜200ns。只要没有出现缺页错误,有效访问时间就等于内存访问时间。然而,如果出现缺页错误,那么就应先从磁盘中读入相关页面,再访问所需要的字。 设 p 为缺页错误的概率(0≤p≤1)。希望p接近于0,即缺页错误很少。那么有效访问时间为:
有效访问时间=(1 - p) * ma + p * 缺页错误时间
为了计算有效访问时间,应知道需要多少时间来处理缺页错误。缺页错误导致发生以下一组动作:
- 陷入操作系统。
- 保存用户寄存器和进程状态。
- 确定中断是否为缺页错误。
- 检查页面引用是否合法,并确定页面的磁盘位置。
- 从磁盘读入页面到空闲帧:在该磁盘队列中等待,直到读请求被处理。等待磁盘的寻道或延迟时间。开始传输磁盘页面到空闲帧。
- 在等待时,将 CPU 分配给其他用户(CPU 调度,可选)。
- 收到来自 I/O 子系统的中断(I/O 完成)。
- 保存其他用户的寄存器和进程状态(如果执行了第 6 步)。
- 确认中断是来自上述磁盘的。
- 修正页表和其他表,以表示所需页面现在已在内存中。
- 等待 CPU 再次分配给本进程。
- 恢复用户寄存器、进程状态和新页表,再重新执行中断的指令。
以上步骤并不是在所有情况下都是必要的。例如,假设第6步在执行I/O时将CPU分配给另一进程。这种安排允许多道程序以提高CPU使用率,但是在执行完 I/O 时也需要额外时间来重新启动缺页错误的处理程序。在任何情况下,缺页错误的处理时间有三个主要组成部分:
- 处理缺页错误中断。
- 读入页面。
- 重新启动进程。
第一个和第三个任务通过仔细编码可以减少到几百条指令。这些任务每次可能需要1〜100ms。然而,页面切换时间可能接近8ms(典型硬盘的平均延迟为 3ms,寻道时间为 5ms,传输时间为 0.05ms。因此,总的调页时间约为8ms,包括硬件的和软件的时间)。而且,要注意,这里只考虑了设备处理时间。如果有一队列的进程正在等待设备,那么应加上等待设备的时间,以便等待调页设备空闲来处理请求,从而增加了更多的交换时间。 如果缺页错误处理的平均时间为8ms,内存访问时间为200ns,那么有效内存访问时间(以 ns 计)为:
有效访问时间=(1-p) * (200) + p(8ms)
=(1-p)*200 + p*8000000
= 200 + 7999800*p
这样,我们看到有效访问时间与缺页错误率成正比。如果每1000次访问中有一次缺页错误,那么有效访问时间为8.2μs。由于请求分页,计算机会减速40倍。如果我们希望性能下降小于10%,则需要将缺页错误的概率保持在以下级别:
220 > 200 + 7999800 * p
20 > 7999800 * p
p < 0.0000025
也就是说,为了因缺页错误而产生的性能降低可以接受,那么只能允许每399990次访问中出现不到一次的缺页错误。总之,对于请求调页,降低缺页错误率是极为重要的。否则,会增加有效访问时间,从而极大地减缓了进程的执行速度。 请求调页的另一个方面是交换空间的处理和整体使用。交换空间的磁盘 I/O 通常要快于文件系统的。交换空间的文件系统更快,因为它是按更大的块来分配的,且不采用文件查找和间接分配方法。 因此,系统可以在进程启动时将整个文件映像复制到交换空间中,然后从交换空间执行请求调页,从而获得更好的分页吞吐量。另一选择是,开始时从文件系统进行请求调页,但是在置换页面时则将页面写入交换空间。这种方法确保只从文件系统读取所需的页面,而所有后续调页都是从交换空间完成的。 对于二进制文件的请求调页,有些系统试图限制交换空间的用量。这些文件的请求调页是从文件系统中直接读取的。然而,当需要页面置换时,这些帧可以简单地覆盖(因为它们从未被修改),当再次需要时,从文件系统中再次直接读入。 采用这种方法,文件系统本身用作后备存储。然而,对于与文件无关的页面还是需要使用交换空间(称为匿名内存),这些页面包括进程的堆栈和堆。这种方法似乎是一个很好的折中,并用于多个操作系统,如 Solaris 与 BSD UNIX。 移动操作系统通常不支持交换。当内存变得有限时,这些系统从文件系统请求调页,并从应用程序中回收只读页面(例如代码)。如果以后需要,可以从文件系统中请求这些数据。对于 iOS,不会从应用程序中回收匿名内存页面,除非应用程序终止或显式释放内存。
参考:《操作系统概念》