计算机操作系统之存储器管理3
分页存储管理、分段存储管理、段页式存储管理
作为存储器管理的第三篇文章,该文介绍了离散分配基础知识。
分页存储管理的基本方法
(1)页面和物理块
页面。分页存储管理进程将进程的逻辑地址空间分成若干个页,并为每页加以编号。相应的,也把内存的物理地址空间划分成若干个块,同样加以编号。在为进程分配内存时,以块为单位,将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页通常使用不了一块的内存,会形成“页内碎片” 。
(2)页面大小
如果选择过小的页面大小,虽然一方面可以减小内存碎片,有利于内存使用率的提高,但另一方面会造成页表过大,占用大量内存。此外,还会减低页面的换入换出效率。
如果选择过大的页面大小,则会使页面的碎片变多。
通常选择1k-8k。
(3)页表
OS为每个进程维护一张页表。实现页号到物理块号的映射。
地址变换机构
为了能够将逻辑地址转换为内存中的物理地址,在系统中需要设置地址变换机构。由于页内地址和物理地址是一一对应的(例如,1k的逻辑地址是0~1023,对应的物理块也是),因此,地址变换机构就是借助页表实现从页号到物理块号的映射变换。
基本的地址变换机构
(1)页表寄存器
进程在运行期间,每一条指令都需要进行地址变换,执行频率很高,因此需要将该工作交给硬件执行。但是页面的数目可能会有上千个到几十万个,每个页表使用一个寄存器显然是不合适的。因此,页表大多驻留在内存中,在系统只设置一个页表寄存器,其中存放每个页表在内存中的起始地址和长度。
在进程没有执行的时候,页表的始址和长度存放在进程的PCB中。但调度程序调度某进程时,才将这两个数据放入页表寄存器中。因此多个进程的并发执行只需要一个页表寄存器。
(2)变换过程
当进程需要访问某个逻辑地址的数据时,分页地址变换机构会自动的将逻辑地址分为页号和偏移量,再用页号查询页表。在检索之前,现将页号与页表的长度对比,如果页号大于页表长度,将产生一次越界中断。否则的话,寄存器会将页号乘以页面大小再加上偏移量,计算出该页在页表中的位置,从而查询到物理块号,再将之装入物理地址寄存器中,将块号与偏移量拼接形成物理地址。
具有快表的地址变换机构
由于页表是存放在内存中的,这使得CPU每次存取数据的时候,都要访问两次内存。第一次是访问内存中的页表,得知物理块号,将块号与偏移量拼接形成物理地址。第二次访问内存时使用得知的物理地址访问数据(获取或者写入)。
咋办呢?在地址变换机构中增设了一个高速缓存寄存器,或称为“快表”,用以存放之前访问的页表项(理解为时慢表的部分复制)。
这样的话,才CPU给出逻辑地址后,地址变换机构直接使用页号访问快表,并将物理块号送到物理地址寄存器。如果快表中没有的话,才会使用页表寄存器进行慢表(内存页表)的访问,并将物理块号送到物理地址寄存器,与此同时还会将这次获取的信息存入到快表中。如果这时候快表满了,咋办?
那么OS必须找到一个它认为不在需要的页表项,将其换出。一个合理优秀的页面置换算法能有效提高快表的命中率。
出于程序运行的局限性,据统计,从快表中直接命中页表项的概率达到90%以上。
页表过大的问题
现如今,我们的电脑都是32位或者64位的,这意味每个进程的逻辑地址是非常大的(2^32 ~ 2^64)。假设页表大小为4k,那么在一个32位的电脑上每个进程的页表会占用1M多的空间,而且还是连续的。显然这是不现实的,有两种方案解决:1.离散的存储页表,2.将部分页表驻留在磁盘,只把部分页表调入内存。
分段存储管理
存储管理的方式是在不断发展的。当OS由单道向多道发展时,存储管理方式便由单一连续分配发展为固定分区分配。为了能够适应不同大小的程序,发展为了动态分区分配。为了能够更好的提高内存利用率,进而由连续分配方式发展为了离散分配方式----分页存储。
如果说,推动上述发展的动力主要是直接或间接的提高内存利用率,那么,引入分段存储管理方式的目的则主要是为了满足用户(程序员)在编程和使用上的多方面的需求,因此,这种存储管理方式已成为当今所有存储管理方式的基础,许多高级编程语言和C语言的编译程序也都支持分段存储管理。
(1)进程的分段
把进城按逻辑意义划分为多个段,每段有段名,长度不定,进程由多段组成。(代码段、数据段、堆栈段)
(2)内存分配方式
以段为单位装入,每段分配连续的内存;但是段与段之间不要求相邻。
(3)段表
记录每一段在内存中所映射的位置。含有段号、段长、基地址。
物理地址=基地址+偏移地址
合法的地址范围:偏移地址<段长
(4)段的共享
共享段在内存只有一份存储;共享段被多个进程映射到各自段表;需要共享的模块都可以设置为单独的段。
(5)段式系统的缺点
段需要连续的存储空间;段的最大尺寸收到内存大小的限制;在辅存中中管理可变尺寸的段比较困难。
段式系统与页式系统的区别
(1)段长可变,页面大小固定
(2)段的划分有逻辑意义,页面无意义
(3)段方便共享,页面不方便共享
(4)段偏移有溢出;页面无
(5)段用户可见,页面用户不可见
(6)段式系统是二维地址空间,页式系统是一维地址空间。
段页式存储
在段中划分页面。