操作系统【九】

6、分段存储管理方式

从固定分区到动态分区分配,再到分页存储管理方式,其主要动力为提高内存利用率,引入分段存储管理的目的在于满足用户在编程和使用上多方面的要求。如

① 方便编程,用户可以把自己的作业按照逻辑关系划分为若干段,每个段都是从0开始编址,并有自己的名字和长度。

② 信息共享,在实现对程序和数据的共享时,是以信息的逻辑单位为基础的,比如共享某个函数。

③ 信息保护,信息保护同样是对信息的逻辑单位进行保护。

④ 动态增长,在实际应用中,数据段在使用过程中往往会不断增长,而实现无法确切知道数据段会增长到多大,分段可以较好的解决这个问题。

⑤ 动态链接,再运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中有需要调用某段时,才将该段调入内存并进行链接。

(1)分段系统的基本原理

在分段管理中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息,如有主程序段MAIN,子程序段X,数据段D及栈段S,每个段都有自己的名字,每个段从0开始编址,并采用一段连续的地址空间,段的长度由相应的逻辑信息组的长度决定,因而各段长度不等,整个作业的地址空间由于是分成多个段,因而是二维的,即其逻辑地址由段号和段内地址构成

如下图,进程 A 按照逻辑功能被划分为三个段,每个段大小不一,最后再被分配到内存中不连续的各个空间中:

由于引入了分段存储管理,所以可以将程序按照逻辑功能模块进行划分,程序员在编写程序的时候也会更加方便,程序的可读性会更高,比如:

1
2
LOAD 1,[D]|<A>
STORE 1,[X]|<B>

分别表示:将分段 D 中 A 单元内的值读入寄存器 1,以及将寄存器 1 的值存入分段 X 的 B 单元中。很显然,逻辑上是非常清晰的。这里的分段 D 和 X 都是段名,程序员在编程的时候只需要使用段名,而在编译的时候,段名会转化为对应的短号,同理,A、B 单元表示的其实是地址,编译的时候也会转化为对应的地址。

在引入分段存储管理后,逻辑地址的含义也不同了。假设仍然是用 32 位二进制数表示逻辑地址,此时,地址的前 16 位将表示段号,后 16 位表示段内偏移量:

  • 由于段号是 16 位二进制数,也就是说段号有 2^16^ 种取值,即每个进程最多最多可以被分为 2^16^ 个段;
  • 由于段内偏移量也是 16 位二进制数,也就是说在一个段内,段内地址可能有 2^16^ 种取值,所以一个段的最大长度为 2^16^

(2)段表

在分段存储管理中,程序被分为大小不等的多个段,我们没办法像之前一样只需要块号即可推导出块的初始地址,为了准确地找出段存放在内存中的位置,我们要将段号、段长、基址 这三者作为段表的三列。这样,根据段号可以在段表中找到对应段在内存中的初始地址(基址),再结合段长,可以知道这个段具体占用了哪里的空间。

在分段式存储管理系统中,为每个分段分配一个连续的分区,而进程中的各个段可以离散地移入内存中不同的分区,为了使程序正常运行,能够物理内存中找出每个逻辑段所对应的位置,应该为每个进程建立一张段映射表,称为段表,每个段在表中有一个表项,其中记录了该段在内存中的起始地址和段的长度。段表可以存放在一组寄存器中,这样有利于提高地址转换速度,但通常将段表放在内存中。段表用于实现从逻辑段到物理内存区的映射

为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度(TL),在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较,若S>TL,表示段号太大,访问越界,产生越界中断信号,若未越界,则根据段表的始址和该段的段号,计算该段对应段表项的位置,从中读出该段在内存中的起始地址,然后,再检查段内地址d是否超过该段的段长SL,若超过,同样发出越界中断信号(因为你表项里明明是这么长A,而你想偏移B,且B》A,必然会越界。)若未越界,则将该段的基址与段内地址d相加,即得到要访问的内存物理地址。

另一个图,同样意思展示段表的使用流程。

  • 在需要将逻辑地址转换为物理地址的时候,首先会将逻辑地址分为段号和段内偏移量两个部分,段表寄存器中的段表长度代表了程序总共被分为多少个段,因此段号不应该超过段表长度,若超过则发生了越界中断,若不超过,进入下一步
  • 根据段号、段表初始地址以及段表项的大小,找到段号对应的段表项。比较段表项中的段长 C 和逻辑地址中的段内偏移量 W,若 W>=C,说明越界了;反之则进入下一步(注意这里要与分页存储相区分(因为你表项里明明是这么长A,而你想偏移B,且B》A,必然会越界。)
  • 在段表项中找到段号对应的基址,将该基址与段内偏移量拼接,得到物理地址
  • 根据物理地址来到内存中访问相关的目标单元

img

为什么会有一个偏移量呢?

因为段长+基址知识只是我们找到对应段。我们本来的不低是想找到某个地址内的内容,需要在这个段内进行偏移才能找到它。就像你想在一页书中找到一行文字。

(3)分段和分页的比较

可以看到,分页与分段存在很大的相似性,如都采用离散分配方式,都需要通过地址映射机构实现地址变换,但两者的主要区别如下。

① 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率,或者说,分页仅仅是由于系统管理的需要而不是用户的需要,段则是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了能更好地满足用户的需要。

② 页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,一个系统中,只存在一种大小的页面,段的长度则不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。

③ 分页的作业的地址空间是一维的,即单一的线性的地址空间,程序员只利用一个记忆符即可表示一个地址,而分段的作业地址空间是二维的,程序员在标识一个地址是,需要给出段名和段内地址。

另一个图,表达的对比。

(4)信息的共享和保护

在分段存储方式中,更容易实现信息共享和保护:

在分页存储方式中,则很难:

其实原因很简单,就是因为段表是认为的逻辑划分,这个段能重复利用就是能重复利用。而分页是系统根据大小分的。一个能重复利用的代码段很可能被分成两个或多个页中,或者分到一个页中,但这个页还包含其他内容。都不容易设定。

(5)访存次数

关于访存次数,两者都是一样的:

  • 在不引入快表的情况下,分页存储方式的第一次访存是访问内存中的页表,第二次是访问内存中的目标单元;若引入快表,则第一次访存有可能因为命中而得到避免
  • 分段存储方式的第一次访存是访问内存中的段表,第二次是访问内存中的目标单元。它也可以引入快表,若引入快表,则第一次访存有可能因为命中而得到避免

7、段页式存储管理

  • 采用分页存储管理,内存利用率高,不会产生外部碎片,仅会产生少量内部碎片;但是不方便按照逻辑模块实现信息的共享和保护
  • 采用分段存储管理,很方便按照逻辑模块实现信息的共享和保护,但是若逻辑过多则会导致段过长,另外,这种方式也会产生外部碎片

分页系统能够有效的提高内存利用率(但是会存在页内碎片),分段系统则能够很好地满足用户需要。若能将两种方式结合起来,既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等优点,又能像分页系统那样很好地解决内存的外部碎片问题,基于此,提出了段页式系统。

段页式系统先将用户程序分成若干个段,再把段分为若干个页,并为每一个段赋予一个段名。段页式系统中,地址结构由段号、段内页号、页内地址三部分构成。

在段页式系统中,为了获得一条指令或数据,需要==访问内存三次==

  • 第一次访问时访问内存中的段表,从中取得页表始址,

  • 第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址,

  • 第三次访问才是真正的从第二次访问所得的地址中,取出指令或数据。

同样,也可以增设高速缓冲寄存器用于加快访问速度。若检索到(命中),则无需经历第一次和第二次访存,可直接拿到块号并和偏移量进行拼接,得到物理地址,之后只需要访存一次即可。也就是说,引入快表后,省下了两次访存。

  • 在需要将逻辑地址转换为物理地址的时候,首先会将逻辑地址分为段号、页号和页内偏移量三个部分,段表寄存器中的段表长度仍然代表了程序总共被分为多少个段,因此段号不应该超过段表长度,若超过则发生了越界中断,若不超过,进入下一步
  • 根据段号、段表初始地址以及段表项的大小,找到段号对应的段表项。这个段表项记录了段号对应段的页表的相关信息。注意这里,同样要比较段表项中的页表长度和逻辑地址中的页号 P,若页号大于等于页表长度,说明越界了;反之则进入下一步
  • 我们已经找到了段表项,也就找到了段的页表所在块的块号。根据这个块号,在内存中找到这个块,再从块中找到页表
  • 根据逻辑地址中的页号,在页表中找到页号对应的块号,将块号和逻辑地址中的页内偏移量拼接,得到物理地址
  • 根据物理地址,再次来到内存中访问相关的目标单元

思考题

块!不是段!。这是页式存储。内存->块,程序->页

1、假定某采用页式存储管理的系统中,主存容量为1M,被分成256块,块号为0,1,2,……255。现有一个共4页(页号为0,1,2,3)的作业被依次装人到主存的第2,4,1,5块中。请回答:

(1)主存地址应该用多少位来表示?

20位

(2)作业每一页的长度为多少字节?逻辑地址中的页内地址部分应占用多少位?

4K 12位

(3)把作业中每一页占用的主存块起始地址填入下表。

页号起始地址
08K
116K
24K
320K

(4)若作业执行中要从第0页的第75单元和第3页的第548单元读信息,那么,实际应从主存的哪两个单元读信息?( 请把应访问的主存绝对地址用二进制编码的十六进制数表示。)

若作业执行中要从第0页的第75单元,对应的物理地址是: 8*1024+75=8267,

二进制:0010 0000 0100 1011

十六进制:204B

第3页的第548单元,对应的物理地址是: 20*1024+548=21028,

二进制:0101 0010 0010 0100

十六进制:5224

8、内存的扩充

(1)覆盖技术

(2)对换技术

所谓“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程和进程所需要的程序和数据,调入内存。

  • 整体对换(或进程对换):以整个进程为单位
  • 页面对换或分段对换:以页或段为单位

对换整个作业—-用于单道系统(单道模拟多道)

对换整个进程—-用于连续分区存储管理(进程挂起、激活,中程调度)

对换(置换)页面/段—-请求分页、请求分段存储管理虚拟存储技术)

(3)虚拟技术

详见第五章。

在页式存储管理中,分页是由硬件_完成的。

在页式存储管理中,分页是由程序员_完成的。

-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~