操作系统:离散分配存储管理⽅式
⽬录
离散分配⽅式
连续分配⽅式会形成许多外部碎⽚,虽然可通过“紧凑”⽅法将许多碎⽚拼接成可⽤的⼤块空间,但紧凑的时间开销和复杂度都很⾼。如果允许将⼀个进程直接分散地装⼊到许多不相邻接的分区中,便可充分地利⽤内存空间,也就是采⽤离散分配的⽅式。根据在离散分配时所分配地址空间的基本单位的不同,⼜可将离散分配分为以下三种:
1. 分页存储管理⽅式:将⽤户程序的地址空间分为若⼲个固定⼤⼩的“页⾯”,也将内存空间分为若⼲个页框,将⽤户程序的任⼀页放⼊任
男生暗恋女生表现⼀物理块中;
2. 分段存储管理⽅式:把⽤户程序的地址空间分为若⼲个⼤⼩不同的段,以段为单位进⾏分配,这些段在内存中可以不相邻接;
3. 段页式存储管理⽅式:将分页和分段两种存储管理⽅式相结合。
分页存储管理
分页存储的结构
分页存储管理将进程的逻辑地址空间分成若⼲个页⾯,并为各页加以编号。相应地也把内存的物理地址空间分成若⼲个物理块,同样也加以编号。在为进程分配内存时,以块为单位,将进程中的若⼲个页分别装⼊到多个可以不相邻接的物理块中。若页⾯⼤⼩设置得较⼩,可以减⼩内存碎⽚并提⾼内存利⽤率,但会造成每个进程占⽤较多的页⾯,从⽽导致进程的页表过长、占⽤⼤量内存和降低页⾯换进换出的效率。如果选择的页⾯过⼤,虽然可以减少页表的长度,提⾼页⾯换进换出的速度,但却⼜会使页内碎⽚增⼤。因此页⾯的⼤⼩应选择适中,且页⾯⼤⼩应是 2 的幂,通常为 1KB~8KB。
分页地址中的地址长度为 32 位,地址结构包含两部分内容。前⼀部分为页号 P,占在 12 ~ 31 位,地址空间最多允许有 1M 页。后⼀部分为位(偏)移量 W(页内地址),占在 0 ~ 11 位,每页的⼤⼩为 4KB。
对某特定机器的地址结构是⼀定的,若给定⼀个逻辑地址空间中的地址为 A,页⾯的⼤⼩为 L,则页号 P 和页内地址 d 可按下式求得,其中INT 是整除函数。例如系统的页⾯⼤⼩为 1KB,设 A = 2170B,则由公式可以求得 P = 2,d = 122。
在分页系统中,允许将进程的各个页离散地存储在内存的任⼀物理块中。为了能在内存中到每个页⾯所对应的物理块,系统⼜为每个进程建⽴了⼀张页⾯映像表实现从页号到物理块号的地址映射,简称页表。在进程地址空间内的所有页(0 ~ n),依次在页表中有⼀页表项,其中记录了相应页在内存中对应的物理块号。进程执⾏时通过查该表,即可到每页在内存中的物理块号。
基本的地址变换机构
为了能将⽤户地址空间中的逻辑地址转换为内存空间中的物理地址,在系统中必须设置地址变换机构。由于页内地址和物理地址是⼀⼀对应的(例如对于页⾯⼤⼩是 1KB 的页内地址是 0 ~ 1023,其相应的物理块内的地址也是 0 ~ 1023),因此地址变换机构的任务实际上只是将逻辑地址中的页号转换为内存中的物理块号。
页表⼤多驻留在内存中,在系统中只设置⼀个页表寄存器 PTR(Page-Table Register),存放页表在内存的始址和页表的长度。平时,进程未
执⾏时,页表的始址和页表长度存放在本进程的 PCB 中。当调度程序调度到某进程时,才将这两个数据装⼊页表寄存器中。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会⾃动地将有效地址 A(相对地址)分为页
号 P 和页内地址 W 两部分。在执⾏检索之前,先将页号与页表长度进⾏⽐较。如果页号⼤于或等于页表长度,则表⽰本次所访问的地址已超越进程的地址空间,需要产⽣地址越界中断。若未出现越界错误,则将页表始址 F 与页号 P 和页表项长度 M 的乘积相加,便得到该表项在页表中的位置,进⽽从页表得到该页的物理块号。将块号和页内地址送⼊物理地址寄存器的块内地址字段中,完成从逻辑地址到物理地址的变换。
例如若页⾯⼤⼩ L 为 1K 字节,页号 2 对应的内存块号 b = 8,要将逻辑地址 A = 2500 转换为物理地址 E。页⾯⼤⼩为 1K 字节,说明⼀个页⾯的⼤⼩为
2^10B = 1KB,⾸先根据公式计算出页号、页内偏移量:
页号 P = A / L = 2500 / 1024 = 2
页内偏移量 W = A % L = 2500 % 1024 = 452
根据题中条件可知,页号 2 没有越界,其存放的内存块号 b = 8,即可计算出物理地址。
物理地址 E = b * L + W = 8 * 1024 + 425 = 8644
在分页存储管理(页式管理)的系统中,只要确定了每个页⾯的⼤⼩,逻辑地址结构就确定了。因此只
要给出⼀个逻辑地址,系统就可以⾃动地算出页号、页内偏移量两个部分,并不需要显式地告诉系统。
反置页表
反置页表的引⼊
在分页系统中为每个进程配置了⼀张页表,进程逻辑地址空间中的每⼀页在页表中都对应有⼀个页表项。在现代计算机系统中,通常允许⼀个进程的逻辑地址空间⾮常⼤,因此就需要有许多的页表项,⽽因此也会占⽤⼤量的内存空间。为了减少页表占⽤的内存空间,引⼊了反置页表。反置页表(Inverted Page Table)则为每⼀个物理块设置⼀个页表项,并将它们按物理块的编号排序,其中的内容则是页号和其所⾪属进程的标识符。
地址变换
在利⽤反置页表进⾏地址变换时,是根据进程标识符和页号检索反置页表。如果检索到与之匹配的页表项,则该页表项(中)的序号 i 便是该页所在的物理块号,可⽤该块号与页内地址⼀起构成物理地址送内存地址寄存器。若检索了整个反置页表仍未到匹配的页表项,则表明此页尚未装⼊内存。对于不具有请求调页功能的存储器管理系统,此时则表⽰地址出错。
夏普电视怎么样然⽽在该表中只包含了已经调⼊内存的页⾯,并未包含尚未调⼊内存的页⾯,因此还必须为每个进程建⽴⼀个外部页表。(External Page Table)。该页表与传统的页表⼀样,当所访问的页⾯在内存时,并不需要访问外部页表,仅当发现所需之页⾯不在内存时才使⽤。在页表中包含了各个页在外存的物理位置,通过它可将所需之页⾯调⼊内存。
由于在反置页表中是为每⼀个物理块设置⼀个页表项,当内存容量很⼤时,页表项的数⽬还是会⾮常⼤的。要利⽤进程标识符和页号去检索这样⼤的⼀张线性表是相当费时的,可利⽤ Hash 算法来进⾏检索。
快表
具有快表的地址变换机构
由于页表是存放在内存中的,这使 CPU 在每存取⼀个数据时都要两次访问内存。第⼀次是访问内存中的页表到物理块号 b,再将块号与页内偏移量 W 拼接形成物理地址,第⼆次访问内存时,才是从所得地址中读写数据。
为了提⾼地址变换速度,可在地址变换机构中增设⼀个具有并⾏查寻能⼒的特殊⾼速缓冲寄存器,⼜称为“联想寄存器”(Associative Memory)或“快表 TLB(Translation Look aside Buffer)”。在 CPU 给出有
效地址 A 后,由地址变换机构⾃动地将页号 P 送⼊ TLB 并和其中所有页号进⾏⽐较。若其中有与此相匹配的页号,便表⽰所要访问的页表项在 TLB 中,就可直接从快表中读出对应的物理块号 b。如在快表中未到对应的页表项,则还须再访问内存中的页表,到后把从页表项中读出的物理块号 b 送往地址寄存器,同时再将此页表项存⼊ TLB 的⼀个寄存器单元中。但如果联想寄存器已满,则 OS 必须到⼀个被认为是不再需要的页表项将它换出。
由于查询快表的速度⽐查询页表的速度快很多,因此只要快表命中就可以节省很多时间。虽然快表的容量有限,但是⼀般来说快表的命中率可以达到 90% 以上。
访问内存的有效时间
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中到对应的实际物理地址单元并取出数据,所需要花费的总时间称为内存的有效访问时间(Effective AccessTime,EAT)。
假设访问⼀次内存的时间为 t,在基本分页存储管理⽅式中,有效访问时间分为 2 次访问内存时间之和:
故宫门票预约 网上预订EAT = t + t = 2t
在引⼊快表的分页存储管理⽅式中,如果快表命中可以直接得到逻辑页所对应的物理块号,减少了⼀
次内存访问。命中率是指使⽤快表并在其中成功查到所需页⾯的表项的⽐率,引⼊ TLB 的分页存储管理⽅式的 EAT 计算公式如下,其中λ表⽰查快表所需要的时间,a 表⽰命中率,t 表⽰访问⼀次内存所需要的时间。
EAT = a × λ + (t + λ)(1 - a) + t
= 2t + λ - t x a
例如某系统使⽤基本分页存储管理,并采⽤了具有快表的地址变换机构。访问⼀次快表耗时 1us,访问⼀次内存耗时 100us,若快表的命中
率为 90%,访问⼀个逻辑地址的平均耗时通过计算可以得到。
快表和慢表分开查:(1 + 100) * 0.9 + (1 + 100 + 100) * 0.1 = 111 us
快表和慢表同时查:(1 + 100) * 0.9 + (100 + 100) * 0.1 = 110.9 us
若未采⽤快表机制,则访问⼀个逻辑地址需要 100 + 100 = 200us,显然引⼊快表机制后访问⼀个逻辑地址的速度被加快。
两级和多级页表
引⼊多级页表的动机
现代的⼤多数计算机系统都⽀持⾮常⼤的逻辑地址空间,导致页表要占⽤相当⼤的内存空间。例如对于⼀个具有 32 位逻辑地址空间的分页系统,规定页⾯⼤⼩为 4KB,则在每个进程页表中的页表项数可达 1MB。⼜因为每个页表项占⽤⼀个字节,故每个进程仅仅的页表就要占⽤ 1MB 的连续的内存空间。
引⼊多级页表是为了使⽤离散分配⽅式,以解决难以到⼀块连续的⼤内存空间的问题。同时实现只将当前需要的部分页表项调⼊内存,其余的页表项仍驻留在磁盘上,需要时再调⼊。
两级页表
为了解决进程在内存中的连续存储问题,做法是将进程地址空间分页,并为其建⽴⼀张页表,记录各页⾯的存放位置。同样的思路也可⽤于解决页表存放的问题,把必须连续存放的页表再分页,使每个内存块刚好可以放⼊⼀个分组。⽐如页⾯⼤⼩ 4KB,每个页表项 4B,每个页⾯可存放 1K 个页表项。因此每 1K 个连续的页表项为⼀组,每组刚好占⼀个内存块,再讲各组离散地放到各个内存块中。这种结构为两级页表(Two-Level Page Table),实现时要为离散分配的页表再建⽴⼀张页表,称为页⽬录表或外层页表或顶层页表。
在页表的每个表项中,存放的是进程的某页在内存中的物理块号,⽽在外层页表的每个页表项中所存放的是某页表分页的⾸址。在地址变换机构中同样需要增设⼀个外层页表寄存器,⽤于存放外层页表的始址。地址转换时⾸先按照地址结构将逻辑地址拆分成三部分,接着从PCB 中读出页⽬录表始址,再根据⼀级页号查页⽬录表,到下⼀级页表在内存中的存放位置。然后根据⼆级页号查表,到最终想访问的内存块号,最后结合页内偏移量得到物理地址。
两级页表的访存次数为 3 次,第⼀次访存访问内存中的页⽬录表,第⼆次访存访问内存中的⼆级页表,第三次访存访问⽬标内存单元。
此时可以实现可以在需要访问页⾯时才把页⾯调⼊内存,通过在页表项中增加⼀个标志位,⽤于表⽰该页⾯是否已经调⼊内存。若想访问的页⾯不在内存中,则产⽣缺页中断(内中断),然后将⽬标页⾯从外存调⼊内存。
多级页表
当使⽤的计算机的位数不同时,可能会继续拓展到多级页表,将外层页表再进⾏分页,将各分页离散地装⼊到不相邻接的物理块中,再利⽤第 2 级的外层页表来映射它们之间的关系。若采⽤多级页表机制,则各级页表的⼤⼩不能超过⼀个页⾯。例如某系统按字节编址,采⽤ 40位逻辑地址,页⾯⼤⼩为 4KB,页表项⼤⼩为 4B,假设采⽤纯页式存储,则要采⽤⼏级页表?页内偏移量为⼏位?
⾸先页⾯⼤⼩ = 4KB = 2^12B,按字节编址的页内偏移量为 12 位。页号 = 40 - 12 = 28 位,页⾯⼤⼩ = 2^12B,页表项⼤⼩ = 4B,则每个页⾯可存放 212 / 4 = 210 个页表项。此时需要 10 位⼆进制位才能映射到 210 个页表项,因此每⼀级的页表对应页号应为 10 位。总共 28位的页号⾄少要分为三级。
分段存储管理
引⼊分段存储管理的动机
引⼊分段存储管理⽅式主要有 2 ⽅⾯的原因,⼀⽅⾯是由于通常的程序都可分为若⼲个段,每个段⼤多是⼀个相对独⽴的逻辑单位。另⼀⽅⾯实现和满⾜信息共享、信息保护、动态链接以及信息的动态增长等需要,也都是以段为基本单位的。分段存储管理⽅式更符合⽤户和程序员的需要,具体的需求有如下⼏点。
需求说明
⽅便编程程序员访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定的
信息共享在实现对程序和数据的共享时是以信息的逻辑单位为基础的,以段为单位更利于信息共享
信息保护信息保护同样是以信息的逻辑单位为基础的,以段为单位更利于信息保护
动态增长在应⽤中存在着⼀些段,在使⽤过程中所需要的存储空间需要动态增加
动态链接当需要调⽤某个⽬标程序时才将其调⼊内存并进⾏链接,动态链接以段作为链接的基本单位
分段存储管理的基本结构
分段
作业的地址空间被划分为若⼲个段,每个段定义了⼀组逻辑信息。通常可⽤⼀个段号来代替段名,每个段都从 0 开始编址,并采⽤⼀段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因此各段的长度并不相等。整个作业的地址空间由于被分成多个段,其逻辑地址由段号(段名)和段内地址所组成。
分段⽅式已得到许多编译程序的⽀持,编译程序能⾃动地根据源程序的情况产⽣若⼲个段。
段表
在分段式存储管理系统中,内存为每个分段分配⼀个连续的分区,进程中的各个段可以离散地装⼊内存中不同的分区中。为保证程序能正常运⾏,就必须能从物理内存中出每个逻辑段所对应的位置,为此需为每个进程建⽴⼀张段映射表。每个段在表中占有⼀个表项,记录了该段在内存中的起始地址(基址)和段的长度。在配置了段表后,执⾏中的进程可通过查段表,到每个段所对应的内存区。
各个段表项的长度是相同的,例如某系统按字节寻址且采⽤分段存储管理,逻辑地址结构为段号 16 位、段内地址 16 位),因此⽤ 16 位即可表⽰最⼤段长。物理内存⼤⼩为 4GB,因此可以让每个段表项占 16 + 32 = 48 位(6B)。由于段表项长度相同,因此段号可以是隐含的,不占存储空间。若段表存放的起始地址为 M,则 K 号段对应的段表项存放的地址为 M + K * 6。
分段地址变换机构
为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器存放段表始址和段表长度 TL。在进⾏地址变换时,系统将逻辑地址中的段号 S 与段表长度 TL 进⾏⽐较。若 S > TL 表⽰段号太⼤访问越界,于是产⽣越界中断信号。若未越界则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址。然后再检查段内地址 d 是否超过该段的段长 SL 。若 d>SL 同样发出越界中断信号,若未越界则将该段的基址 d 与段内地址 W 相加,得到要访问的内存物理地址。
像分页系统⼀样,当段表放在内存中时,每要访问⼀个数据都须访问两次内存。为了提⾼访问速度也增设⼀个联想存储器,⽤于保存最近常⽤的段表项。
段页式存储管理⽅式
分段和分页管理的异同
分页和分段系统都采⽤离散分配⽅式,且都是通过地址映射机构实现地址变换。两者完全不同主要表现在下述三个⽅⾯:
1. 页是信息的物理单位,采⽤分页存储管理⽅式是为提⾼内存的利⽤率,仅仅只是系统管理上的需要,对⽤户是不可见的。分段存储管
理⽅式中的段则是信息的逻辑单位,它通常包含的是⼀组意义相对完整的信息,是为了能更好地满⾜⽤户的需要;
2. 页的⼤⼩固定且由系统决定,在采⽤分页存储管理⽅式的系统中,在硬件结构上就把⽤户程序的逻辑地址划分为页号和页内地址两部
分。段的长度却不固定,决定于⽤户所编写的程序;
3. 分页的⽤户程序地址空间是⼀维的,⽤户程序的地址是属于单⼀的线性地址空间。在分段系统中⽤户程序的地址空间是⼆维的,程序
光驱不读盘员在标识⼀个地址时需给出段名和段内地址。
段页式管理的原理
分页系统以页⾯作为内存分配的基本单位,能有效地提⾼内存利⽤率,⽽分段系统以段作为内存分配的基本单位,它能够更好地满⾜⽤户多⽅⾯的需要。如果能对两种存储管理⽅式“各取所长”,则可形成段页式存储管理⽅式。这种新的系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等优点,⼜能像分页系统那样解决内存的外部碎⽚问题。
段页式系统的基本原理是先将⽤户程序分成若⼲个段,再把每个段分成若⼲个页,并为每⼀个段赋予⼀个段名。在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成。段号的位数决定了每个进程最多可以分⼏个段,页号位数(段内页号)决定了每个段最⼤有多少页,页内偏移量(页内地址)决定了页⾯⼤⼩、内存块⼤⼩是多少。
例如若系统是按字节寻址的,段号占 16 位,因此在该系统中每个进程最多有 2^16 = 64K 个段。页号占 4 位,因此每个段最多有 2^4 = 16页。页内偏移量占 12 位,因此每个页⾯\每个内存块⼤⼩为 2^12 = 4096 = 4KB。超级会员怎么开通
在段页式系统中,为了实现从逻辑地址到物理地址的变换,系统中需要同时配置段表和页表。段表的内容不再是内存始址和段长,⽽是页表始址和页表长度。
地址变换过程
在段页式系统中须配置⼀个段表寄存器,其中存放段表始址和段长 TL。进⾏地址变换时⾸先利⽤段号 S,将它与段长 TL 进⾏⽐较。若 S < TL 表⽰未越界,于是利⽤段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址。利⽤逻辑地址中的段内页号 P 来获得对应页的页表项位置,读出物理块号b,再利⽤块号 b 和页内地址来构成物理地址。
在段页式系统中,为了获得⼀条指令或数据须三次访问内存。第⼀次访问是访问内存中的段表,从中取得页表始址。第⼆次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址⼀起形成指令或数据的物理地址。第三次访问才是真正从第⼆次访问所得的地址中,取出指令或数据。这使访问内存的次数增加了近两倍。为了提⾼执⾏速度,在地址变换机构中增设⼀个⾼速缓冲寄存器。
火炬2法师加点参考资料
《计算机操作系统(第四版)》,汤⼩丹梁红兵哲凤屏汤⼦瀛编著,西安电⼦科技⼤学出版社
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论