如果说推动存储管理方式从固定分区到动态分区分配,进而又发展到分页存储管理方式的主要动力,是提高内存利用率,随着计算机的发展,内存容量逐渐增大,提高内存利用率不再是迫切需求,开始考虑满足用户(程序员)在编程和使用上多方面的要求,其中有些要求是其他几种存储管理方式所难以满足的。因此,这种存储管理方式已成为当今所有存储管理方式的基础。
5.4.1 分段存储管理方式的引入
引入分段存储管理方式,主要是为了满足用户和程序员的下述一系列需要:
1.方便编程
通常用户把自己的作业按照逻辑关系划分为若干个段,每个段都是从0开始编址,并有自己的名字和长度。因此希望要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的。例如下述的两条指令便是使用段名和段内地址:
LOAD 1,[A]|〈D〉;
STORE 1,[B]|〈C〉;
其中,前一条指令的含义是将分段A中D单元内的值读入寄存器1;后一条指令的含义是将寄存器1的内容存入B分段的C单元中。
2.信息共享
实现对程序和数据的共享,是以信息的逻辑单位为基础的。比如共享某段程序或函数,分页系统中的“页”只是存放信息的物理单位(块),并无完整的意义,不便于实现共享;然而段却是信息的逻辑单位。由此可知,为了实现段的共享,希望存储管理能与用户程序分段的组织方式相适应。
3.信息保护
信息保护同样是对信息的逻辑单位进行保护,因此分段管理方式能更有效和方便地实现信息保护功能。
4.动态增长
在实际应用中,往往有些段,特别是数据段,在使用过程中会不断地增长,而事先又无法确切地知道数据段会增长到多大。前述的其他几种存储管理方式都难以应付这种动态增长的情况,而分段存储管理方式却能较好地解决这一问题。
5.动态链接
动态链接是指在作业运行之前,并不把几个目标程序段链接起来。要运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中又需要调用某段时,才将该段(目标程序)调入内存并进行链接。可见,动态链接也要求以段作为管理的单位。
5.4.2 分段系统的基本原理
1.分段
在分段存储管理方式中,作业的地址空间被划分为若干个段,例如,有主程序段MAIN、子程序段X、数据段D及栈段S等,每个段定义了一组逻辑信息,每个段都有自己的名字。为了实现简单起见,通常可用一个段号来代替段名,每个段都从0开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间由于分成多个段,因而是二维的,亦即其逻辑地址由段号(段名)和段内地址所组成。
分段地址中的地址具有如图5-18所示的结构。在该地址结构中,允许一个作业最长有64 K个段,每个段的最大长度为64 KB。
分段方式已得到许多编译程序的支持,编译程序能自动地根据源程序的情况而产生若干个段。例如,Pascal编译程序可以为全局变量、用于存储相应参数及返回地址的过程调用栈、每个过程或函数的代码部分、每个过程或函数的局部变量等,分别建立各自的段。类似地,Fortran编译程序可以为公共块(Common block)建立单独的段,也可以为数组分配一个单独的段。装入程序将装入所有这些段,并为每个段赋予一个段号。
2.段表
在前面所介绍的动态分区分配方式中,系统为整个进程分配一个连续的内存空间。而在分段式存储管理系统中,则是为每个分段分配一个连续的分区,而进程中的各个段可以离散地移入内存中不同的分区中。为使程序能正常运行,要能从物理内存中找出每个逻辑段所对应的位置,应像分页系统那样,在系统中为每个进程建立一张段映射表,简称“段表”。每个段在表中占有一个表项,其中记录了该段在内存中的起始地址(又称为“基址”)和段的长度,如图5-19所示。段表可以存放在一组寄存器中,这样有利于提高地址转换速度,但更常见的是将段表放在内存中。
图5-18 分段地址中的地址结构
图5-19 利用段表实现地址映射
在配置了段表后,执行中的进程可通过查找段表找到每个段所对应的内存区。可见,段表是用于实现从逻辑段到物理内存区的映射。
3.地址变换机构
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。若S>TL,表示段号太大,访问越界,产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后再检查段内地址d是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号;若未越界,则将该段的基址d与段内地址相加,即可得到要访问的内存物理地址。图5-20表示分段系统的地址变换过程。
图5-20 分段系统的地址变换过程
像分页系统一样,当段表放在内存中时,每要访问一个数据都须访问两次内存,从而极大地降低了计算机的速率。解决的方法也和分页系统类似,再增设一个联想存储器,用于保存最近常用的段表项。由于一般情况是段比页大,因而段表项的数目比页表项的数目少,其所需的联想存储器也相对较小,可以显著地减少存取数据的时间,比起没有地址变换的常规存储器的存取速度仅慢10%~15%。
4.段的共享和保护
在本章前面曾介绍过分段存储管理方式便于实现分段的共享与保护,也扼要地介绍了实现分段共享的方法。下面将进一步介绍为了实现分段共享,应配置相应的数据结构共享段表,以及对共享段进行操作的过程。(www.xing528.com)
1)共享段表
为了实现分段共享,可在系统中配置一张共享段表,所有各共享段都在共享段表中占有一表项。表项中记录了共享段的段号、段长、内存始址、存在位等信息,并记录了共享此分段的每个进程的情况。共享段表如图5-21所示。其中各项说明如下:
(1)共享进程计数count。非共享段仅为一个进程所需要。当进程不再需要该段时,可立即释放该段,并由系统回收该段所占用的空间。而共享段是为多个进程所需要的,当某进程不再需要而释放它时,系统并不回收该段所占内存区,仅当所有共享该段的进程全都不再需要它时,才由系统回收该段所占内存区。为了记录有多少个进程需要共享该分段,特设置了一个整型变量count。
图5-21 共享段表项
(2)存取控制字段。对于一个共享段,应给不同的进程以不同的存取权限。例如,对于文件主进程,通常允许读和写;而对其他进程,则可能只允许读,甚至只允许执行。
(3)段号。对于一个共享段,不同的进程可以各用不同的段号去共享该段。
2)共享段的分配与回收
(1)共享段的分配。
由于共享段是供多个进程所共享的,因此对共享段的内存分配方法与非共享段的内存分配方法有所不同。在为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还须在共享段表中增加一表项,填写有关数据,把count设置为1;之后,当又有其他进程需要调用该共享段时,由于该共享段已被调入内存,故此时无须再为该段分配内存,而只需在调用进程的段表中增加一表项,填写该共享段的物理地址;在共享段的段表中,填上调用进程的进程名、存取控制等,再执行count:=count+1操作,以表明有两个进程共享该段。
(2)共享段的回收。
当共享此段的某进程不再需要该段时,应将该段释放,包括撤消在该进程段表中共享段所对应的表项,以及执行count:=count-1操作。若结果为0,则须由系统回收该共享段的物理内存,以及取消在共享段表中该段所对应的表项,表明此时已没有进程使用该段;否则(减1结果不为0),只是取消调用者进程在共享段表中的有关记录。
3)分段保护
在分段系统中,由于每个分段在逻辑上是独立的,因而比较容易实现信息保护。目前常采用以下几种措施来确保信息的安全。
(1)越界检查。
在段表寄存器中放有段表长度信息;同样,在段表中也为每个段设置有段长字段。在进行存储访问时,首先将逻辑地址空间的段号与段表长度进行比较,如果段号等于或大于段表长度,将发出地址越界中断信号;其次,还要检查段内地址是否等于或大于段长,若大于段长,将产生地址越界中断信号,从而保证了每个进程只能在自己的地址空间内运行。
(2)存取控制检查。
在段表的每个表项中,都设置了一个“存取控制”字段,用于规定对该段的访问方式。通常的访问方式有:
①只读,即只允许进程对该段中的程序或数据进行读访问。
②只执行,即只允许进程调用该段去执行,但不准读该段的内容,也不允许对该段执行写操作。
③读/写,即允许进程对该段进行读/写访问。
对于共享段而言,存取控制就显得尤为重要,因而对不同的进程,应赋予不同的读写权限。这时既要保证信息的安全性,又要满足运行需要。例如,对于一个企业的财务账目,应该只允许会计人员进行读或写,允许领导及有关人员去读;对于一般人员则既不准读,更不能写。
(3)环保护机构。
这是一种功能较完善的保护机制。在该机制中规定,低编号的环具有高优先权。OS核心处于0环内;某些重要的实用程序和操作系统服务占居中间环;而一般的应用程序则被安排在外环上。在环系统中,程序的访问和调用应遵循以下规则:
①一个程序可以访问驻留在相同环或较低特权环中的数据。
②一个程序可以调用驻留在相同环或较高特权环中的服务。
图5-22表示在环保护机构中的调用程序和数据访问的关系。
图5-22 环保护机构
5.4.3 分段与分页的比较
由上所述不难看出,分页和分段系统有许多相似之处。比如,两者都采用离散分配方式,且都要通过地址映射机构来实现地址变换。但在概念上两者完全不同,主要表现在下述三个方面。
(1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。或者说,分页仅仅是由于系统管理的需要而不是用户的需要。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。
(2)页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
(3)分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。