精华内容
下载资源
问答
  • 2017-08-27 18:50:41

    操作系统——分页式内存管理

    为什么要引入内存管理?

    答:多道程序并发执行,共享的不仅仅只有处理器,还有内存,并发执行不过不进行内存管理,必将会导致内存中数据的混乱,以至于限制了进程的并发执行。

    扩充内存的两种方式?

    答:覆盖和交换技术是扩充内存的两种方法

    1:覆盖技术。覆盖的基本思想是:由于程序运行时并非任何时候都需要访问程序和数据的各个部分(尤其对大程序而言),因此可以把用户空间分成一个固定区和若干个覆盖区。经常活跃的部分放在固定区,其余部分按照调用关系分配。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用之前,系统再将其调入覆盖区,替换覆盖区中原有的段。

    特点:打破了必须将一个进程的全部信息装入主存后才能运行的限制,但是当同时运行的程序的代码量大于主存时仍不能允许,内存中常能更新的只有覆盖区的段

    2:交换技术。交换的基本思想是:把处于等待状态的程序从内存移到辅存,把内存空间腾出来,这一过程被称为换出;把准备好竞争CPU运行的而程序从辅存移到主存,这一过程称为换入。

    特点:交换技术主要是在不同的进程之间进行,覆盖则是用于同一个进程。

    连续内存分配管理

    答:连续分配方式,指为一个用户分配一个连续的内存空间。包括:

    1:单一连续分配。内存此时分为系统区和用户区,系统区只分配给操作系统使用,通常在低地址部分;用户区为用户提供。内存中只有一道程序,也无需进行内存保护。无外部碎片但是有内部碎片,且存储器效率低下

    2:固定分区分配。将内存空间划分为若干个固定大小的区域,每个分区只能装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中,选择适当大小的作业装入该区,分为(分区大小相等和分区大小不相等两种方式)无外部碎片但是有内部碎片(分区内部有空间的浪费),且存储器效率低下,但是可存在多道程序,是用于多道程序并发执行的最简单的内存分配方式。

    3:动态分区分配。也成为可变分区分配,它不预先对内存进行划分,而是在进程装入内存时,根据进程的大小动态的建立分区,并使分区的大小正好适合进程的需要,其分区的数目和大小是可变的。但是随着时间的推移,很容易产生外部碎片(区域1进程释放后20M(区域1),区域2中19M仍在 ,再进入14M,放在区域一原来的地方,进程间的内存空间被浪费6M),外部碎片指的是分区以外的存储空间被浪费

    解决问题1:为了解决外部碎片的问题,可以使用“紧凑”技术来解决:操作系统不时的对进程进行移动和整理(需要动态重定位寄存器的支持,较为费时)

    解决问题2:动态分区的分配问题,

    1:首次适应算法,空闲分区以地址递增的方式链接,分配内存时顺序查找,找到大小满足要求的第一个空闲分区

    通常该算法是最快最好的也是最简单的。

    2:最佳适应算法,空闲分区以容量递增形成分区链,找到第一个满足要求的空闲分区

    实际上新能不佳,因为每次最佳分配通常会留下很小的难以利用的内存块,产生外部碎片。

    3:最坏适应算法,又称最大适应算法,空闲分区以容量递减形成分区链,找到第一个满足要求的空闲分区,也就是挑选出最大的分区

    性能较差,因为算法开销也是需要考虑的一部分

    4:邻近适应算法,又称循环首次适应算法,也就是从首次适应算法中演变而来,不同的是,从上次查找结束的位置开始继续查找

    性能较差

    非连续内存分配管理

    答:根据分区的大小是否固定主要分为分页和分段的存储管理方式

    非连续分配允许一个程序分散的装入到不相邻的内存分区中,这需要额外的空间去存储它们的存储区索引,使得非连续分配方式的存储密度低于连续存储方式

    1.分页式存储管理方式

    分页式存储管理方式,根据运行时是否需要把作业的所有页面都装入内存才能运行分为基本分页存储管理方式和请求分页存储管理方式

    @基本分页式存储管理方式

    答:在连续存储管理方式中,固定分区会产生内部碎片,动态分区会产生外部碎片。这两种技术对内存的利用率都比较低,分页:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位,每个进程也以块为基本单位划分,进程在执行时,以块为单位逐个申请主存中的块空间。

    分析:从形式上来看,很像固定分区,但却有着本质的不同点:1:块的大小相对于分区来说要小得多 2:进程也按照块来划分,运行时按照块来申请主存,尽管这样也会产生内部碎片,但是相对于进程的大小来说是非常小的,每个进程平均只产生半个块大小的内部碎片

    基本概念

    进程中的块称为

    主存中的块称为页框

    外存也以同样的单位进行划分,也称为

    进程执行时,向主存申请块,就产生了页与页框的一一对应关系

    为方便地址转换,页面的大小应该是2的整次幂,页面的大小也应该适中,太小的话回使得进程的页面数过多,页表过长,占用大量的内存且增加硬件地址转换的开销,降低页面的换入/换出效率。过大会使得页内碎片增大,降低内存的利用率。所以空间效率和时间效率都应该被考虑在内。

    逻辑地址)地址结构:包含两部分,第一部分为页号P,后一部分为页内偏移量W,地址长度为32位,其中0~11位为页内地址,即每页大小为4 KB,12~31位为页号,地址空间最多允许有2的30次方页。(二进制与十进制之间的转换)

    页表:为了便于在内存中找到进程的每个页面对应的物理块,系统为每个进程建立了一张页表,记录页面在内存中对应的物理块号,页表一般存在内存中。页表的第一部分存的是页号,第二部分存的是物理内存中的块号,页表项的第二部分与地址的第二部分共同组成物理地址

    基本地址变换机构

    地址变换机构的任务是将逻辑地址转换为内存中的物理地址,地址变换是借助于页表实现的(注意十进制与二进制的转换)地址空间为一维。

    第一步:根据逻辑地址计算逻辑地址(页号 * 页长 + 偏移地址)中的页号(P = A/L)和地址偏移量(W = A %L)

    逻辑地址A = 2500 B,页面大小(块的大小) L = 1 KB, 得到 p = 2, W = 452

    第二步:比较页号P和页表长度M,若P > M,则产生越界中断,否则继续执行

    第三步:页表寄存器中,分为两部分(页表起始地址F和页表长度M),计算页号P在页表中对应的物理地址的页表项地址(对应块号b) p = 页表起始项F +页号P * 页表项长度,得到物理块号,直接对应的2页号对应块号8(页号与块号在页表中有直接对应),注意:页表长度:指的是一共有多少页。页表项长度:指的是一页占多大内存。

    第四步:计算物理地址E = b L +W (块号 块大小+地址偏移量)得到E = 8 * 1 KB +452 B = 8644 B ,得到物理空间之后,就可以访问内存了。

    页表项大小的确定

    以32位逻辑地址为例,字节为编码单位,一个页面的大小为4 KB,所以2的32次方 B 除以4 KB地址空间一共有 1 M 页,则需要log 2 (1 M) = 20 位才能保证表示范围能容纳所有的页面,又以字节为编码单位,[20 / 8] = 3 B,所以页表项的大小应该大于等于3 B,取4 B为常见。

    将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,

    于是可从中得到该页的物理块号,将之装入物理地址寄存器中。

    列出式子出来: 页表始址+页号x页表项长度

    1)页表项长度是页面长度是吗?

    2)如果是页面长度,那两者相乘就是整个内存的大小来,你想一想整个内存都用来存储页表可能吗?

    当然是不可能了,首先内存被划分成若干个和页面大小相等的片。

    每个页表项代表一个页面的地址,一般很小。

    假设内存大小是2GB,页面大小(物理块)是4KB,页表项长度是4B。

    则整个内存可以被划分成2GB/4KB=512K个页面。

    页表的长度=页表项的长度x页面的个数=4Bx512K=2M。

    内存中用2M的大小来存放页表。

    这下清楚了吧,实际上是取了每一个页号对应的页面的起始地址,或许还有对应的物理块号(应该有)。

    下面抄写操作系统中的一句话便于理解:

    对于一个具有32位逻辑地址空间的分页系统(4GB),规定页面大小为4KB,则在每个进程页表中的页表项

    可达1M个之多。4GB/4KB=1M

    又因为每个页表项占用1个字节(1B),故每个进程仅仅其页表就要占1MB的内存空间

    而且还要求是连续的,显然这是不现实的,解决问题方法:

    1)采用离散分配方式来解决难以找到一块连续的大内存空间的问题。

    2)只将当前需要的部分页表项调入内存,其余的页表项仍然驻留在磁盘上,需要时再调入。

    快速地址变换机构

    上述方法需要访问两次内存,一次是访问页表,确定所存取数据或指令的物理地址,一次是根据该物理地址存取数据或者指令。显然这样的方法较慢。

    为此我们可以在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器——快表,又称联想寄存器,用来存放当前访问的若干页表项,加速地址变换过程,命中率达到90%以上

    第一步就变为了:将逻辑地址中的页号直接送入高速缓存寄存器,与快表进行匹配,未找到则按慢表处理~

    有些处理器设计为快表和慢表同时查找,快表查找成功则终止慢表的查找

    两级页表

    由于引入了分页管理,进程在执行时不需要将所有页都调入内存页框中,只要将保存有映射关系的页表存入内存中即可,我们这里考虑一下页表的大小,以32位逻辑空间,页面大小4 KB ,页表项大小4 B 为例,若要实现进程对全部逻辑地址空间的映射,则每个进程需要需要2的20次方(2的32次方 / 2的12次方(也就是页面的大小 4 KB ))(表示的也就是页面的个数),约100万个页表项。2的20次方个页表项 * 4 B ,为4 MB ,也就是说每个进程在页表项这一块就需要4 MB 的主存空间,显然这是比较大的内存占用。即使不考虑对全部逻辑地址空间的映射,一个逻辑地址空间稍大的进程,其页表项所占用的主存空间也是过大的。

    例:40 MB 的进程,页表项总共占有(40 MB / 4 KB * 4 B ) 40 KB 的主存空间,页面大小为4 KB,那么就需要10 个内存页面来存储整个页表,整个进程需要(40 MB / 4 KB )为1万个页面,在实际执行中只需要几十个页面进入内存框就可以运行, 所以这10个页面的页表相对于实际执行的几十个进程页面来说,内存利用率肯定是比较低的。从另一方面来说,这10个页面的页表也并不需要同时保存在主存中,大多数情况下,映射所需要的页表项都在页表的同一个页面。

    综上,为了压缩页表,我们将页表映射的思想进一步延伸,使用一个层次结构的页表——两级页表,从上例中,我们将10页的页表进行地址映射,建立上一级页表,用于存储页表的映射关系。这里对占10个页面的页表进行映射,在上一级页表中只需要10个页表项,所以上一级页表只需要1个页面(4 KB)就足够表示了。在进程的执行过程中,只需要将占用1页的上一级页表存入主存中即可,进程的页表和进程的页面可以后续进行调入。

    实际上,我们需要的就是一张索引表,告诉我们第几张页表应该上哪去找,这样就不用将所有的页表存入主存,所以,这就是页表的页表,称为二级页表。规定:为了查询方便,顶级页表最多只能有一个页面

    更多相关内容
  • 分页内存管理

    2021-07-20 20:43:45
    分页系统的核心就是将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4KB、8KB或16KB等,并以页面作为内存空间的最小分配单位,一个程序的一个页面可以存放在任意一个物理页面里。 这样,由于物理空间是页面...

    为了解决交换系统存在的缺陷,出现了分页系统

    分页系统的核心就是将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4KB、8KB或16KB等,并以页面作为内存空间的最小分配单位,一个程序的一个页面可以存放在任意一个物理页面里。

    这样,由于物理空间是页面的整数倍,并且空间分配以页面为单位,将不会再产生外部碎片。同时,由于一个虚拟页面可以存放在任何一个物理页面里,空间增长也容易解决:只需要分配额外的虚拟页面,并找到一个闲置的物理页面存放即可。

    在分页系统下,一个程序发出的虚拟地址由两部分组成:

    页面号
    页内偏移值
    

    如图12-3所示:
    在这里插入图片描述

    例如,对于32位寻址的系统,如果页面大小为4KB,则页面号占20位,页内偏移值占12位。

    为了解决程序比内存大的问题,我们可以允许一个进程的部分虚拟页面存放在物理页面之外,也就是磁盘上。在需要访问这些外部虚拟页面时,再将其调入物理内存。由此,交换系统的所有缺陷均被克服。

    地址翻译

    从上面的分析可以看出,分页系统要能够工作的前提是:

    对于任何一个虚拟页面,系统知道该页面是否在物理内存中,如果在的话,其对应的物理页面是哪个;

    如果不在的话,则产生一个系统中断(缺页中断),并将该虚页从磁盘转到内存,然后将分配给它的物理页面号返回。也就是说,页面管理系统要能够将虚拟地址转换为物理地址。该翻译过程如下所示。

    在这里插入图片描述

    因此,分页系统的核心是页面的翻译,即从虚拟页面到物理页面的映射。而这个翻译过程由内存管理单元(MMU)完成。

    MMU接收CPU发出的虚拟地址,将其翻译为物理地址后发送给内存。内存单元按照该物理地址进行相应访问后读出或写入相关数据,如图12-4所示。

    在这里插入图片描述

    内存管理单元对虚拟地址的翻译只是对页面号的翻译,即将虚拟页面号翻译成物理页面号。而对于偏移值,则不进行任何操作。这是因为虚拟页表和物理页表大小完全一样,虚拟页面里的偏移值和物理页面里的偏移值完全一样,因此无须翻译。

    **那么内存管理单元是通过什么手段完成这种翻译的呢?当然是查页表。**对于每个程序,内存管理单元都为其保存一个页表,该页表中存放的是虚拟页面到物理页面的映射。每当为一个虚拟页面寻找到一个物理页面后,就在页表里面增加一个记录来保留该虚拟页面到物理页面的映射关系。随着虚拟页面进出物理内存,页表的内容页不断发生变化。

    在程序发出一个虚拟地址给内存管理单元后,内存管理单元首先将地址里面页号部分的字位分离出来,然后判断该虚拟页面是否有效,是否存放在内存,是否受到保护

    如果页面无效,即该虚拟页面不存在或没有在内存,也就是说该虚拟页面在物理内存里面没有对应。如果该页面受到保护,即对该页面的访问被禁止,则产生一个系统中断来处理这些特殊情况。对于无效页面访问,需要终止发出该无效访问的进程。对于合法但不在物理内存中的页面,我们通过缺页中断将该虚拟页面放进物理内存。对于受保护的页面,同样终止该进程。

    这里有一点要解释的就是非法虚拟页面。什么叫做虚拟页面非法呢?程序在加载前所使用的一切地址均是虚拟地址,即程序存在于虚拟空间。而虚拟空间的大小与系统的寻址长度有关。例如,32位寻址的系统虚拟地址空间为232-1,即一个程序最多可以有232-1条指令。但是一个程序可能没有这么多条指令。事实上,大部分程序都不会占满整个虚拟空间。这样,就有一部分虚拟空间是空的,即程序没有使用的部分。这部分空间就是非法虚拟空间。如果一个程序访问了这片空间,即判定为非法,而无须再判断该虚拟页面是否在物理内存。比如一个程序大小为100KB,如果该程序试图访问虚拟地址100KB以上的地址,即视为非法访问。进行这种访问的程序即为程序错误或失效。

    如果页面有效且在物理内存,又没有受保护,则使用该虚拟页面号作为索引,找到页表中对应该虚拟页面的记录,读取其对应的物理页面号,如图12-5所示。

    在这里插入图片描述

    **那么内存管理单元是怎么知道一个页面是否有效,是否被保护,是否在物理内存呢?这个简单,将这些信息储存在页表里面即可。**这样,页表不只是用来进行翻译,还用来进行页面的各种状态判断,因此,页表在分页系统里面的地位举足轻重。

    总结

    • MMU将虚拟地址翻译为物理地址
    • 翻译的手段是页表
    • 翻译前先会对虚拟地址进行合法性验证

    参考

    Linux的内存分页管理 - Vamei - 博客园

    展开全文
  • 分页存储管理定义2.分页存储管理地址的转换3.页表4.基本地址变换机构5.具有快表的地址变换机构6.单级页表访问时间7.单级页表存在的问题8.两级页表8.1 两级页表原理图8.2 两级页表逻辑地址转换成物理地址8.3 两级页表...

    1.分页存储管理定义

    • 分页存储管理系统将进程的逻辑地址空间分为若干页面,并加以编号;同时,把内存地址空间分为若干内存块,并加以编号。
    • 页面大小:当页面过小时,虽然可以减少内存碎片,有利于提高内存利用率,但会造成每个进程占用过多页面,从而导致页表过长,占用大量内存空间;当页面过大时,虽然可以减小页表的长度,提高页面换出换入速度,但页内碎片变大。因此,页面大小应该适中,而且页面大小为2的整数幂,通常为1KB-8KB。
    • 操作系统以内存块为单位为每个进程分配内存空间,进程中的每个页面与内存块对应,每个页面没有必要连续存放,也没有必要按顺序存放

    2.分页存储管理地址的转换

    • 算出逻辑地址对应的页号页号=逻辑地址/页面长度
    • 要知道该页号对应页面在内存中的起始位置
    • 算出逻辑地址对应偏移量页面偏移量=逻辑地址%页面长度
    • 物理地址=页面起始地址地址+页面偏移量。
    • 总结:如果每个页面的大小为2的k次方,用二进制表示逻辑地址,则末尾k位表示页内偏移量,前面部分表示页号。因此一般页面大小为2的整数幂。

    3.页表

    • 作用:实现从逻辑地址物理地址的映射。
    • 一个进程对应一张页表,每个页表项的长度相同,页号是隐藏的。
    • 进程中的每一页面对应一个页表项,每个页表项有页号和内存块号组成。
    • 页表记录页面内存块之间的对应关系。

    4.基本地址变换机构

    • 图解

    5.具有快表的地址变换机构

    • 具有快表的地址变换机构是基础地址变换机构的改进版
    • 快表:一种访问速度比内存快得多的高速缓存器,用来存放当前访问的若干页表项,可以加快地址变换的过程。
    • 依据特性:时间局部性和空间局部性。
    • 图解

    6.单级页表

    6.1 单级页表访问时间

    • 第一次访问内存时间:查找页面对应的页表项所消耗的时间t1。
    • 第二次访问内存时间:页表项的内存块号和页面偏移量形成实际物理地址,访问该物理地址所消耗的时间t2。
    • 基础地址转换机构:T = t1 + t2;
    • 引入快表转换机构:T = t + (1-a)*t1 + t2;。其中a表示命中率,t表示查询块表需要的时间。

    6.2 单级页表存在的问题

    • 页表必须连续存放,因此页表很大时,需要占用很多连续的内存空间。
    • 没有必要让整个页表常驻内存,因为进程在一段时间内只需访问一些特定的页面。

    7.两级页表

    7.1 两级页表原理图

    • 两级页表的图示
    • 对于正在运行的进程,必须将一级页表调入内存,而二级页表只需调入一页或者多页即可。

    7.2 两级页表逻辑地址转换成物理地址

    • 按照地址结构将逻辑地址拆分成三部分
    • PCB中读取一级页表地址,再根据一级页表查找二级页表存放的位置
    • 根据二级页表找到最终要访问的内存块号
    • 内存块号结合页内偏移量得到实际物理地址。

    7.3 两级页表访问次数分析(假设没有快表)

    • 第一次:访问一级页表。
    • 第二次:访问二级页表。
    • 第三次:访问实际物理地址。

    8.反置页表

    8.1 反置页表引入目的

    • 为了减少页表占用的内存空间。
    • 物理内存空间大小有关,与逻辑内存空间无关。

    8.2 反置页表实现

    • 一般页表的表项是按页号进行排序,页表项中的内容是物理块号。而反置页表是为每一个内存块设置一个页表项并将按内存块号排序,其中的内容则是页号及其隶属进程的标志符

    8.3 反置页表地址转换

    • 在利用反置页表进行地址变换时,是用进程标志符和页号去实现。
    • 若检索完整个页表都未找到与之匹配的页表项,表明此页此时还没有调入内存,对于具有请求调页功能的系统应产生请求调页;若无此功能则表示地址出错。
    • 如果检索到与之匹配的表项,则该页表项的序号便是该页所在的内存块号,将该内存块号与页内偏移量一起构成物理地址。

    8.4反置页表基于关联内存实现

    • 如果内存块数比较大时,成本开销大。
    • 如果内存块数比较小时,页寄存器可以被放置在关联内存。如果查找成功内存块被提取,否则出现异常。
    • 限制因素:大量的关联内存非常昂贵,难以在单个时钟周期内完成,耗电。

    8.5反置页表基于哈希算法实现

    • 需要设置性能良好的哈希算法减少碰撞。

    9.分段的引入目的

    • 方便编程:逻辑地址由段号和段内偏移量组成。
    • 共享信息:共享过程中建立独立的段
    • 保护信息:以信息的逻辑单元为单位。
    • 动态增长数据不断增长,且动态增长。
    • 动态链接以段作为基本单位进行链接。

    10.分段存储管理结构

    • 图解段表
      在这里插入图片描述
    • 段号:位数决定每个进程最多可以分为几段。
    • 段内偏移量:位数决定每个段的最大长度。
    • 段表寄存器:存放段表始址和段表长度。
    • 段表项:每个段对应一个段表项,其中记录该段在内存中的起始位置段的长度

    11.分段存储管理地址变换机构

    • 图示

    12.分页和分段

    12.1 分页和分段对比

    • 页是信息的物理单位,主要是为了消减外部碎片,从而提高内存利用率,对用户不可见;段是信息的逻辑单位,主要是为了满足用户需求,对用户可见,用户需要显式给出段名。
    • 页的大小是固定的;段的大小不是固定的,取决于用户编写的程序。
    • 分页的地址是一维的,因为相邻的页的地址在数值上是连续的;分段的地址是二维的,因为相邻的段的地址在数值上是非连续的
    • 分段比分页更容易实现共享信息和保护信息,共享的前提是纯代码,不属于临界区。
    • 分页第一次查询页表,第二次访问目标单元;分段第一次查询段表,第二次访问目标单元

    12.2 分页和分段优缺点

    • 分页管理:优点是内存利用率高,不产生外部碎片,只有少许的页内碎片;缺点是不按照逻辑模块编程,没有实现共享信息和保护信息。
    • 分段管理:优点是按照逻辑模块编程,实现共享信息和保护信息;缺点是段过大时分配连续内存空间不方便,同时产生外部碎片。

    13.段页式存储管理

    13.1 段页式存储管理结构

    • 原理分段和分页结合,即将用户进程分为若干段,再将每个段分成若干页,为每一个段赋予段名。
    • 段页式结构图示

    13.2 段页式存储管理地址变换机构

    • 图示
    • 引入快表:用段号和段内页号作为查询快表的关键字。若快表命中则仅需一次内存访问(访问实际物理地址)。

    14.分页存储管理的相关面试题

    15.分段存储管理的相关面试题

    1.分段的共享和保护怎么实现

    • 分段、锁机制
    展开全文
  • 本文目的不在于详解分页机制的内容,而在于从头捋清到底为什么非要采用分页机制做内存管理,因此有些繁琐,对分页机制的细节,将在其他文章讨论,欢迎交流和指正。 一、背景和缘起 1、内存管理要完成哪些任务? ...

    本文目的不在于详解分页机制的内容,而在于从头捋清到底为什么非要采用分页机制做内存管理,因此有些繁琐,对分页机制的细节,将在其他文章讨论,欢迎交流和指正。

    一、背景和缘起

    1、内存管理要完成哪些任务

    内存是整个计算机系统的”交通枢纽“,是指令和数据的集散地,具体地说,除了操作系统外,指令是进程的指令,数据是进程的数据,也就是说,内存管理所要解决的最基本问题就是“进程往哪放”以及“多少空间用来放进程”,这是“内存分配(Memory Allocation)”任务。

    其次,由于多任务的刚需,不同进程需要相对独立性,属于某个进程的空间不能被其他进程非法访问,以及有些只读内容不能被非法修改,这是“内存保护(Memory Protection)”任务。

    以上,是内存管理所必须完成的两个基本任务

    2、内存管理还要达到哪些要求

    内存(Memory)有如下性质:

    • 内存成本相对高,不可能做得无限大,因此内存是相对来说珍贵且有限的资源;
    • 内存的速度相对CPU内部的寄存器(Register)和缓存(Cache)来说很慢,因此访问内存对CPU来说是件相对低效的事;

    所有对内存管理策略的要求,正是针对以上这几点性质所提出:

    • 内存珍贵而有限,所以必须减少浪费
    • CPU访问内存相对低效,所以要减少不必要的内存访问,以提高效率;

    以上两点要求,是内存管理所要尽量满足的性能要求。

    “两个必须完成的基本任务+三项尽量满足的性能要求”是设计内存管理方法的关键。

    以下,谈解决上述问题的两种基本策略——连续分配(Contigious Allocation)和不连续分配(Noncontigious Allocation),在解决两个基本问题的基础上,探讨对三项性能要求的满足情况。

    3、操作系统放在哪?

    所有指令和数据都必须加载到内存中对CPU才有意义,操作系统也不例外,因此物理内存首先要分出大块来装载操作系统,一般做法是直接把一段低地址空间割给操作系统,剩下高地址空间用来放进程,在这一点,连续分配和不连续分配都是一样的。

    至于这段低地址空间中的操作系统内部是怎样分配空间的,我们暂时不管,把它当成黑箱就可,**我们只关心如何管理提供给用户进程的这部分内存空间,**后面所谈到的连续分配和不连续分配说的也都是如何把用户进程放到内存中的。

    二、连续分配以及连续分配的问题

    连续分配中的“连续”,指的是进程被装载时,被放到一片连续的内存空间中。思路直观而简单:找一块够大的空地,直接把进程囫囵扔进去就是了。

    1、内存分配

    连续分配的过程是这样的:

    一开始,没有进程,整片内存为空闲,相当于一个巨大的孔(hole)。
    在这里插入图片描述
    有进程来时,这个大孔分出一块装进程,剩余部分作为小孔,再有进程来,小孔再分,剩下更小的孔,依此类推,如下图所示( P i P_i Pi指进程):
    在这里插入图片描述
    到目前为止,一切完美,内存得到充分利用。

    然而,当已经加载出来的进程结束时,它会释放它的空间,由此产生一个新孔,这个孔极有可能和其他孔是不相连的,一来二去,内存的格局会变成下面这种情况:
    在这里插入图片描述
    这相当于,原本一块完整的大片空闲内存,被切碎成了许多小孔,最坏的情况是,每两个进程之间都有一块很小的孔。这时问题就来了:如果接下来的进程比较大,没有一个小孔装得下怎么办?

    例如,接下来要装载的进程需要100KB空间,内存中空闲区域总共有8000KB,但全是100个大小为80KB的小孔,总量远远管够,但偏偏就是容不下它。

    这就等于,这8000KB的内存全都没用了!

    这些空闲但因无法使用而废弃的小孔,叫做外部碎片(External Fragmentation),据统计,即便对这一策略做了优化,因外部碎片导致的内存浪费可以达到整个内存的30%以上,这是何等巨大的浪费!

    2、内存保护

    连续分配下的内存保护可以通过基址寄存器来实现,每个进程产生的指令地址都由两部分组成:基址+偏移,只要给每个进程的基址设为不同,不同进程之间就会运行在各自的空间,互不干扰。

    不过这种内存保护有点简陋,因为它只实现了进程间保护,并没有实现进程内只读内容的保护。

    综上,连续分配可以完成两个基本任务,但是在性能上,存在不可容忍的内存浪费。

    三、不连续分配——分页

    1、由来

    想想,连续分配中巨大内存浪费的根源在何处?

    根源在两点:

    • 内存中的进程总会有来有去,因此小孔的产生或者说内存的碎片化是必然的 ;
    • 内存注定碎片化,而进程却依然是完整的、较大的,所以太小的内存碎片注定要浪费。

    那么要解决这个问题,也理所当然从这两点入手。

    从第一点入手,就是不让内存碎片化,办法是压缩(Compaction)。每当有旧进程终止,释放空间时,都把内存中的进程挪一挪,让它们全都挨一起,时刻保证所有空闲空间是一整块。这种做法虽能直接消除外部碎片,但时间代价太高了,挪动进程位置需要大量内存读写操作,而且被挪动的进程指令还需要进行重定位(因为变量、函数的位置都变了),这些代价不可接受。

    于是,我们只能从第二点入手,也就是把进程也打成碎片,把进程碎片装进内存碎片里,使内存碎片得到利用而不是被浪费。如此进程所驻留的空间就不再连续,因此这一策略被称为“不连续分配”。

    2、分页(Paging)

    分页是不连续分配的具体实现方式。

    分页的做法是,既然内存碎片化无法解决,那就干脆一开始就把内存分割成固定大小的碎片,称为框(frame),每当有进程要装载时,**把进程也切割成和框一样大小的碎片,称为页(page),为每一页分配一个框,放到内存中去。**就像你把一整只猪切成肉段,放到冰箱隔间里一样。

    3、页表(Page Table)

    分页机制把进程打散了,不同页散布在内存框中,问题来了,你怎么知道某一页内容存在哪个框里?这就需要维护一种数据结构,来保存页—框的映射信息,它就是页表:
    在这里插入图片描述
    每当进程的某一条指令要访问进程内某地址时,其产生的地址都会被分割成“页号+页内偏移的形式”,如下图所示:
    在这里插入图片描述
    然后CPU再根据页号查找页表,找到物理内存中该页对应的框号,用来替换页号,重新拼接成真正的物理地址,再让CPU去访问该地址。

    分页解决了外部碎片问题,因为内存和进程都被打成碎片,只要进程有页需要装载,那就可以为之分配任意一个空闲的框,不会有框白白浪费。但是,由于框成了内存分配的最小单位,就容易出现进程的最后一页内容不满一页却占用了一整个框的情况。

    例如一个进程有17KB大,一个框和页的大小是8KB,那么这个进程将分为3页占3个框,而最后一页有效内容只有1KB,其余的7KB就浪费了,这种浪费称为内部碎片(Internal Fragmentation)。

    分页彻底解决了外部碎片问题,但引入了内部碎片问题,但内部碎片引起的内存浪费远远小于外部碎片。

    3、多级页表和哈希页表

    每个进程都有一个页表,页表也需要占用内存空间。

    32位的计算机,地址线为32位,最大可访问内存空间为64KB,如果一个框尺寸为4KB,一个页表项大小为4B,则每个进程可能会需要4MB的空间为其存放页表,代价堪称高昂。

    解决办法是把页表也打碎、分页,先用“页表的页表”去查找页表,再用找到的页表去查找物理地址,如果有必要,还可以设置更多级的页表。

    对于64位的系统,如果采用多级页表,层数将十分可观,为了访问一个字节的地址,需要查找这么多次页表,岂非十分低效?因此对于64位系统还有一种替代方案是哈希页表,即哈希法来组织页表,从而提高查表速度。哈希页表和多级页表此处不是重点姑且略过。

    前面提到过,内存相对与CPU来说是一种低速设备。而分页机制要求访问每个字节,都需要至少一次查表操作,多级页表还需要更多次,页表也位于内存之中,每次查表都要多访问一次内存,也就是说,访问每一个字节所要花的时间提高了一倍甚至好几倍!

    分页有诸多好处(这将在后面的文章中说明),这一机制不应舍弃,为了弥补这一短板,只好从硬件上做改进——在CPU内集成一块高速缓存,即转译后备缓冲区(Translation Lookaside Buffer,TLB),把最近用到的页表项缓存在TLB,查表时先查TLB,若没找到再去内存中查找,从而减少对内存的访问,缓解这一问题。

    4、内存保护

    进程每次访问地址之前,都要查页表,这就给内存保护提供了方便:**我们可以用页表项中剩余的位来标记与内存保护相关的信息。**譬如,用一个位来表示该页是只读的还是可读写的,还可以用一个位来表示该页是属于当前进程的还是其他进程的。每次访问物理地址之前,都根据这些位来检查即将进行的访问是否合法,一旦发现不合法(例如对只读地址进行写操作),就阻止此次访问,并抛出异常。

    综上,基于分页机制的不连续分配完成了内存分配和内存保护两个基本任务,并在性能上解决了连续分配策略的内存过度浪费问题,通过硬件TLB的辅助缓解了其自身的多次访问内存的问题。

    此外,分页机制还有更多优势,比如支持内存共享、支持虚拟内存等,这些内容在其他文章中详细阐述,此处暂略。

    以上,是为什么非要采用分页这么繁琐的机制来进行内存管理的来龙去脉和权衡考量。

    目前,主流操作系统的内存管理都基于分页机制的不连续分配。

    以上内容总结自《Operating System Concepts》。

    码字不易,倘若觉得有益,请点个赞再走呗~

    展开全文
  • 内存管理之分段与分页 转载自多名技术分享者,仅供参考! 第一篇 要理解分段和分页,那么得理解为什么会出现分段和分页的技术。 首先,这两个技术都是为了利用和管理好计算机的资源–内存。 在分段这个技术还没有...
  • 内存管理-分页机制

    2014-10-10 21:17:10
    对与内存管理保护模式中的分页机制讲得停详细的,个人觉得很不错。共享给大家学习下。
  • 比较分析内存分页管理与分段管理
  • L9 内存的分段与分页

    2022-04-12 09:53:13
    将磁盘中的程序放到内存中,然后CPU从内存中取出指令,并执行,内存就这样被使用起来了。内存管理的目的就是为了更高效的使用内存。本文将主要介绍内存的分段机制和分页机制。
  • 文章目录分页分段段页Linux内存管理 分页 分段 段页 Linux内存管理
  • 操作系统 中的内存管理分页和分段

    千次阅读 2019-03-08 11:24:16
    首先,这两个技术都是为了利用和管理好计算机的资源--内存。 在分段这个技术还没有出现之前,程序运行是需要从内存中分配出足够多的连续的内存,然后把整个程序装载进去。举个例子,某个程序大小是10M,然后,就...
  • 内存分页机制

    万次阅读 多人点赞 2018-09-27 18:08:33
    的方式,为加强段内存的安全性和可管理性还引入了段描述符的概念对段内存加强管理。但仅仅这样还是不够的,如果应用程序过多,或者内存碎片过多,又或者曾经被换出到硬盘的内存段需要再重新装载到内存,可内存中找不...
  • 内存分页管理机制的基本原理是将CPU整个线性内存区域划分成为4KB为1页的内存页面。程序申请使用内存时,系统以内存页为单位进行分配。分页机制是建立在分段机制之上的,CPU使用页目录表PDT(一级页表)和页表PT(二...
  • 分页内存管理——虚拟地址到物理地址的转换

    万次阅读 多人点赞 2018-08-10 23:30:57
    此篇博客内容在于着重帮助读者明白在分页内存管理下,虚拟地址和物理地址转换计算是怎么进行的。 有关分页内存管理的其他知识请事先参阅有关资料。^_^ 一、在计算之前需要了解如下知识: 1.对每个程序而言,...
  • 一、 物理地址和逻辑地址 物理地址:加载到内存地址寄存器中的地址,内存单元的真正...物理地址是明确的、最终用在总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege c...
  • 操作系统——分页内存管理 为什么要引入内存管理? 答:多道程序并发执行,共享的不仅仅只有处理器,还有内存,并发执行不过不进行内存管理,必将会导致内存中数据的混乱,以至于限制了进程的并发执行。 ...
  • 一. 存储管理(一) 存储体系(二) 地址重定位1. 绝对装入2. 可重定位装入(三) 链接1. 静态链接2. 动态链接二. 分区存储管理方案(一) 概述(二) 单一连续分区(三) 固定分区(四) 可变分区1. 概述2. 分区...
  • 日期 ... Linux内存管理 1 前景回顾前面我们讲解了操作系统段式存储管理的主要内容. 32位,在保护方式下,其能够访问的线性地址空间可达4GB,而且允许几乎不受存储空间限制的虚拟存储器程序。虚拟存
  • 分页管理与分段管理

    2021-01-05 20:22:17
    分页储存管理方式: 在该方式中,将用户程序地址空间分为若干固定大小的区域,称为“页”或“页面”。典型的页面大小为1KB。相应的,也将内存空间分为若干个物理块或页框(frame),页和块的大小相同。这样可将用户...
  • 计算存储的层次结构: 当前技术没有能够提供这样的存储器,因此大部分的计算机都有一个存储器层次结构,即少量的非常快速、昂贵、易变的... 内存管理主要包括虚地址、地址变换、内存分配和回收、内存扩充、内存共享
  • 前言: 连续分配方式会形成许多... 在分页存储管理方式中,如果不具备页面对换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全 部装入内存后方
  • 日期 内核版本 架构 作者 GitHub ... Linux内存管理 [注意] 如果您当前使用的系统并不是linux,或者您的系统中只有一份linux源码,而您又期待能够查看或者检索不同版本的linux源码 可以使用 h
  • 这里写目录标题虚拟内存简介虚拟内存概念虚拟内存的容量虚拟内存的优点虚拟内存的缺点如何实现虚拟内存(请求分页、请求分段、请求段页式)请求分页存储管理方式页表机制缺页中断机构地址变换机构请求分页存储管理的...
  • 内存管理-分页存储 一.基本分页和请求分页内存管理方式? 基本分页: 连续分配方式——会形成许多“碎片”多碎片拼接成可用的大块空间,但须为之付出很大开销。 离散分配方式——离散分配的基本单位是页,则称为...
  • 计算机物理内存的大小是固定的,就是计算机主板内存槽上的实际物理内存,cpu可以直接进行寻址,物理内存的容量是固定的,但是寻址的空间取决于cpu地址线的数量。在32位系统上,线性地址空间可达4G(2^32);这4G一般...
  • 内存分段分页机制理解

    千次阅读 2019-08-29 08:14:30
    现代操作系统,计算机内存是按照先分段再分页的方式管理的。 注意: 以下描述都是基于32位计算机进行描述的。 1. 分段 1) 程序直接使用物理地址的问题 考虑最原始,最直接的情况,程序中访问的地址都直接对应于物理...
  • 操作系统为了高效管理内存,减少内存碎片,所以采用分页机制 逻辑地址和物理地址分离的内存分配管理方案 程序的逻辑地址划分为固定大小的页(Page) 物理地址划分为同样大小的帧(Frame) 通过页表对应逻辑地址和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,034
精华内容 11,213
关键字:

分页管理内存保护