当逻辑地址小于限长值时,逻辑地址加上基址寄存器的值可以获得地址。当逻辑地址大于限长值时表示进程所访问的地址超过所分得的区域,此时不允许访问。

  C语言的程序会被编译成至少三个段:代码段,数据段,堆栈段。Intel x86平台提供专用的存放段基址的寄存器:代码段寄存器CS在指令执行期间重定位指令地址;堆栈段寄存器SS为栈指令执行重定位地址;数据段寄存器DS在指令执行周期内重定位其他地址。提供多对基址、限长寄存器的机器中,允许一个进程占用两个或多个分区。可规定某对基址、限长寄存器的区域是共享的,用来存放共享的程序和数据。

  可变分区中常常出现分散的小空闲区,称之为碎片。当在分区表中找不到足够大的空闲区来装入进程时,可采用移动技术把已在主存中的进程分区连接到一起,使分散的空闲区汇集成片。这是移动技术。第一种方法是把所有当前占用的分区移动到主存一端。第二种是也是把占用分区移动到另一端,但是当产生足够大的空闲区停止移动。

  分区方式管理存储器,每道程序要求占用主存的一个或多个连续存储区域,这样不仅导致主存中产生碎片,而且处理器的开销太大。分页存储管理允许程序存放到若干不相邻的空闲块中,既可以免除移动信息工作也可充分利用主存空间。

  进程逻辑地址空间分成大小相等的区,每个分区成为页面或页,页号从0开始依次编号。 把主存物理地址空间分成大小相等的区,每个区是一个物理块或页框。页框大小与页面大小相等。

  与此对应分页存储器的逻辑地址由两部分组成:页号和页内位移。逻辑地址是连续的,用户在编制程序时仍使用相对地址,不必考虑如何分页,由硬件地址转换机构和操作系统的管理需要来决定页面尺寸,从而确定主存的分块大小。进程在主存中的每个页框内的地址是连续的,但页框之间的地址可以不连续。

  页表用于是操作系统为进程建立的,是程序页面和主存对应页框的对照表。页表中的每一栏指明程序中的一个页面和分得页框之间的对应关系。从数学角度来看,页表表示一个函数,其变量是页面号,函数值为页框号,通过页表可以把逻辑地址中的逻辑页面替换成物理页框。进程页表存放在内存中,系统设置了专门的硬件:页表基址寄存器(一对,地址和长度),存放当前运行进程页表的起始地址 ,以加快地址转换速度。

  进程运行前由系统把它的页表基地址送入页表基址寄存器,运行时借助于硬件的地址转换,按页面动态地址重定位。当cpu获得逻辑地址后,由硬件按设定的页面尺寸分成两部分:页号和页内位移。先从页表基地址寄存器找到页表基地址,再用页号作为索引查找页表,得到对应的页框号。根据

  物理地址=页框号*块长+页内位移。

  计算出欲访问的主存单元。虽然进程存放在若干不连续的页框中,

  但在执行过程中总能按正确的物理地址进行存取。

  按照给定逻辑地址进行读写操作时,至少访问两次主存:一次访问页面,另一个根据物理地址访问指令或数据。为了提高运算速度,设置了专门的硬件,用来存放进程近访问的部分页表项,被称为转换后援缓冲或快表。对快表的访问速度远快于主存,但造价高,且只能存储几十个页表项。块表项包含页号及对应的页框号,它通过并行匹配对所有快表项进行查找。如果找不到,再查主存中的页表,同时将页号即页框号登记到快表中。当块表快满时,需要淘汰旧的块表项,简单的策略是先进先出。

  通过快表实现主存访问的比率成为命中率。快表与高速缓存不同,前者记录近转换的页号即页框号,后者保存近实际访问的指令或数据的副本。

  分页存储管理能实现多个进程共享程序和数据,共享页面信息可大大提高主存空间的利用率。实现页面共享必须区分数据共享和程序共享。实现数据共享时,允许不同进程对共享的数据页面用不同的页号,只要让各自页表中的有关表项指向共享的数据页框。实现程序共享时,由于指令包含指向其他指令或数据的地址,进程依赖于这些地址才能执行,所以,不同进程正确执行共享代码页面,必须为它们在所有逻辑地址空间中指定同样的页号。实现信息共享必须解决共享信息的保护问题,通常的做法是在页表中增加标志位,指出此页的访问模式。进程访问时核对访问模式,当模式不符时抛出异常。

  分页存储管理是实存管理,必须为进程分配足够的主存空间,装入其全部信息,否则进程无法运行。把进程的全部信息装入主存后,实际上并非同时使用,有些部分甚至从不使用,这是对主存资源的一种浪费。于是提出一种想法:不必装入进程的全部信息,仅将当前使用部分先装入主存,其余部分存放在磁盘中,待使用时由系统自动将其装进来,这是虚拟存储管理技术的基本思路。

  当进程被创建时,代码段和数据段部分数据被调入内存。如果处理器访问的程序或数据不在内存,系统自动将这部分信息从磁盘装入,这叫做部分装入。若此时内存没有足够的空闲空间,便把主存中暂时不用的信息移至磁盘,这叫做部分替换。在具有层次存储结构的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比实际物理存储器大得多的、可寻址的“主存储器”,这被称为虚拟存储器。它对用户隐蔽内部细节。虚拟地址空间等同于实际物理主存加部分硬盘区域的存储空间。引用基础是:程序执行的局部性原理:某存储单元被使用后,其相邻的存储单元也很快被使用---空间局部性。近访问过的程序代码和数据很快被访问---时间局部性。

  虚拟存储器是基于程序局部性原理的一种假想的而非物理存在的存储器,其主要任务是:基于程序局部性特点,当进程使用某部分地址空间时,保证将相应部分加载至主存中。这种将物理空间和逻辑空间分开编制、互相隔离,但又统一管理和使用的计数为用户编程提供了极大地方便。

  虚拟存储管理与对换有很大区别。兑换技术以进程为单位,当所需的主存空间大于当前系统的拥有量时,进程无法对换进主存工作。而虚拟存储管理以页或段为单位,即使进程所需主存空间大于当前系统拥有的主存总量,仍然能够正常运行。

  操作系统的存储管理依靠底层硬件MMU(主存管理部件)来完成,它提供地址转换和存储保护的功能。

  每当进程上下文发生切换时,系统负责把要运行的进程的页表基地址装入页表寄存器,此页表便成为活动页表。MMU只对页表基址寄存器所指出的活动页表进行操作。然后将逻辑地址分解为页面号和页内位移,以便进行地址转换。对快表的管理设计两个方面:一是直接查找快表,找到相应的页框后去拼接物理地址。二是装入表目和清除表目,每次发生快表查找不命中的情况后,待缺页中断处理结束,把相应的页面和页框号装入。

  请求分页虚拟存储管理是将进程信息的副本存放在辅助存储器中,当它被调度投入运行时,并不把程序和数据全部装入主存,仅装入当前使用的页面,访问到不在主存的页面时再动态的把所需的信息装入。请求分页:当需要执行某条指令或使用某个数据而发现它们不在主存时,产生缺页中断,系统从磁盘把此指令或数据所在的页面装入。

  请求分页虚拟存储管理属于虚拟存储,与分页实存管理不同,仅让当前使用部分装入,必然会发生某些页面不在主存的情况,为了标记页面是否在主存中,所采用的方法为:扩充页表项的内容,增加驻留标志位,又称页失效异常位,用来指处页面是否装入主存。当访问一个页面时,如果某页的驻留标识为1,表示此页已经在主存中,可被正常访问。如果某页的驻留标识为0,不能立即访问,产生缺页中断,操作系统根据磁盘地址将这个页面调入主存,然后重新启动相应指令。

  页面装入策略决定何时把页面装入主存,有两种策略:

  1:请页式,仅当需要访问程序和数据时,通过缺页中断并由缺页中断处理程序分配页框,把所需页面装入主存。

  2:预调式,装入主存的页面并非缺页中断请求的页面,是由操作系统依据某种算法,动态预测进程可能要访问的那些页面。

  页面清除策略与装入策略相对应,要考虑何时把修改过的页面写回辅助存储器,常用的算法是:

  1:请页式清除,仅当一页被选中进行替换且被修改过,才把它写回磁盘。

  2:预约式清除,对于所有更改过的页面,在需要替换之前把它们都写回磁盘。

  在多道程序设计中,属于不同进程的页面被分散存放在主存页框中,当发生缺页中断时,如果已无空闲页框,系统要选择一个驻留页面进行淘汰。

  页面替换有两种策略:

  1:局部替换,页面替换算法局限于进程自身。

  2:全局替换,页面替换算法的作用范围是整个系统。

  全局替换算法有以下几种算法:

  1:佳页面替换算法(optimal replacement ,OPT):当要调入一页而必须淘汰旧页时,应该淘汰以后不再访问的页,或距现在长时间后要访问的页。它所产生的缺页数少。这只是一种理想的情况。

  2:先进先出页面替换算法(FIFO)

  基于程序总是按线形顺序来访问物理空间这一假设,总是淘汰先调入主存的页面,即淘汰在主存中驻留时间长的页面。

  3:近少使用页面替换算法(Least Recently Used ,LRU)

  淘汰的页面是在近一段时间内久未被访问的那一页。

  4:第二次机会页面替换(Second Chance Replacement ,SCR)

  此算法是将FIFO算法与页表中的引用位结合起来使用,实现思想:首先检查FIFO页面队列中的队首,这是早进入主存的页面,如果其引用位是0,那么这个页面不仅入队时间长,而且没有使用。如果引用位为1,说明它进入主存的时间较早,但近仍在使用,于是将其引用位归0,置于队尾,把它看成新调入的页,再给一次机会。

  5:时钟页面替换算法(Clock policy replacement)