段式虚拟存储器中的段是程序结构上相对独立的模块,如主程序段、公共子程序段、数据段、表格段、向量段等。它是按照程序的逻辑结构划分的,各个段的长度因程序而异。为了把程序虚地址变换成主存实地址,需要一个段表。段表中每一行记录着某个段对应的若干信息,包括段号、装入位、段起点和段长等。段表一般驻留在主存中,这里段号指虚拟段号,装入位为“1”,表示该段已调入主存。装入位为“0”,则表示该段不在主存中。如果装入位给出的信息表示要访问的这个程序段不在主存储器中,则段表中的起始地址和访问方式字段等均无用。由于段的大小可变,所以在段表中要给出各段的起始地址与段的长度。段表实际上是程序的逻辑结构段与其在主存中所存放的位置之间的关系对照表,如图3-24所示。
图3-24 程序在主存中的分配及其段表
根据需要还可以在段表中增加访问方式、修改标志字段等。
段表中的段长和访问方式是用来保护程序段的。可以根据程序段的起始地址和段长计算出本次访问主存储器的地址是否越界。访问方式可以指出本程序段是否需要保护和保护的级别。例如,对于子程序段,通常只能执行,不能改写;对于一些常数段或数据库中的数据段,一般用户程序只能读,不能改写,不能执行;对于有些需要保密的表格,一般用户应禁止访问等。
根据需要还可以在段表中增加其他字段,例如,增加一个修改标志字段。表示本程序段是否被修改过。如果这个程序段从装入主存储器起一直没有被修改过,则在需要把它替换出主存储器时,不必把这个程序写回到外部的磁盘存储器中,只要用新调入的程序段把它覆盖掉即可。如果这个程序段被修改过,则必须先把这个程序段全部写回到磁盘存储器中,并存放在这个程序段的原来位置上。
图3-25是虚实地址变换的示意图。虚地址来自CPU,虚地址被分为两部分,高位是段号,低位是段内地址。CPU根据虚地址访存时,首先将段号与段表基地址相加,形成访问段表对应的地址,然后根据段表内装入位判断该段是否已调入主存。若已调入主存,从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址。
图3-25 段式虚拟存储器的地址变换
段表本身也是一个段,一般常驻在主存储器中。如果段表太长,也可以把暂时不用的一部分段表放在磁盘存储器中,当需要时再把有用的段表调入主存储器。(www.xing528.com)
段式虚拟存储器的主要优点如下:
(1)程序的模块化性能好。对于大程序,可以划分成多个程序段,每个程序段赋予不同的名字,由多个程序员并行编写,分别编译和调试,从而可以缩短程序的编制和调试时间。
(2)便于程序和数据的共享。当某个程序段需要被共享时,只要在主存储器中装入一份,同时在需要调用这个程序段的那些程序(或用户)被共享时,在需要调用这个程序段的那些程序(或用户)的段表中都使用这个程序段的主存起始地址和段长等信息,就能很方便地实现程序段的共享。
(3)便于实现信息保护。在一般情况下,一段程序是否需要保护是根据这个段程序的功能来决定的。由于段式虚拟存储器本身就是按照功能划分程序段的,因此,只要在段表中设置一个信息保护字段,就能根据需要很方便地实现对该程序段的保护。
段式虚拟存储器的主要缺点如下:
(1)地址变换所花费的时间比较长。从虚地址变换到主存实地址不但需要查表,而且还要做两次加法运算。
(2)主存储器的利用率往往比较低。由于每个程序段的长度是不同的,程序段在主存储器不断地调入、调出,有些程序段在执行过程中还要动态地增加长度,从而使得主存储器中有很多的空隙存在。
(3)对辅存的管理比较困难。磁盘存储器通常是按固定大小的块来访问的,如何把不定长度的程序段映射到固定长度的磁盘存储器中,需要做一次地址变换。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。