分段从存储管理方式:一方面是通常的程序都可以分为若干段,另一方面是实现和满足信息共享,信息保护,动态链接以及信息的动态增长等需要。也都是以段为基本单位实现的。所以说,分段存储管理方式更符合用户和程序员多方面的需要。
分段存储管理方式的引入
1.方便编程。
通常,用户把自己的作业按照逻辑关系划分为若干个段。程序员们都迫切地需要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的。
2.信息共享。
实现对程序和数据的共享时,是以信息的逻辑单位为基础的。分页系统中的“页”只是存放信息的物理单位(块),并无完整的意义。而段却是信息的逻辑单位,因此可以为该被共享过程建立一个独立的段,极大地简化了共享的实现。
3.信息保护。
信息保护同样是对信息的逻辑单位进行保护的。在分页系统中,一个函数可能要占用若干个页面,而且其中的第一个和最后一个页面还会装有其它程序段的数据,它们可能有着不同的保护属性。
4.动态增长。
在实际应用中,往往存在一些段,尤其是数据段,在他们的使用过程中,由于数据量在不断增加,而使数据段动态增长,相应地他需要的存储空间也会动态增长。
5.动态链接。
运行时动态链接要求的是以目标程序(即段)作为链接的基本单位,因此,分段存储管理方式非常适合动态链接。
分段系统的基本原理
1.分段。
作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。每个段都从 0 开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间由于是分成多个段,因而呈现出二维特性。其逻辑地址由短号和段内地址组成。
2.段表。
在分段式存储管理系统中,则是为每个分段分配一个连续的分区,而进程中的各个段可以离散地移入内存中不同的分区中。在系统中为每个进程建立一张段映射表,简称“段表”。每个段在表中占有一个表项,其中记录了该段在内存中的起始地址(又称为“基址”)和段的长度。可见,段表是用于实现从逻辑段到物理内存区的映射。
3.地址变换机构。
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度 TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度TL 进行比较。若 S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,同样发出越界中断信号;若未越界,则将该段的基址与段内地址相加,即可得到要访问的内存物理地址。
像分页系统一样,当段表放在内存中时,每要访问一个数据,都须访问两次内存,从而极大地降低了计算机的速率。解决的方法也和分页系统类似,再增设一个高速缓存,用于保存最近常用的段表项。
4.分页和分段的比较
相似之处:
两者都采用离散分配方式,且都要通过地址映射机构来实现地址变换。
不同:
1)页是信息的物理单位,分页是为了提高内存的利用率。段则是信息的逻辑单位,分段的目的是为了能更好地满足用户的需要。
2)页的大小固定且由系统决定。而段的长度却不固定,决定于用户所编写的程序。
3)分页中用户程序的的逻辑地址空间是一维的,分页完全是系统的行为,只需要一个记忆符即可表示一个地址。而分段中用户程序的逻辑地址空间是二维的,在标识一个地址时,既需给出段名, 又需给出段内地址(正是因为段的大小不固定导致的)。
信息共享
1.分页系统中对程序和数据的共享。
虽然也能实现对程序和数据的共享,但远不如分段系统来得方便。
2.分段系统中对程序和数据的共享。
可重入代码又称为“纯代码”,是一种允许多个进程同时访问的代码。可重入代码是一种不允许任何进程对它进行修改的代码。但事实上,大多数代码在执行时都可能有些改变。为此,在每个进程中,都必须配以局部数据区,把在执行中可能改变的部分拷贝到该数据区,这样,程序在执行时,只需对该数据区(属于该进程私有)中的内容进行修改,并不去改变共享的代码,这时的可共享代码即成为可重入码。
段页式存储管理
1.基本原理。
段页式存储管理是结合了两者的存储管理方式。先将用户程序分成若干个段,再把每个段分成若干页,并为每一个段赋予一个段名。在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成。
段号 | 段内页号 | 页内地址 |
为了实现从逻辑地址到物理地址的变换,系统中需要同时配置段表和页表。段表的内容与分段系统略有不同,它不再是内存始址和段长,而是页表始址和页表长度。即一个分段对应一个页表。
2.地址变换过程。
为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段长TL。进行地址变换时,首先利用段号S,将它与段长TL进行比较。若S < TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应页的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中,取出指令或数据。
解决方法仍类似快表。在地址变换机构中增设一个高速缓冲寄存器。每次访问它时,都须同时利用段号和页号去检索高速缓存,若找到匹配的表项,便可从中得到相应页的物理块号,用来与页内地址一起形成物理地址;若未找到匹配表项,则仍须再三次访问内存。