写在前面:
- 本系列笔记主要以《计算机操作系统(汤小丹…)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
- 视频链接:操作系统(汤小丹等第四版)_哔哩哔哩_bilibili
一、分段存储管理方式的引入
1、方便编程
用户常把自己的作业按逻辑关系划分成若干个段,每段都有自己的名字,且都从零开始编址,这样,用户程序在执行中可用段名(段号)和段内地址(段内偏移量)进行访问。
2、信息共享
在实现程序和数据的共享时,常常以信息的逻辑单位为基础,而分页系统中的每一页只是存放信息的物理单位,其本身没有完整的意义,因而不便于实现信息的共享,而段却是信息的逻辑单位,有利于信息的共享。
3、信息保护
信息保护同样是以信息的逻辑单位为基础的,而且经常是以一个过程、函数或文件为基本单位进行保护的。例如,希望函数A仅允许进程执行,而不允许读,更不允许写,那么只须在包含了函数A的这个段上标上只执行标志即可;但是在分页系统中,函数A可能要占用若干个页面,而且其中的第一个和最后一个页面还会装有其它程序段的数据,它们可能有着不同的保护属性,如可以允许进程读写,这样就很难对这些页面实施统一的保护。
4、动态增长
在实际应用中,往往存在着一些段,尤其是数据段,在它们的使用过程中,由于数据量的不断增加,而使数据段动态增长,相应地,它所需要的存储空间也会动态增加。然面对于数据段究竟会增长到多大,事先又很难确切地知道,对此很难采取预先多分配的方法进行解决,而分段在管理方式却能较好地解决这一问题。
5、动态链接
动态链接指的是在程序运行过程中,当需要调用某个目标程序时,才将该段(目标程序)调入内存并进行链接。可见,动态链接要求的是以目标程序(即段)作为链接的基本单位,因此分段存储管理方式非常适合于动态链接。
二、分段系统的基本原理
1、分段
在分段存储管理方式中,作业地址空间被划分为若干个段,每个段定义了一组逻辑信息,都有自己的名字,通常用段号代替段名,每段从0开始编址,并采用一段连续地址空间。段长由逻辑信息组的长度决定。
整个作业的地址空间分成多个段,逻辑地址由段号(段名)和段内地址所组成。下图所示的分段地址,段号的长度16位,即允许一个作业最长有64K段,段内地址的长度为16位,即每个段的最大长度为64KB。
2、段表
为使程序正常运行,须在系统中为每个进程建立一张段映射表,简称“段表”,每个段在表中占有一个表项,其中记录了该段在内存中的起始地址(又称为“基址”)和段的长度(段号是可以隐含的,表项在段表中的位置能说明表项对应的段号,所以段号不占存储空间)。
段表可以存放在寄存器中,但更多的是存放在内存中。
段表用于实现从逻辑段到物理内存区的映射。
3、地址变换机构
(1)硬件配置:
为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。
(2)工作过程:
①在进行地址变换时,系统将逻辑地址中的段号与段表长TL进行比较,若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址。
②再检查段内地址d是否超过该段的段长SL,若超过,即d>SL,同样发出越界中断信号;若未越界,则将该段的基址d与段内地址相加,即可得到要访问的内存物理地址。
4、分页和分段的主要区别
(1)页是信息的物理单位。
①采用分页存储管理方式是为实现离散分配方式,以消减内存的外零头,提高内存的利用率,或者说,分页仅仅只是系统管理上的需要,完全是系统的行为,对用户是不可见的。
②分段存储管理方式中的段是信息的逻辑单位,它通常包含的是一组意义相对完整的信息,分段的目的主要在于能更好地满足用户的需要。
(2)页的大小固定且由系统决定。
①在采用分页存储管理方式的系统中,在硬件结构上就把用户程序的逻辑地址划分为页号和页内址两部分,也就是说是直接由硬件实现的,因而在每个系统中只能有一种大小的页面。
②段的长度不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
(3)分页的用户程序地址空间是一维的。
①分页完全是系统的行为,故在分页系统中用户程序的地址是属于单一的线性地址空间,程序员只需利用一个记忆符即可表示一个地址。
②分段是用户的行为,故在分段系统中,用户程序的地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
三、信息共享
1、分页系统中对程序和数据的共享
例如,有一个多用户系统可同时接纳40个用户,他们都执行一个文本编辑程序(Text Editor),如果文本编辑程序有160KB的代码和另外40KB的数据区,则总共需有8MB的内存空间来支持40个用户。
如果160KB的代码是可重入的(可重入代码是指允许多个进程同时访问的代码),则无论是在分页系统还是在分段系统中,该代码都能被共享,在内存中只需保留一份文本编辑程序的副本,此时所需的内存空间仅为1760KB(40x40+160),而不是8000KB。假定每个页面的大小为4KB,那么160KB的代码将占用40个页面,数据区占10个页面。
为实现代码的共享,应在每个进程的页表中都建立40个页表项,它们的物理块号都是21#~60#,在每个进程的页表中,还须为自己的数据区建立页表项,它们的物理块号分别是61#~70#、71#~80#、81#~90#、…等等。
2、分段系统中程序和数据的共享
在分段系统中,由于是以段为基本单位的,不管该段有多大,只需为该段设置一个段表项即可,因此使实现共享变得非常容易。
仍以共享editor为例,此时只需在(每个)进程1和进程2的段表中为文本编辑程序设置一个段表项,让段表项中的基址(80)指向editor程序在内存的起始地址。
3、可重入代码
可重入代码又称为“纯代码”,是一种允许多个进程同时访问的代码。为使各个进程所执行的代码完全相同,绝对不允许可重入代码在执行中有任何改变,因此,可重入代码是一种不允许任何进程对它进行修改的代码。
但事实上,大多数代码在执行时都可能有些改变,为此在每个进程中都必须配以局部数据区,把在执行中可能改变的部分拷贝到该数据区,这样,程序在执行时,只需对该数据区(属于该进程私有)中的内容进行修改,并不去改变共享的代码,这时的可共享代码即成为可重入代码。(需要说明的是,可修改的代码是不能共享的)
四、段页式存储管理方式
1、基本原理
段页式系统的基本原理是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成。
在段页式系统中,为了实现从逻辑地址到物理地址的变换,系统中需要同时配置段表和页表,段表的内容与分段系统略有不同,它不再是内存始址和段长,而是页表始址和页表长度。
2、地址变换过程
(1)在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段长TL。进行地址变换时,首先用段号S与段长TL进行比较,若S<TL则表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应页的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
(2)在段页式系统中,为了获得一条指令或数据,须三次访问内存:
①第一次访问是访问内存中的段表,从中取得页表始址。
②第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址。
③第三次访问才是真正从第二次访问所得的地址中取出指令或数据。
(3)显然,按上面的地址变换过程需要访存的次数会很多,为了提高执行速度,可在地址变换机构中增设一个高速缓冲寄存器,每次访问它时,都须同时利用段号和页号去检索高速缓存。若找到匹配的表项,便可从中得到相应页的物理块号,用来与页内地址一起形成物理地址;若未找到匹配表项,则仍需第三次访问内存。(其基本原理和快表相似,这里不再赘述)