操作系统--分页(一)

前言

分页(paging)内存管理方案允许进程的物理地址空间可以是非连续的。分页避免了将不同大小的内存块大小匹配到交换空间上这样的麻烦,前面所诉的内存管理方案都有这个问题,当位于内存中的代码或数据需要交换出时,必须先在备份存储上找到空间。这时问题就产生了。备份存储也有前面所诉与内存相关的碎片问题,只不过访问更慢,因此不适宜采用合并。各种形式的分页由于其优越性,因此通常为绝大多数操作系统所采用。
传统上的分页技术的支持是由硬件来支持的,然而,最近的设计是通过将硬件和操作系统相配合来实现分页。

基本概念

实现分页的基本方法涉及将物理内存分为固定大小的块: 称为帧(frame); 而将逻辑内存也分为同样大小的块,称为页(page)。当需要执行进程时,其页从备份存储中调入到可用的内存帧中,备份存储页分为固定大小的块,其大小与内存帧一样。
分页硬件支持如图所示:
分页的硬件支持.png-13.9kB
由CPU生成的每个地址分为两部分: 页号(p) 和页偏移(d)。页号作为页表中的索引。页表包含每页所在物理内存的基地址,这些基地址与页偏移的组合就形成了物理地址,就可送交物理单元。
内存的页模型如图所示:
逻辑地址内存和物理内存的分页模型.png-10.5kB

分页

页大小是由硬件来决定的。页的大小通常那为 2 的幂,根据计算机结构的不同,其每页大小从512B-16MB 不等。选择页的大小为 2 的幂可以方便的将逻辑地址转换为页号和页偏移,如果逻辑地址空间为2^m, 且页大小为2^n单元(字节或字),那么逻辑地址的高 m-n 位表示页号,而从低n位表示页偏移,这样,逻辑地址如下所示:
逻辑地址.png-2.9kB
其中p作为页表的索引,而d作为页的偏移。
使用4B的页对32B的内存进行分页的例子.png-23.9kB

如图上图所示:如果页表大小为4B, 而物理页内存为32B(8页)。考虑一下用户视角的内存是如何映射到物理内存的,逻辑地址0 的页号为0,页偏移为0,根据页表,可以查到页号0对应为帧5,因此逻辑地址0映射为物理地址20(=(5X4) + 0)。逻辑地址3(页号为0,页偏移为3)映射为物理地址23(=(5X4) + 3)。逻辑地址4的页号为1,页偏移为0,根据页表,页号1 对应为帧6 ,因此,逻辑地址4映射为物理地址24(=(6X4)+0)。逻辑地址13映射为物理地址9

分页是一种动态重定位,每个逻辑地址由分页硬件绑定为一定的物理地址,采用分页类似于使用一组基(重定位)地址寄存器,每个基地址对应着一个内存帧
采用分页技术不会产生外部碎片:每个帧都可以分配给需要它的进程,不过分页有内部碎片,注意分配是以帧为单元进行的,如果进程所需要的内存并不是页的整数倍,那么最后一个帧就可能用不完,例如:如果页的大小为2048B, 一个大小为 72776 B的进程需要35个页和1086 B。 该进程会得到36个帧,因此, 2048-1086 = 962B 的内部碎片,在最坏的情况下,一个需要 N 页再加上1B的进程,需要分配 n + 1个帧,这样几乎产生一个整个帧的内部碎片。

如果进程大小与页大小无关,那么可以推测每个进程可能有半页的内部碎片。这一结构意味着小一点的页可能好一些,不过,由于页表中的每一项也有一定的开销,该开销随着页的增加而降低,而且,磁盘I/O 操作随着传输量的增加会更改为有效的,一般来说,随着时间的推移,页的大小页随着进程、数据和内存的不断增大而增大。现在,页大小通常为4-8KB,有的系统可能支持更大的页,有的CPU内核可能支持多种页大小。

当系统进程需要执行时,它将检查该进程的大小(按页来计算),进程的每页都需要一帧,因此如果进程需要n页,那么内存中至少因该有n个帧,如果有,那么就可以分配给新的进程。进程的第一页装入一个已分配的帧,帧号放入进程的页表中,下一页分配给另一个帧,其帧号页放入进程的页表中等。

分页特点

分页的一个重要特点是用户视角的内存和实际的物理内存的分离。用户程序将内存作为一整块来处理,而且它只包括这一个进程。事实上,一个用户程序与其他程序一起,分布在物理内存上。用户视角的内存和实际的物理内存的差异是通过地址转换硬件协调的

逻辑地址变成物理地址。这种映射是用户不知道的,但是受操作系统所控制。注意用户进程根据定义是不能访问非它所占用的内存的。它无法访问其页表所规定之外的内存,页表只包括进程拥有的那些页。

由于操作系统管理物理内存,它必须知道物理内存的分配细节: 哪些帧已占用,哪些帧可用,总共多少,等等,这些信息通常保存在称为帧表的数据结构中,在帧表中,每一个条目对应着一个帧,以表示该帧是空闲还是已占用的,是被哪个(或哪些)进程的哪个页所占用。

另外,操作系统必须意识到用户进程是在用户空间内执行,且所有逻辑地址必须映射到物理地址,如果用户执行一个系统调用(例如:进行I/O),并提供地址作为参数(如一个缓冲),那么这个地址必须要映射成物理地址,操作系统为每个进程维护一个页表的副本,就如同它需要维护指令计数器的寄存器的内容一样,当操作系统必须手工将逻辑地址映射成物理地址时,这个副本可用来将逻辑地址转变为物理地址,当一个进程分配到CPU时,CPU调度程序可以根据该副本来定义硬件页表,因此,分页增加了切换时间。

坚持原创技术分享,您的支持将鼓励我继续创作!