存储器层次结构图:
CPU寄存器和主存 为操作系统存储管理的管辖范围,存储的信息掉电即失;
辅存属于设备管理的管辖范畴,存储的信息可被长期保存。
寄存器和主存又被称为可执行存储器。
主存:又称为内存,用于保存进程运行时的程序和数据。
高速缓存:介于寄存器和存储器之间的存储器,主要用于备份主存中较常用的数据,以减少处理机对主存储器的访问次数。
磁盘缓存:
用于暂时存放频繁使用的一部分磁盘数据和信息,以减少访问磁盘的次数。磁盘缓存并不是一种实际存在的存储器,而是利用主存中的部分存储空间暂时存放从磁盘中读出(或写入)的信息。
主存也可以看作是辅存的高速缓存,因为,辅存中的数据必须复制到主存方能使用,反之,数据也必须先存在主存中,才能输出到辅存。
用户程序要在系统中运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:
编译 » 链接 » 装入
(1)绝对装入方式
编译时知道程序将驻留在内存的某个位置,编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。
程序中的逻辑地址与实际内存地址完全相同,不需对程序和数据的地址进行修改。
另外,程序中所用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。
优点:装入过程简单。
缺点:只适用于单道程序环境,过度依赖硬件。
(2)可重定位装入方式
根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中指令和数据地址的修改过程称为重定位,又因为地址变换通常是在进程装入时一次完成的,故称为静态重定位。
编程时使用逻辑地址,当程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换。
正确的物理地址 = 指令中逻辑地址 + 本程序在内存中的起始地址。
优点:不需硬件支持,能运行多道程序。
缺点:不允许程序运行时移动位置。
(3)动态运行时装入
也称动态重定位。程序在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持。
优点:可以将程序分配到不连续的存储区;在程序运行之前可以只装入部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享。
缺点:需要硬件支持,实现较复杂。
(1)静态链接方式
在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。把这种事先进行链接的方式称为静态链接方式。
静态链接要解决两个问题:
(2)装入时动态链接方式
将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。
优点:便于修改和更新,便于实现对目标模块的共享。
(3)运行时动态链接方式
对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上。
优点:能加快程序的装入过程,还可节省大量的内存空间。
该分配方式为一个用户程序分配一个连续的内存空间,即程序中代码或数据的逻辑地址相邻,体现在内存空间分配时物理地址的相邻。
连续分配方式可分为四类:
内存分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分;
用户区内存中,仅有一道用户程序,即整个内存的用户空间由该程序独占。
优点:简单、无外部碎片,无须进行内存保护,因为内存中永远只有一道程序。
缺点:只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。
将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。
划分分区有两种不同的方法:
为便于内存分配,通常将分区按大小排队,并为之建立一张分区说明表,其中各表项包括每个分区的始址、大小及状态。当有用户程序要装入时,便检索该表,以找到合适的分区给予分配并将其状态置为“已分配";未找到合适分区时,则拒绝为该程序分配内存。
固定分区分配是最早出现的、可用于多道程序系统中的存储管理方式。
又称为可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。
在实现动态分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配与回收操作这样三方面的问题。
在动态分区存储管理方式中,主要的操作是分配内存和回收内存。
1. 分配内存:
系统利用某种分配算法,从空闲分区链中找到所需大小的分区,
设请求的分区大小为u.size,表中每个空闲分区的大小可表示为m.size。若m.size-u.size≤size(size是事先规定的不再切割的剩余分区的大小),将整个分区分配给请求者。否则从该分区中按请求的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区链(表)中。然后,将分配区的首址返回给调用者。
2. 回收内存:
①回收区与插入点的前一空闲分区相邻,将这两个分区合并,并修改前一空闲分区表项的大小为两者之和;
②回收区与插入点的后一空闲分区相邻,将这两个分区合并,并修改后此回收区表项的始址和大小为两者之和;
③回收区同时与插入点的前、后两个分区相邻,此时将这三个分区合并,修改前一空闲分区表项的大小为三者之和,取消后一分区表项;
④回收区没有相邻的空闲分区,此时应为回收区新建一个表项,填写始址和大小,并插入空闲分区链。
将系统中的空闲分区链接成一个链,然后依次搜索空闲分区链上的空闲分区,去寻找一个其大小能满足要求的分区。此算法适用于不太大的系统。
基于顺序搜索的动态分区分配算法有如下四种:
特点:空闲分区链以地址递增的次序链接。
分配内存时,从链首开始顺序查找,找到大小能满足要求的第一个空闲分区分配给作业。
优点:优先利用内存低址部分的空闲分区,保留了高址部分的大空闲区,为以后大作业分配内存创造了条件。
缺点:低址部分不断被划分,会留下许多难以利用的很小的空闲分区,即碎片。并且每次查找都从低址部分开始,增加了查找时空开销。
碎片:不能利用的小内存分区。
外部碎片: 还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
内部碎片: 已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;
又称临近适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找。
优点:使内存空闲分区分布均匀,减少查找空闲分区的开销。
缺点:缺乏大的空闲分区。
特点:空闲分区按容量递增的次序形成空闲分区链,找到第一个能满足要求且最小的空闲分区分配给作业,避免“大材小用”。
缺点:产生许多难以利用的碎片。
特点:空闲分区以容量递减的次序链接,找到第一个能满足要求的,即最大的分区,从中分割一部分存储空间给作业。
优点:使剩下的空闲区不至于太小,产生碎片的可能性最小,对中、小作业有利。算法查找效率很高,查找时,只要看第一个分区能否满足作业要求即可。
为了提高搜索空闲分区的速度,在大、中型系统中往往会采用基于索引搜索的动态分区分配算法,目前常用的有快速适应算法、伙伴系统和哈希算法。
又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样系统中存在多个空闲分区链表。
同时,在内存中设立一张管理索引表,其中的每一个索引表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。空闲分区的分类是根据进程常用的空间大小进行划分的。
该算法在搜索可分配的空闲分区时分为两步:
第1步:根据进程的长度,从索引表中去寻找到能容纳它的最小空闲区链表;
第2步:从链表中取下第一块进行分配即可。
优点:不会对任何分区产生分割,所以能保留大的分区,满足对大空间的需求,也不会产生内存碎片。查找效率高。
缺点:为了有效合并分区,在分区归还主存时的算法复杂,系统开销较大。此外,该算法在分配空闲分区时,是以进程为单位的,一个分区只属于一个进程,或多或少地存在一定的浪费。这是典型的以空间换时间的做法。
该算法规定,无论已分配分区或空闲分区,其大小均为 2 k 2^{k} 2k (k为整数,l≤k≤m)。通常 2 m 2^{m} 2m 是整个可分配内存的大小(也就是最大分区的大小)。系统开始运行时,整个内存区是一个大小为 2 m 2^{m} 2m 的空闲分区。在系统运行过程中,由于不断地划分,将会形成若干个不连续的空闲分区,将这些空闲分区按分区的大小进行分类。对于具有相同大小的所有空闲分区,单独设立一个空闲分区双向链表,这样,不同大小的空闲分区形成了k个空闲分区链表。
linux采用伙伴系统解决外部碎片问题。
在伙伴系统中,其分配和回收的时间性能取决于查找空闲分区的位置和分割、合并空闲分区所花费的时间。
哈希算法就是利用哈希快速查找的优点,以及空闲分区在可利用空闲区表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。
当进行空闲分区分配时,根据所需空闲分区大小,通过哈希函数计算,即得到在哈希表中的位置,从中得到相应的空闲分区链表,实现最佳分配策略。
紧凑:
将内存中的所有作业进行移动,使它们全都相邻接。这样,即可把原来分散的多个空闲小分区拼接成一个大分区,可将一个作业装入该区。这种通过移动内存中作业的位置,把原来多个分散的小分区拼接成一个大分区的方法,称为“拼接”或“紧凑”。
虽然“紧凑”能获得大的空闲空间,但也带来了新的问题:
即经过紧凑后的用户程序在内存中的位置发生了变化,此时若不对程序和数据的地址加以修改(变换),则程序必将无法执行。为此,在每次“紧凑”后,都必须对移动了的程序或数据进行重定位。
动态重定位:
动态运行时装入的方式中,作业装入内存后的所有地址仍然都是相对(逻辑)地址。而将相对地址转换为绝对(物理)地址的工作被推迟到程序指令要真正执行时进行。
为使地址的转换不会影响到指令的执行速度,必须有硬件地址变换机构的支持,即须在系统中增设一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址。程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。地址变换过程是在程序执行期间,随着对每条指令或数据的访问自动进行的,故称为动态重定位。当系统对内存进行了“紧凑”,而使若干程序从内存的某处移至另一处时,不需对程序做任何修改,只要用该程序在内存的新起始地址去置换原来的起始地址即可。
动态重定位分区分配算法
在动态分区分配算法基础上增加了紧凑的功能。当该算法不能找到一个足够大的空闲分区以满足用户需求时,如果所有的小的空闲分区的容量总和大于用户的要求,这时便须对内存进行“紧凑”,将经“紧凑”后所得到的大空闲分区分配给用户。如果所有的小的空闲分区的容量总和仍小于用户的要求,则返回分配失败信息。
“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据换出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据换入内存。
对换是改善内存利用率的有效措施,它可以直接提高处理机的利用率和系统的吞吐量。
对换的类型:
在每次对换时,都是将一定数量的程序或数据换入或换出内存。根据每次对换时所对换的数量,可将对换分为如下两类:
(1)整体对换。
处理机中级调度实际上就是存储器的对换功能,其目的是用来解决内存紧张问题,并可进一步提高内存的利用率和系统的吞吐量。由于在中级调度中对换是以整个进程为单位的,故称之为“进程对换”或“整体对换”。这种对换被广泛地应用于多道程序系统中,并作为处理机中级调度。
(2)页面(分段)对换。
如果对换是以进程的一个“页面”或“分段”为单位进行的,则分别称之为“页面对换”或“分段对换”,又统称为“部分对换”。这种对换方法是实现后面要讲到的请求分页和请求分段式存储管理的基础,其目的是为了支持虚拟存储系统。
为了实现进程对换,系统必须能实现三方面的功能:对对换空间的管理、进程的换出和进程的换入。
对换空间的管理
对文件区空间的管理采取离散分配方式。
对对换区空间的管理采取连续分配方式,较少考虑外存中的碎片问题。
进程的换出与换入
OS调用(或换醒)对换进程,实现进程的换出和换入。
1.进程的换出
对换进程在实现进程换出时,是将内存中的某些进程调出至对换区,以便腾出内存空间。
换出过程可分为以下两步:
(1)选择被换出的进程。
(2)进程换出过程。只能换出非共享的程序和数据段
2.进程的换入
对换进程将定时执行换入操作,它首先查看PCB集合中所有进程的状态,从中找出“就绪”状态但已换出的进程。当有许多这样的进程时,它将选择其中己换出到磁盘上时间最久(必须大于规定时间,如2s)的进程作为换入进程,为它申请内存。如果申请成功,可直接将进程从外存调入内存;如果失败,则需先将内存中的某些进程换出,腾出足够的内存空间后,再将进程调入。
在对换进程成功地换入一个进程后,若还有可换入的进程,则再继续执行换入换出过程,将其余处于“就绪且换出”状态的进程陆续换入,直到内存中再无“就绪且换出”状态的进程为止,或者已无足够的内存来换入进程,此时对换进程才停止换入。
连续分配方式会形成许多“碎片”,通过“紧凑”方法将许多碎片拼接成可用的大块空间,会付出很大开销。如果允许将一个进程直接分散地装入到许多不相邻接的分区中,便可充分地利用内存空间,而无须再进行“紧凑”。基于这一思想而产生了离散分配方式。根据在离散分配时所分配地址空间的基本单位的不同,又可将离散分配分为以下三种:
(1)分页存储管理方式。
在该方式中,将用户程序的地址空间分为若干个固定大小的区域,称为“页”或“页面”。典型的页面大小为 1 KB。相应地,也将内存空间分为若干个物理块或页框(frame),页和块的大小相同。这样可将用户程序的任一页放入任一物理块中,实现了离散分配。
(2)分段存储管理方式。
这是为了满足用户要求而形成的一种存储管理方式。它把用户程序的地址空间分为若干个大小不同的段,每段可定义一组相对完整的信息。在存储器分配时,以段为单位,这些段在内存中可以不相邻接,所以也同样实现了离散分配。
(3)段页式存储管理方式。
这是分页和分段两种存储管理方式相结合的产物。它同时具有两者的优点,是目前应用较广泛的一种存储管理方式。
1. 页面和物理块
分页存储管理将进程的逻辑地址空间分成若干个页,并为各页加以编号,从第0页开始。相应地,也把内存的物理地址空间分成若干个块,同样也为它们加以编号,如0#块、1#块等等。
页内碎片: 在为进程分配内存时,以块为单位,将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块,而形成了不可利用的碎片。
进程中的块称为页或页面(Page),内存中的块称为页框或页帧(Page Frame)。外存也以同样的单位进行划分,直接称为块或盘块(Block)。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应。
为方便地址转换,页面大小应是2的整数幂,同时页面大小应该适中
页面太小: 会使进程的页面数过多,页表就会过长,占用大量内存,而且也会增加硬件地址转换的开销,降低页面换入/换出的效率;
页面过大: 会使页内碎片增多,降低内存的利用率。
图中的地址长度为32位,其中0~11位为页内地址(位移量),即每页的大小为4KB( 2 12 2^{12} 212B); 12~31位为页号,地址空间最多允许有1M页。
对某特定机器,其地址结构是一定的。
若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号Р和页内地址d可按下式求得:
P = INT[ A L \frac{A}{L} LA]
d = [A] % L
例如,其系统的页面大小为1KB,设A=2170B,则由上式可以求得
P = INT[2170/1024] = 2
d = 2170%1024 = 122
3. 页表
为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,它记录页面在内存中对应的物理块号,页表一般存放在内存中。
可见,页表的作用是实现从页号到物理块号的地址映射。
地址变换机构的任务是将逻辑地址转换为内存中的物理地址。地址变换是借助于页表实现的。
1. 基本的地址变换机构
页表大多驻留在内存。在系统中通常设置一个页表寄存器(PTR),存放页表在内存的起始地址F和页表长度M。平时,进程未执行时,页表的始址和页表长度存放在本进程的PCB中,当进程被调度执行时,才将页表始址和页表长度装入页表寄存器中。设页面大小为L,逻辑地址A到物理地址E的变换过程如下(假设逻辑地址、页号、每页的长度都是十进制数):
例题:
若页面大小L为1KB,页号2对应的物理块为b=8,计算逻辑地址A=2500的物理地址E的过程如下:
P=2500/1K=2,W=2500%1K=452,查找得到页号2对应的物理块的块号为8,E=8×1024+452=8644。
由上述过程可知,若页表全部放在内存中,则存取一个数据或一条指令至少要访问两次内存:
第一次是访问页表,确定所存取的数据或指令的物理地址; 第二次是根据该地址存取数据或指令。
显然,这种方法比通常执行指令的速度慢了一半。
2. 具有快表的地址变换机构
为提高地址变换速度,在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器——快表,又称相联存储器(TLB),用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,主存中的页表常称为慢表。具有快表的地址变换机构如图所示:
在具有快表的分页机制中,地址的变换过程如下:
一般快表的命中率可达90%以上,这样分页带来的速度损失就可降低至10%以下。
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,称为内存的有效访问时间(Effective Access Time,EAT)。
假设访问一次内存的时间为t,
根据条件(32位逻辑地址空间、页面大小4KB、页表项大小4B,以字节为编址单位),我们来构造一个适合的页表结构。页面大小为4KB,页内偏移地址为12位,页号部分为20位,若不采用分级页表,则仅页表就要占用 2 20 2^{20} 220×4B/4KB = 1024页,这大大超过了许多进程自身需要的页面,对于内存来说是非常浪费资源的,而且查询页表工作也会变得十分不便、试想若把这些页表放在连续的空间内,查询对应页的物理页号时可以通过页表首页地址+页号x4B的形式得到,而这种方法查询起来虽然相对方便,但连续的1024页对于内存的要求实在太高,并且上面也说到了其中大多数页面都是不会用到的,所以这种方法并不具有可行性。
解决办法就是构造一个页表的页表,也就是二级页表。为查询方便,顶级页表最多只能有1个页面(一定要记住这个规定),因此顶级页表总共可以容纳4KB/4B = 1K个页表项,它占用的地址位数为10位,而之前已经计算出页内偏移地址占用了12位,因此一个32位的逻辑地址空间就剩下了10位,正好使得二级页表的大小在一页之内,这样就得到了逻辑地址空间的格式,如图所示。
为了方便实现地址变换,在地址变换机构中,同样需要增设一个外层页表寄存器,用于存放外层页表的始址,并利用逻辑地址中的外层页号作为外层页表的索引,从中找到指定页表分页的始址,再利用P2作为指定页表分页的索引,找到指定的页表项,其中即含有该页在内存的物理块号,用该块号Р和页内地址d即可构成访问的内存物理地址。
两级页表时的地址变换机构:
只用离散分配空间的办法并未减少页表所占用的内存空间。能够用较少的内存空间存放页表的唯一方法是,仅把当前需要的一批页表项调入内存,以后再根据需要陆续调入。在采用两级页表结构的情况,对于正在运行的进程,必须将其外层页表调入内存,而对于页表则只需调入一页或几页。
1. 反置页表的引入
在现代计算机系统中,通常允许一个进程的逻辑地址空间非常大,因此就需要有许多的页表项,而因此也会占用大量的内存空间。为了减少页表占用的内存空间,引入了反置页表。
一般页表的页表项是按页号进行排序的,页表项中的内容是物理块号。而反置页表则是为每一个物理块设置一个页表项,并将它们按物理块的编号排序,其中的内容则是页号和其所隶属进程的标识符。在 IBM公司推出的许多系统中都采用了反置页表,如AS/400、IBM RISC System和 IBM RT等系统。
2. 地址变换
分页管理方式是从计算机的角度考虑设计的,目的是提高内存的利用率,提升计算机的性能。分页通过硬件机制实现,对用户完全透明。
分段管理方式的提出则考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长及动态链接等多方面的需要。
通常的程序都可分为若干个段,如主程序段、子程序段A、子程序段B、…、数据段以及栈段等,每个段大多是一个相对独立的逻辑单位;
实现和满足信息共享、信息保护、动态链接以及信息的动态增长等需要,也都是以段为基本单位的。
更具体地说,分段存储管理方式更符合用户和程序员多方面的需要:
1. 分段
段式管理方式按照用户进程中的自然段划分逻辑空间。例如,用户进程由主程序段MAIN、子程序段X、栈段S和数据段D组成,每段从0开始编址,并分配一段连续的地址空间(段内要求连续,段间不要求连续,因此整个作业的地址空间是二维的),其逻辑地址由段号S与段内偏移量W两部分组成。
在图3.13中,段号为16位,段内偏移量为16位,因此一个作业最多有 2 16 2^{16} 216= 65536段(64K),最大段长为64KB。
每个进程都有一张逻辑空间与内存空间映射的段表,其中每个段表项对应进程的一段,段表项记录该段在内存中的始址和长度。段表的内容如图3.14所示。
执行中的进程可通过查找段表,找到每段所对应的内存区。可见,段表用于实现从逻辑段到物理内存区的映射,如图:
3. 地址变换机构
为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址F和段表长度M。从逻辑地址A到物理地址E之间的地址变换过程如下:
像分页系统一样,当段表放在内存中时,每要访问一个数据,都须访问两次内存,从而成倍地降低了计算机的速率。解决的方法和分页系统类似,也增设一个联想存储器,用于保存最近常用的段表项。以减少存取数据的时间。
4. 分页和分段的区别
相同点:
两者都采用离散分配方式,且都是通过地址映射机构实现地址变换。
不同点:
概念上两者完全不同,主要表现在下述三个方面:
(1)页是信息的物理单位。分页仅仅只是系统管理上的需要,完全是系统的行为,对用户是不可见的。
分段存储管理方式中的段则是信息的逻辑单位,它通常包含的是一组意义相对完整的信息。分段的目的主要在于能更好地满足用户的需要。
(2)页的大小固定且由系统决定。是直接由硬件实现的,因而在每个系统中只能有一种大小的页面。
段的长度不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
(3)分页的用户程序地址空间是一维的。程序员只需利用一个记忆符即可表示一个地址。(采用分页机制后,相邻两页的存储地址是连续的。比如第0页的最后一个逻辑地址和第1页的第一个逻辑地址是连续的。此时只需要提供一个地址,就能够得到页号和偏移量)
分段是用户的行为,在分段系统中,用户程序的地址空间是二维的,每个段的长度不定,段间逻辑地址并不连续。程序员在标识一个地址时,既需给出段名,又需给出段内地址。
可重入代码(Reentrant Code):
又称为“纯代码”(Pure Code),是一种允许多个进程同时访问的代码。为使各个进程所执行的代码完全相同,绝对不允许可重入代码在执行中有任何改变。因此,可重入代码是一种不允许任何进程对它进行修改的代码。
1.基本原理
分页系统以页面作为内存分配的基本单位,能有效地提高内存利用率,而分段系统以段作为内存分配的基本单位,它能够更好地满足用户多方面的需要。将这两种存储管理方法结合起来,便形成了段页式存储管理方式。
在段页式系统中,作业的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将每段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干和页面大小相同的存储块,对内存的分配以存储块为单位。
在段页式系统中,作业的逻辑地址分为三部分:段号、页号和页内偏移量(页内地址)。
为了实现地址变换,系统为每个进程建立一张段表,每个分段有一张页表。段表表项中至少包括段号、页表长度和页表始址,页表表项中至少包括页号和块号。此外,系统中还应有一个段表寄存器,指出作业的段表始址和段表长度。
(段表寄存器和页表寄存器的作用都有两个,一是在段表或页表中寻址,二是判断是否越界)。
2. 地址变换过程
段表寄存器存放段表始址和段长TL。
在段页式系统中,为了获得一条指令或数据,须三次访问内存。
第一次访问是访问内存中的段表,从中取得页表始址;
第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;
第三次访问才是真正从第二次访问所得的地址中取出指令或数据。
显然,这使访问内存的次数增加了近两倍。为了提高执行速度,在地址变换机构中增设一个高速缓冲寄存器(快表)。每次访问它时,都须同时利用段号和页号去检索高速缓存,若找到匹配的表项,便可从中得到相应页的物理块号,用来与页内地址一起形成物理地址;若未找到匹配表项,则仍需第三次访问内存。
段页式管理的地址空间是二维的。
1 . 动态分区法可以比较有效地消除外部碎片,但不能消除内部碎片。(×)
(通俗的理解可以是量体裁衣,可消除内部碎片,不能消除外部碎片)。
2 .在动态分区分配算法中,按分区大小组织空闲分区链的算法是( 最佳适应算法 )。
所学课本:
计算机操作系统 第四版(汤小丹等)西安电子科技大学出版社
王道操作系统复习指导(王道论坛)电子工业出版社