免费智能真题库 > 历年试卷 > 软件设计师 > 2011年上半年 软件设计师 上午试卷 综合知识
  第27题      
  知识点:   存储管理   存储管理方案   进程   内存   页式存储管理
  关键词:   进程   逻辑地址   内存   十六进制   页式存储管理   页帧   存储管理        章/节:   计算机软件知识       

 
某系统采用请求页式存储管理方案,假设某进程有6个页面,系统给该进程分配了4个存储块,其页面变换表如下表所示,表中的状态位等于1/0分别表示页面在内存/不在内存。当该进程访问的页面2不在内存时,应该淘汰表中页号为(27)的页面。假定页面大小为4K,逻辑地址为十六进制3C18H,该地址经过变换后的页帧号为(28)。

 
 
  A.  0
 
  B.  3
 
  C.  4
 
  D.  5
 
 
 

 
  第26题    2012年上半年  
   55%
假设一台按字节编址的16位计算机系统,采用虚拟页式存储管理方案,页面的大小为2K,且系统中没有使用快表(或联想存储器)。某用户..
  第26题    2015年上半年  
   38%
某进程有4个页面,页号为0~3,页面变换表及状态位、访问位和修改位的含义如下图所示。若系统给该进程分配了3个存储块,当访问前页..
  第24题    2020年下半年  
   46%
假设计算机系统的页面大小为4K,进程P的页面变换表如下表所示。若P要访问的逻辑地址为十六进制3C20H,那么该逻辑地址经过地址变换..
 
  第26题    2016年下半年  
   39%
假设段页式存储管理系统中的地址结构如下图所示,则系统(26)。
  第27题    2022年下半年  
   59%
假设段页式存储管理系统中的地址结构如下图所示,则系统()。
  第26题    2012年上半年  
   55%
假设一台按字节编址的16位计算机系统,采用虚拟页式存储管理方案,页面的大小为2K,且系统中没有使用快表(或联想存储器)。某用户..
   知识点讲解    
   · 存储管理    · 存储管理方案    · 进程    · 内存    · 页式存储管理
 
       存储管理
        UNIX早期的版本采用"对换技术"扩充主存容量,进程可以被换出到对换区,也可以从对换区换进到主存。高版本的UNIX主存管理采用分页式虚拟存储机制,对换技术作为一种辅助手段,并采用二次机会页面替换算法。
 
       存储管理方案
        存储管理的主要目的是解决多个用户使用主存的问题,其存储管理方案主要包括分区存储管理、分页存储管理、分段存储管理、段页式存储管理及虚拟存储管理。
               固定分区
               固定分区是一种静态分区方式,在系统生成时已将主存分成若干个分区,每个分区的大小可以不等,但分区大小固定不变,每个分区装一个且只能装一个作业。操作系统通过主存分配情况表管理主存。
               固定分区的缺点是已分配区中存在未用空间,原因是程序或作业的大小不可能刚好等于分区的大小,故造成了空间的浪费。通常将已分配分区内的未用空间叫做零头或内碎片。
               可变分区
               可变分区是一种动态分区方式,存储空间的划分是在作业装入时进行的,故分区的个数是可以变的,分区的大小刚好等于作业的大小。
               引入可变分区方法,使主存分配有较大的灵活性,也提高了主存的利用率。但是可变分区会引起碎片的产生。解决碎片的方法是拼接(或称紧凑),即向一个方向(如向低地址端)移动已分配的作业,使那些零散的小空闲区在另一方向连成一片。分区的拼接技术一方面要求能够对作业进行重定位,另一方面系统在拼接时要耗费较多的时间。
               系统利用空闲分区表来管理主存中的空闲分区,请求和释放分区可以采用最佳适应算法、最差适应算法、首次适应算法和循环首次适应算法4种分配策略进行主存分配。
               (1)最佳适应算法。假设系统中有X1X2X3,…,Xi,…,Xn个空闲区(自由区),每当用户申请一个空间时,将从这n个空闲区中找到一个最接近用户需求的分区。这种算法能保留较大的空白区。但缺点是空闲区不可能刚好等于用户要求的区,所以必然要将一个分区一分为二。随着系统不断地分配和释放空间,可能会使产生的小分区小到无法再继续分配,这样的无用小分区称为外碎片。
               (2)最差适应算法。接到主存申请时,系统总是将用户作业装入最大的空闲区。这种算法将一个最大的分区一分为二,所以剩下的空闲区通常也较大,不容易产生外碎片。
               (3)首次适应算法。每当用户作业申请一个空间时,系统总是从主存的低地址开始选择一个能装入作业的空白区。当用户释放空间时,该算法更易实现相邻的空白区合并。
               (4)循环首次适应算法。与首次适应算法的不同之处是,每次分配都是从刚分配的空闲区开始寻找一个能满足用户要求的空闲区。
               可重定位分区
               可重定位分区是解决碎片问题的简单而又行之有效的方法。其基本思想是移动所有已分配好的分区,使之成为连续区域。由于移动分区是要付出代价的,所以通常是在用户请求空间得不到满足时进行。移动已分配的分区会导致地址发生变化,所以会产生地址重定位的问题。
               分区保护的目的是防止未经核准的用户访问分区,常用以下两种保护方式。
               (1)上界/下界寄存器。采用上界/下界寄存器保护法时,上界寄存器中存放的是作业的装入地址,下界寄存器中存放的是作业的结束地址,形成的物理地址必须满足
               上界寄存器≤物理地址≤下界寄存器
               (2)基址寄存器和限长寄存器。基址寄存器用来存放用户程序在主存的起始地址,限长寄存器用来存放用户程序的长度,形成的物理地址必须满足
               基址寄存器≤物理地址≤基址寄存器+限长寄存器
 
       进程
        简单而言,一个进程就是一个正在运行的程序。一般来说,一个进程至少应该包括以下几个方面的内容。
        .相应的程序:进程既然是一个正在运行的程序,当然需要有相应程序的代码和数据。
        .CPU上下文:指程序在运行时,CPU中各种寄存器的当前值,包括:程序计数器,用于记录将要取出的指令的地址;程序状态字,用于记录处理器的运行状态信息;通用寄存器,用于存放数据或地址;段寄存器,用于存放程序中各个段的地址;栈指针寄存器,用于记录栈顶的当前位置。
        .一组系统资源:包括操作系统用来管理进程的数据结构、进程的内存地址空间、进程正在使用的文件等。
        进程有动态性、独立性和并发行三个特性。
        (1)动态性。进程是一个正在运行的程序,而程序的运行状态是在不断地变化的。例如,当一个程序在运行的时候,每执行完一条指令,PC寄存器的值就会增加,指向下一条即将执行的指令。而CPU中用来存放数据和地址的那些通用寄存器,它们的值肯定也不断地变化。另外,堆和栈的内容也在不断地变化,每当发生一次函数调用时,就会在栈中分配一块空间,用来存放此次函数调用的参数和局部变量。而当函数调用结束后,这块栈空间就会被释放掉。
        (2)独立性。一个进程是一个独立的实体,是计算机系统资源的使用单位。每个进程都有自己的运行上下文和内部状态,在它运行的时候独立于其他的进程。
        (3)并发性。从宏观上来看,在系统中同时有多个进程存在,它们相互独立地运行。
        下图表示四个进程A、B、C、D在系统中并发地运行。从中可以看出,虽然从宏观上来说,这四个进程都是在系统中运行,但从微观上来看,在任何一个特定的时刻,只有一个进程在CPU上运行。从时间上来看,开始是进程A在运行,然后是进程B在运行,然后是进程C和进程D。接下来又轮到了进程A去运行。因此,在单CPU的情形下,所谓的并发性,指的是宏观上并发运行,而微观上还是顺序运行,各个进程轮流去使用CPU资源。
        
        四个进程在并发运行
        在具体实现上,以CPU中的程序计数器PC为例,真正物理上的PC寄存器只有一个。当四个进程在轮流执行时,PC取值的运动轨迹是先在进程A内部流动,然后再到进程B的内部流动,再到进程C和D。从进程的独立性角度来说,每个进程都有“自己”独立的PC寄存器,即逻辑上的PC寄存器,它们的取值相互独立、互不影响。所谓的逻辑PC,其实就是一个内存变量。例如,在上图中,当进程A要执行的时候,就把A的逻辑PC的值拷贝到物理PC中,然后开始运行。当轮到B运行的时候,先把物理PC的当前值保存到A的逻辑PC中,然后再把B的逻辑PC的值装入到物理PC中,即可运行。这样就实现了各个进程的轮流运行。
 
       内存
        除了CPU,内存也是影响系统性能的最常见的瓶颈之一。看系统内存是否够用的一个重要参考就是分页文件的数目,分页文件是硬盘上的真实文件,当操作系统缺少物理内存时,它就会把内存中的数据挪到分页文件中去,如果单位时间内此类文件使用频繁(每秒个数大于5),那就应该考虑增加内存。具体考察内存的性能的参数包括内存利用率、物理内存和虚拟内存的大小。
 
       页式存储管理
               基本原理
               分区存储管理的一个特点是连续性,每个程序都分得一片连续的内存区域。这种连续性将导致碎片问题,包括固定分区中的内碎片和可变分区中的外碎片。为了解决这些问题,人们又提出了页式存储管理方案。它的基本出发点是打破存储分配的连续性,使一个程序的逻辑地址空间可以分布在若干个离散的内存块上,从而达到充分利用内存,提高内存利用率的目的。
               页式存储管理的基本思路是:一方面,把物理内存划分为许多个固定大小的内存块,称为物理页面(physical page),或页框(page frame)。另一方面,把逻辑地址空间也划分为大小相同的块,称为逻辑页面(logical page),或简称为页面(page)。页面的大小要求是2n,一般在512B到8KB之间。当一个用户程序被装入内存时,不是以整个程序为单位,把它存放在一整块连续的区域,而是以页面为单位来进行分配。对于一个大小为N个页面的程序,需要有N个空闲的物理页面把它装进来,当然,这些物理页面不一定是连续的。
               下图是一个具体的例子。各个任务的逻辑地址空间和内存的物理地址空间被划分为1KB大小的页面。任务1有两个页面,任务2有三个页面,任务3有一个页面。当这三个任务被装入内存后,它们在内存空间的分布可能是:任务1的两个页面分别存放在第5和第6个物理页面中,它们碰巧被放在了一起。任务2的三个页面分别存放在第2、第4和第7个物理页面中。也就是说,虽然它们在逻辑地址空间是三个连续的页面,但在物理地址空间却被分散在内存的不同位置。最后,任务3的这个页面被存放在第8个物理页面中。
               
               页式存储管理的一个例子
               在实现页式存储管理的时候,需要解决以下的几个问题:
               .数据结构:用于存储管理的数据结构是什么?
               .内存的分配与回收:当一个任务到来时,如何给它分配内存空间?当一个任务运行结束后,如何回收它所占用的内存空间?
               .地址映射:当一个任务被加载到内存后,可能被分散地存放在若干个不连续的物理页面当中。在这种情形下,如何把程序中使用的逻辑地址转换为内存访问时的物理地址,以确保它能正确地运行。
               数据结构
               在页式存储管理中,最主要的数据结构有两个。
               .页表:页表给出了任务的逻辑页面号与内存中的物理页面号之间的对应关系。
               .物理页面表:用来描述内存空间中各个物理页面的使用分配状况。在具体实现上,可以采用位示图或空闲页面链表等方法。
               下图是页表的一个例子。在任务的逻辑地址空间当中,总共有4个页面,即页面0、页面1、页面2和页面3。页表描述的是逻辑页面号与物理页面号之间的对应关系,即每一个逻辑页面存放在哪一个物理页面中。页表的下标是逻辑页面号,从0到3。相应的页表项存放的就是该逻辑页面所对应的物理页面号。在本例中,任务的4个逻辑页面分别存放在第1、第4、第3和第7个物理页面中。
               
               页表示例
               内存的分配与回收
               当一个任务到来时,需要给它分配相应的内存空间,即将其每一个逻辑页面都装入到内存当中。显然,内存的分配与回收算法与物理页面表的实现方法是密切相关的。以位示图为例,内存的分配过程是这样的:
               (1)对于一个新来的任务,计算它所需要的页面数N。然后查看位示图,看是否还有N个空闲的物理页面。
               (2)如果有足够的空闲物理页面,就去申请一个页表,其长度为N,并把页表的起始地址填入到该任务的任务控制块TCB当中。
               (3)分配N个空闲的物理页面,把它们的编号填入到页表中。这样,就建立了逻辑页面与物理页面之间的对应关系。
               (4)修改位示图,对刚刚被占用的那些物理页面进行标记。
               当一个任务运行结束,释放了它所占用的内存空间后,需要对这些物理页面进行回收,并对位示图的内容进行相应的修改。
               地址映射
               如前所述,当一个任务被加载到内存后,它的各个连续的逻辑页面,被分散地存放在若干个不连续的物理页面当中。在这种情形下,为了保证程序能够正确地运行,需要把程序中使用的逻辑地址转换为内存访问时的物理地址,也就是地址映射。
               那么如何将一个逻辑地址映射为相应的物理地址呢?在页式存储管理当中,连续的逻辑地址空间被划分为一个个的逻辑页面,这些逻辑页面被装入到不同的物理页面当中。也就是说,系统是以页面为单位来进行处理的,而不是以一个个的字节为单位。因此,地址映射的基本思路是:
               .逻辑地址分析:对于给定的一个逻辑地址,找到它所在的逻辑页面,以及它在页面内的偏移地址;
               .页表查找:根据逻辑页面号,从页表中找到它所对应的物理页面号;
               .物理地址合成:根据物理页面号及页内偏移地址,确定最终的物理地址。
                      逻辑地址分析
                      由于页面的大小一般都是2的整数次幂,因此,人们可以很方便地进行逻辑地址的分析。具体来说,对于给定的一个逻辑地址,可以直接把它的高位部分作为逻辑页面号,把它的低位部分作为页内偏移地址。例如,假设页面的大小是4KB,即212,逻辑地址为32位。那么在一个逻辑地址当中,最低的12位就是页内偏移地址,而剩下的20位就是逻辑页面号。
                      下图是逻辑地址分析的一个例子,在这个例子中,逻辑地址用十六进制形式表示。假设页面的大小为1KB,逻辑地址为0x3BAD。在这种情形下,首先把这个十六进制的地址展开为二进制的形式。然后,由于页面的大小为1KB,即2的10次方,所以这个逻辑地址的最低10位,就表示页内偏移地址,而剩下的最高6位,就表示逻辑页面号。因此,该地址的逻辑页面号是0x0E,页内偏移地址是0x03AD。
                      
                      逻辑地址分析的例子
                      如果逻辑地址不是用十六进制,而是用十进制的形式来表示,那么有两种做法:一是先把它转换为十六进制的形式,然后重复刚才的步骤。二是采用如下的计算方法:
                      逻辑页面号=逻辑地址/页面大小
                      页内偏移量=逻辑地址%页面大小
                      用页面大小去除逻辑地址,得到的商就是逻辑页面号;得到的余数就是页内偏移地址。例如,假设页面的大小为2KB,现在要计算逻辑地址7145的逻辑页面号和页内偏移地址。用2048去除7145,得到的商是3,余数是1001。所以这个逻辑地址的逻辑页面号是3,页内偏移地址是1001。实际上,这个算法和刚才的十六进制的方法是完全等价的。从二进制运算的角度来看,一个是右移操作,一个是除法操作。把一个整数右移N位等价于把它除以2N
                      页表查找
                      对于给定的一个逻辑地址,如果知道其逻辑页面号,就可以去查找页表,从中找到相应的物理页面号。
                      在具体实现上,页表通常是保存在内核的地址空间中,因为它是操作系统的一个数据结构。另外,为了能够访问页表的内容,在硬件上要增加一对寄存器。一个是页表基地址寄存器,用来指向页表的起始地址;另一个是页表长度寄存器,用来指示页表的大小,即对于当前任务,它总共包含有多少个页面。操作系统在进行任务切换的时候,会去更新这两个寄存器当中的内容。
                      物理地址合成
                      对于给定的一个逻辑地址,如果已经知道了它所对应的物理页面号和页内偏移地址,可以采用简单的叠加算法,计算出最终的物理地址。假设物理页面号为f,页内偏移地址为offset,每个页面的大小为2n,那么相应的物理地址为:f×2n+offset。
                      下图是页式存储管理当中的地址映射机制,也是以上各个步骤的一个综合。假设在程序的运行过程中,需要去访问某个内存单元,因此就给出了这个内存单元的逻辑地址。如前所述,这个逻辑地址由两部分组成,一是逻辑页面号,二是页内偏移地址。这个分析工作是由硬件自动来完成的,对用户是透明的。在页表基地址寄存器当中,存放的是当前任务的页表首地址。将这个首地址与逻辑页面号相加,就找到相应的页表项。里面存放的是这个逻辑页面所对应的物理页面号。将这个物理页面号取出来,与页内偏移地址进行组合,从而得到最终的物理地址。然后就可以用这个物理地址去访问内存。
                      
                      页式存储管理中的地址映射
                      现有的这种地址映射方案,虽然能够实现从逻辑地址到物理地址的转换,但它有一个很大的问题。当程序运行时需要去访问某个内存单元,例如,去读写内存当中的一个数据,或是去内存取一条指令,需要访问2次内存。第一次是去访问页表,取出物理页面号;第二次才是真正去访问数据或指令。也就是说,内存的访问效率只有50%。这样,就会降低获取数据的存取速度,进而影响到整个系统的使用效率。为了解决这个问题,人们又引入了快表的概念。它的基本思路来源于对程序运行过程的一个观察结果。对于绝大多数的程序,它们在运行时倾向于集中地访问一小部分的页面。因此,对于它们的页表来说,在一定时间内,只有一小部分的页表项会被经常地访问,而其他的页表项则很少使用。根据这个观察结果,人们在MMU中增加了一种特殊的快速查找硬件:TLB(Translation Lookaside Buffer),或者叫关联存储器,用来存放那些最常用的页表项。这种硬件设备能够把逻辑页面号直接映射为相应的物理页面号,不需要再去访问内存当中的页表,这样就缩短了页表的查找时间。
                      在TLB方式下,地址映射的过程略有不同。当一个逻辑地址到来时,它首先会到TLB当中去查找,看这个逻辑页面号所在的页表项是否包含在TLB当中,这个查找的速度是非常快的,因为它是以并行的方式进行。如果能够找到的话,就直接从TLB中把相应的物理页面号取出来,与页内偏移地址拼接成最终的物理地址。如果在TLB中没有找到该逻辑页面,那只能采用通常的地址映射方法,去访问内存当中的页表。接下来,硬件还会在TLB当中寻找一个空闲单元,如果没有空闲单元,就把某一个页表项驱逐出来,然后把刚刚访问过的这个页表项添加到TLB当中。这样,如果下次再来访问这个页面,就可以在TLB中找到它。
                      页式存储管理方案的优点是:
                      (1)没有外碎片,而且内碎片的大小不会超过页面的大小。这是因为系统是以页面来作为内存分配的基本单位,每一个页面都能够用上,不会浪费。只是在任务的某一些页面当中,可能没有装满,里面有一些内碎片。
                      (2)程序不必连续存放,它可以分散地存放在内存的不同位置,从而提高了内存利用率。
                      (3)便于管理。
                      页式存储管理方案的缺点主要有:
                      (1)程序必须全部装入内存,才能够运行。如果一个程序的规模大于当前的空闲空间的总和,那么它就无法运行。
                      (2)操作系统必须为每一个任务都维护一张页表,开销比较大。简单的页表结构已经不能满足要求,必须设计出更为复杂的结构,如多级页表结构、哈希页表结构、反置页表等。
   题号导航      2011年上半年 软件设计师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第27题    在手机中做本题