2.具有快表的地址变换机构
由于页表是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据。
为了提高地址变换速度,可在地址变换机构中增设一个具有并行查寻能力的特殊高速缓冲寄存器,又称为“联想寄存器”,或称为“快表”,在 IBM 系统中又取名为 TLB,用以存放当前访问的那些页表项。此时的地址变换过程是:在 CPU 给出有效地址后,由地址变换机构自动地将页号 P 送入高速缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此相匹配的页号,便表示所要访问的页表项在快表中。于是,可直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中。如在块表中未找到对应的页表项,则还须再访问内存中的页表,找到后,把从页表项中读出的物理块号送地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中,亦即,重新修改快表。但如果联想寄存器已满,则 OS 必须找到一个老的且已被认为不再需要的页表项,将它换出。
由于成本的关系,快表不可能做得很大,通常只存放 16~512 个页表项,如果页面大小为4kb,那么支持的最大进程为2 MB,这对中、小型作业来说,已有可能把全部页表项放在快表中。据统计,从快表中能找到所需页表项的机率可达 90%以上。
4.5.3 访问内存的有效时间
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,称为内存的有效访问时间(EAT)。
假设访问一次内存的时间为t,在基本分页存储管理方式中,有效访问时间分为第一次访问内存时间(即查找页表对应的页表项所耗费的时间t)与第二次访问内存时间(即访问页表项中的物理块号与页内地址所拼接成的实际物理地址所耗费的时间t)之和: EAT = t + t = 2t;
在快表中查找到所需表项存在着命中率的问题。所谓命中率,是指使用快表并在其中成功查找到所需页面的表项的比率。
则:EAT = а×λ + (t+λ)(1-а) + t = 2t + λ - t×а;
上式中,λ表示查找快表所需要的时间,а表示命中率,t表示访问一次内存所需要的时间。
4.5.4 两级和多级页表
现代的大多数计算机系统,都支持非常大的逻辑地址空间,因此页表就变得非常大,要占用相当大的内存空间。因为每个页表项占用一个字节,故页表长度 * 1字节就是页表所占的内存空间大小。且页表内存空间还要求是连续的,显然这是不现实的。解决方法:
(1) 对于页表所需的内存空间,可采用离散分配方式来解决难以找到一块连续的大内存空间的问题;
(2) 只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再调入。
1.两级页表
将页表进行分页,然后离散地将各个页面分别存放在不同的物理块中。也要为离散分配的页表再建立一张页表,称为外层页表,在每个页表项中记录了页表页面的物理块号。
以前面的 32 位逻辑地址空间为例来说明,当页面大小为 4 KB 时,采用两级页表结构时,再对页表进行分页,使每页中包含 2^10 (即 1024)个页表项,最多允许有 2^10个页表分页。此时的逻辑地址结构如下:
在页表的每个表项中存放的是进程的某页在内存中的物理块号,而在外层页表的每个页表项中,所存放的是某页表分页的在内存中的物理块号。可以利用外层页表和页表这两级页表,来实现从进程的逻辑地址到内存中物理地址间的变换。在地址变换机构中同样需要增设一个外层页表寄存器,用于存放外层页表的始址,并利用逻辑地址中的外层页号,找到指定页表分页的始址,再根据外层页内地址找到指定的页表项,再从该页表项中读出该页在内存中的物理块号。
虽然解决了对大页表无需大片连续存储空间的问题,但并未解决用较少的内存空间去存放大页表的问题。只用离散分配空间的办法并未减少页表所占用的内存空间。解决方法是把当前需要的一批页表项调入内存,以后再根据需要陆续调入。在采用两级页表结构的情况下,对于正在运行的进程,必须将其外层页表调入内存,而对页表则只需调入一页或几页。为了表征某页的页表是否已经调入内存,还应在外层页表项中增设一个状态位 S,其值若为 0,表示该页表分页尚未调入内存;否则,
说明其分页已在内存中。进程运行时,地址变换机构根据逻辑地址中的外层页号 P1,去查找外层页表;若所找到的页表项中的状态位为 0,则产生一中断信号,请求 OS 将该页表分页调入内存。关于请求调页的详细情况,这是下一章虚拟存储器中的知识。
2.多级页表
对于 32 位的机器,采用两级页表结构是合适的;但对于 64 位的机器,必须采用多级页表,将外层页表再进行分页。
4.5.5 反置页表
1.反置页表的引入
在现代计算机系统中,通常允许一个进程的逻辑地址空间非常大,因此就需要有许多的页表项,而因此也会占用大量的内存空间。 引入反置页表,一般页表的页表项是按页号进行排序的,页表项中的内容是物理块号。而反置页表则是为每一个物理块设置一个页表项,并按物理块的编号排序。其中的内容是页号和其所隶属进程的标识符。
2.地址变换
利用反置页表进行地址变换时,是根据进程标识符和页号,去检索反置页表。如果检索到与之匹配的页表项,则该页表项(中)的序号i便是该页所在的物理块号,可用该块号与页内地址一起构成物理地址送内存地址寄存器。
在反置页表可能只包含已经调入内存中的页面,并未包含尚未调入内存的页面。因此还必须为每个进程建立一个外部页表。当发现所需之页面不在内存时,因在外部页表中包含了各个页面在外存的物理地址,通过它可将所需之页面调入内存。
当内存容量很大时,也表项的数目还是会非常大的。要利用进程标识符和页号去检索这样大的一个线性表是相当费时的。可利用Hash算法来进行检索,可以很快找到在反置页表中相应页表项,不过可能会出现所谓的“地址冲突”。
4.6 分段存储管理方式
如果说推动存储管理方式从固定分区到动态分区分配,进而又发展到分页存储管理方式的主要动力,是提高内存利用率,那么,引入分段存储管理方式的目的,则主要是为了满足用户(程序员)在编程和使用上多方面的要求。
4.6.1 分段存储管理方式的引入
1.方便编程
通常,用户把自己的作业按照逻辑关系划分为若干个段。程序员们都迫切地需要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的。
2.信息共享
实现对程序和数据的共享时,是以信息的逻辑单位为基础的。分页系统中的“页”只是存放信息的物理单位(块),并无完整的意义。而段却是信息的逻辑单位,因此可以为该被共享过程建立一个独立的段,极大地简化了共享的实现。
3.信息保护
信息保护同样是对信息的逻辑单位进行保护的。在分页系统中,一个函数可能要占用若干个页面,而且其中的第一个和最后一个页面还会装有其它程序段的数据,它们可能有着不同的保护属性。
4.动态增长
5.动态链接
运行时动态链接要求的是以目标程序(即段)作为链接的基本单位,因此,分段存储管理方式非常适合动态链接。
4.6.2 分段系统的基本原理
1.分段
作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。每个段都从 0 开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间由于是分成多个段,因而呈现出二维特性。其逻辑地址由短号和段内地址组成。
2.段表
在分段式存储管理系统中,则是为每个分段分配一个连续的分区,而进程中的各个段可以离散地移入内存中不同的分区中。在系统中为每个进程建立一张段映射表,简称“段表”。每个段在表中占有一个表项,其中记录了该段在内存中的起始地址(又称为“基址”)和段的长度。可见,段表是用于实现从逻辑段到物理内存区的映射。
3.地址变换机构
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度 TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度TL 进行比较。若 S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,同样发出越界中断信号;若未越界,则将该段的基址与段内地址相加,即可得到要访问的内存物理地址。
像分页系统一样,当段表放在内存中时,每要访问一个数据,都须访问两次内存,从而极大地降低了计算机的速率。解决的方法也和分页系统类似,再增设一个联想存储器,用于保存最近常用的段表项。
4.分页和分段的主要区别
相似之处:
两者都采用离散分配方式,且都要通过地址映射机构来实现地址变换。
不同:
1)页是信息的物理单位,分页是为了提高内存的利用率。段则是信息的逻辑单位,分段的目的是为了能更好地满足用户的需要。
2)页的大小固定且由系统决定。而段的长度却不固定,决定于用户所编写的程序。
3)分页中用户程序的的逻辑地址空间是一维的,分页完全是系统的行为,只需要一个记忆符即可表示一个地址。而分段中用户程序的逻辑地址空间是二维的,在标识一个地址时,既需给出段名, 又需给出段内地址(正是因为段的大小不固定导致的)。
4.6.3 信息共享
1.分页系统中对程序和数据的共享
虽然也能实现对程序和数据的共享,但远不如分段系统来得方便。
2.分段系统中对程序和数据的共享
可重入代码又称为“纯代码”,是一种允许多个进程同时访问的代码。可重入代码是一种不允许任何进程对它进行修改的代码。但事实上,大多数代码在执行时都可能有些改变。为此,在每个进程中,都必须配以局部数据区,把在执行中可能改变的部分拷贝到该数据区,这样,程序在执行时,只需对该数据区(属于该进程私有)中的内容进行修改,并不去改变共享的代码,这时的可共享代码即成为可重入码。
4.6.4 段页式存储管理方式
1.基本原理
段页式系统的基本原理是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成。
为了实现从逻辑地址到物理地址的变换,系统中需要同时配置段表和页表。段表的内容与分段系统略有不同,它不再是内存始址和段长,而是页表始址和页表长度。即一个分段对应一个页表。
2.地址变换过程
为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段长TL。进行地址变换时,首先利用段号S,将它与段长TL进行比较。若S < TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应页的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中,取出指令或数据。
解决方法仍类似快表。在地址变换机构中增设一个高速缓冲寄存器。每次访问它时,都须同时利用段号和页号去检索高速缓存,若找到匹配的表项,便可从中得到相应页的物理块号,用来与页内地址一起形成物理地址;若未找到匹配表项,则仍须再三次访问内存。
————————————————
最后
打赏通道