操作系统 内存管理 分页/分段/段页式管理
Posted baiiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统 内存管理 分页/分段/段页式管理相关的知识,希望对你有一定的参考价值。
前言
上篇介绍了内存管理的连续分配方式,本文介绍非连续分配方式。
非连续分配方式
-
连续分配方式的缺点:
固定分区分配:缺乏灵活性,会产生大量内存碎片,内存的利用率极低。
动态分区分配:会产生很多外部碎片,虽然可以用紧凑技术来处理,但是紧凑的时间代价很高。 -
非连续分配
如果可以将一个进程分散的装入到许多不相邻的分区中,便可以充分的利用内存,而无需再进行紧凑。于是变产生了非连续分配方式。
连续分配:为用户进程分配的是一个连续的内存空间;
非连续分配:为用户进程分配的是一些分散的内存空间;
分页式存储管理方式
分页存储的基本概念
将内存空间分为一个个大小相等的分区(如每个分区4K),每个分区就是一个页框、或称页帧、内存块、物理块;
每个页框有一个编号,即页框号、或称内存块号、页帧号、物理块号;
页框号从0开始。
将用户进程的地址空间也分为与页框大小相等的一个个区域,称为页、或称页面;
每个页面也有一个编号,即页号,页号也是从0开始的。
可以这么理解,页框是物理地址,编号为页框号;页面是逻辑地址,编号为页号;
操作系统以页框为单位为各个进程分配内存空间;
进程的每个页面分别放入一个页框中,也就是说进程的页面与内存的页框有一对一的关系;
各个页面不必连续存放,也不必按先后顺序来,可以放到不相邻的各个页框中。
分页存储的地址转换
由上图看到,要进行逻辑地址到物理地址的转换,需要以下几步:
- 计算出逻辑地址对应的页号
- 计算出该页号对应对应页面在内存中的起始地址
- 计算出逻辑地址在页面内内的偏移量
- 物理地址 = 页面地址 + 页面偏移量
如何计算页号和页面偏移量
计算机中用二进制表示逻辑地址,如果一个页面大小为4k时,则分配如下图所示:
如何计算页号对应的页框号
操作系统会为每个进程建立一张页表,用来记录本进程内每个页面在内存中存放的位置;
- 一个进程对应一张页面
- 进程的每一页应用 一个页表项
- 每个页表项由页号和块号组成
- 页面记录进程页面和实际存放的内存的内存块之间的对应关系
- 每个页表项的长度是相同的,页号是隐含的
如下示例,用3个字节表示块号,则该进程的页表大小为3n个字节;当然,实际中计算机是用4个字节表示块号,是为了方便页表的查询,使得每个页面恰好可以装得下整数个页表项。
基本地址变换机构
基本地址变换机构是用于实现逻辑地址到物理地址转换的一组硬件机构。 基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。
通常会在系统中设置一个页表寄存器PTR,存放页表在内存中的起始地址F和页表长度M。其中页表长度是指这个页表中总共有几个页表项,即总共有多少页;页表项长度是指每个页表项占多大的存储空间;页面大小指一个页面占多大的存储空间;
进程未执行时,页表的起始地址和页表长度放在进程控制块PCB中;当进程被调度时,操作系统内核会把他们放到页表寄存器中。
- 基本地址变换流程如下图所示:
具有快表的地址变换机构
它是基于基本地址变换机构的改进版本。
局部性原理
局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
-
时间局部性
如果执行了程序中的某条指令,那么不久之后这条指令很有可能再次执行;
如果某个数据被访问过,不就之后该数据很可能再次被访问(因为程序中存在大量的循环); -
空间局部性
如果程序访问了某个存储单元,那么不就之后其附近的内存单元也很有可能被访问(因为很多程序在内存中都是连续存放的)。
基于局部性原理,在上文介绍的基本地址变换机构中,每次访问一个逻辑地址,都需要查下内存中的页表,可能连续很多次查到的都是同一个页表,于是便有了块表。
快表
快表,又称为联想寄存器TLB(Translation lookaside buffer),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。
-
因为局部性原理,一般来说快表的命中率可以达到90%以上。
-
基于快表的地址变换流程如下:
两种变换机构总结
两级页表
单级页表存在的问题
-
假设32位指令机器,4G内存,页面大小为4KB,则共划分为2^32 / 2^12 = 220个内存块,即该系统中用户进程最多将会有220个页表项,再假设页表项长度为4B,即一个页表最大需要 2^20 * 4B = 222B,则共需要222/212=210个页框存储该页表。
所以第一个问题是需要专门给该进程分配2^10=1024个连续的页框来存储这个进程的页表。 -
由于局部性原理,进程在一段时间内可能只需要访问几个页面就可以正常运行了。因此没必要让整个页表都常驻内存。
解决问题一
可以将页表再进行分组,使每个内存块刚好刚好可以放入一个分组。如刚才的例子,可以让每1K个连续的页表为一组,1K * 4B = 4K,刚好可以占满一个内存块,再将各组离散的放到各个内存块中。
当然此时需要为离散分配的页表再建立一张页表,称为页目录表、或称外层页表、顶层页表。
解决问题二
即使用虚拟存储技术。
可以在需要访问页面时才把页面调入内存,可以给每个页表项添加一个是否在内存中的标志位;
若想访问的页面不在内存中,则产生缺页中断,然后将目标页面从外存调入内存。
分段存储管理方式
进程的地址空间,按照程序程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每段从0开始编址。
内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各个段之间可以不相邻。
-
段表
-
地址变换流程
分段与分页的对比
-
分页是系统行为,对用户不可见;
分段是对用户可见的,用户编程时需要显式的给出段名。 -
分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址;
分段的用户进程地址空间是二维的,程序员在标识一个地址时,纪要给出段名,也要给出段内地址; -
分段比分页更容易实现信息的共享和保护。因为可以显式的按段进行共享。
-
分段和分页访问一个逻辑地址都需要两次访存;分段存储中也可以引入快表;
-
优缺点
段页式管理方式
综合了分页式和分段式的优缺点;
将进程按照逻辑模块分段,再将各段分页,再将内存空间分为大小相同的内存块,然后进程内各个分页装入各个内存块中。
-
段表、页表
-
地址变换流程
其中也可以引入快表;
以上是关于操作系统 内存管理 分页/分段/段页式管理的主要内容,如果未能解决你的问题,请参考以下文章
:内存管理 -- 非连续分配管理方式:基本分段存储管理方式段页式管理方式
(王道408考研操作系统)第三章内存管理-第一节8:非连续分配管理方式之段页式管理方式