存储系统的分层结构 hierarchy of memory
cahce
cahce原理时间局部性和空间局部性
时间局部性:如果某个数据被访问,那么在不久的将来它很可能再次被访问,典型的例子就是循环,循环体代码被处理器重复执行,直到循环结束,第一次访问循环体代码时会从内存中读取,同时将该代码存放到Cache中,这样在后面的循环中CPU都能够在Cache中查找到所需代码,从而加速了取指过程
空间局部性:如果某个数据被访问,那么与它临近的数据很可能很快被访问,典型的例子就是数组,数组中的元素常常按照顺序依次被程序访问
存在分级情况 ,cache各层相互包含 。(question1:保存的是上一层的副本,所以要考虑存储一致性问题)
1. L1cache instruction cahce and data cache
2. L2cache and L2cache
3. L2cache在存储子系统里面,L3cache各个核共享
cache 组织
1. 直接映射 directly-mapped cache
2. 全相连映射
3. 组相连映射 n-way set-associative cache (每个地址对应n个cache项)
对于直接映射:主存地址分为,标记 | 字块地址 | 块内地址 出现冲突,且利用率不高。
对于全相联映射:主存地址分为,标记 | 块内地址
对于组相联地址:主存地址分为,标记 | 组地址 | 块内地址
cache与内存替换算法 FIFO and LRU ( least recently used ) 算法 。
cache中写的问题
cache块大小一般取一个主存周期所能调出信息长度,一般4-64bytes,
写命中 处理字在cache中
写直达 write through 写入cache数据同时立即写入内存中 。 内存操作消耗更多资源
写回 write back 加上标志,等到该cache块被替换时写入
写缺失 处理字不在cache中
写分配 write allocation把缺页的块调入cache中
写直达 write through (no-write allocation)直接写入内存中不分配cache
cache--memory层次完全由硬件实现。
虚拟存储器
指的是主存--辅存层次,程序员按照虚拟空间编址。
程序的装入和装出
分页式存储管理
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页进行编号,从0开始。相应地,把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或者页框
为了能够保证在内存中找到每个页面所对应的物理块,系统为每个进程建立了一张页面映射表,简称为页表。页表项纪录了相应页在内存中对应的物理块号,在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号,页表实现了从页号到物理块号的地址映像
分页地址中的地址结构如下
说明:前一部分为页号P,后一部分为位移量W(或称为页内地址),总共32位,其中0~11位为页内地址,每页大小4KB,12~31位为页号,地址空间最多允许1M页。
即使在简单的分页系统中,也常在页表的表项中设置一存取控制字段,用于对该存储块中的内存加以保护,当存取控制字段仅有一位时,可用来规定该存储块中的内存时允许读/写,还是只读;若存取控制字段为二位,则可规定为读/写、只读、只执行等存取方式。
地址变换任务:交给page table
页表的功能可以由一组专门的寄存器来实现,一个页表项用一个寄存器,由于寄存器具有较高的访问速度,因而有利于提高地址变换的速度,但成本较高,且页表项一般会很多,都使用寄存器实现不太现实,因此,页表大多驻留在内存。在系统中只设置一个页表寄存器PTR(Page-Table Register),用于存放页表在内存的始址和页表的长度,平时,进程执行时,页表的始址和页表长度存放在本进程的PCB中,当调度程序调度到某进程时,将这两个数据装入页表寄存器,因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需要一个页表寄存器。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表,查找操作由硬件执行,在执行检索前,先将页号与页表长度进行比较,若页号大于或等于页表长度,则表示本次访问的地址超越了进程的地址空间,这一错误将被系统发现并产生一个地址越界中断。若未出现错误,则将页表始址加上页号与页表项长度的乘积,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器,与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中,这样,便完成了逻辑地址到物理地址的转换。
上述操作中,每次存取一个数据时,都会访问内存两次,第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址,第二次访问时,才是从第一次所得的地址中获得所需数据,因此,这种方式会使计算机的处理速度降低一半,为了提高地址变换速度,可以在地址变换机构中增设一个具有并行查询能力的特殊高速缓冲寄存器,又称为联想寄存器或快表,用以存放当前访问的那些页表项。
此时的变换过程如下,在CPU给出有效地址后(逻辑地址),由地址变换机构自动的将页号P送入高速缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与之相匹配的页号,便表示所要访问的页表项在快表(question2 : TLB translation lookaside buffer)中,于是,可以直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中,如在快表中没有找到,则还需要再访问内存中的页表,找到后,把从页表项读出的物理块好送入地址寄存器,同时,再将此页表项存入快表的寄一个寄存器单元,即修改快表,如果快表已满,则OS需要找到一个老的且已被认为不再需要的页表项,将它换出。
多级page table
分段式存储管理方式
从固定分区到动态分区分配,再到分页存储管理方式,其主要动力为提高内存利用率,引入分段存储管理的目的在于满足用户在编程和使用上多方面的要求
① 方便编程,用户可以把自己的作业按照逻辑关系划分为若干段,每个段都是从0开始编址,并有自己的名字和长度。
② 信息共享,在实现对程序和数据的共享时,是以信息的逻辑单位为基础的,比如共享某个函数。
③ 信息保护,信息保护同样是对信息的逻辑单位进行保护。
④ 动态增长,在实际应用中,数据段在使用过程中往往会不断增长,而实现无法确切知道数据段会增长到多大,分段可以较好的解决这个问题。
⑤ 动态链接,再运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中有需要调用某段时,才将该段调入内存并进行链接。
基本原理 : 在分段管理中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息,如有主程序段MAIN,子程序段X,数据段D及栈段S,每个段都有自己的名字,每个段从0开始编址,并采用一段连续的地址空间,段的长度由相应的逻辑信息组的长度决定,因而各段长度不等,整个作业的地址空间由于是分成多个段,因而是二维的,即其逻辑地址由段号和段内地址构成。
在分段式存储管理系统中,为每个分段分配一个连续的分区,而进程中的各个段可以离散地移入内存中不同的分区,为了使程序正常运行,能够物理内存中找出每个逻辑段所对应的位置,应该为每个进程建立一张段映射表,称为段表,每个段在表中有一个表项,其中记录了该段在内存中的起始地址和段的长度。段表可以存放在一组寄存器中,这样有利于提高地址转换速度,但通常将段表放在内存中。段表用于实现从逻辑段到物理内存区的映射。
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表TL,在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较,若S>TL,表示段号太大,访问越界,产生越界中断信号,若未越界,则根据段表的始址和该段的段号,计算该段对应段表项的位置,从中读出该段在内存中的起始地址,然后,再检查段内地址d是否超过该段的段长SL,若超过,同样发出越界中断信号,若为越界,则将该段的基址与段内地址d相加,即得到要访问的内存物理地址。
每次访问一个数据时(需给出段号和段内地址),也需要访问两次内存,第一次根据段号获得基址,第二次根据基址与段内地址之和访问真实数据的物理地址。这降低了计算机的速率,也可以增设一个联想存储器,用来保存最近常用的段表项,用来加速存取数据的时间。
页式存储与段式存储对比
① 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率,或者说,分页仅仅是由于系统管理的需要而不是用户的需要,段则是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了能更好地满足用户的需要。
② 页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,一个系统中,只存在一种大小的页面,段的长度则不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
③ 分页的作业的地址空间是一维的,即单一的线性的地址空间,程序员只利用一个记忆符即可表示一个地址,而分段的作业地址空间是二维的,程序员在标识一个地址是,需要给出段名和段内地址。
段页式存储
6.2 段页式存储管理方式
分页系统能够有效的提高内存利用率(但是会存在页内碎片),分段系统则能够很好地满足用户需要。若能将两种方式结合起来,既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等优点,又能像分页系统那样很好地解决内存的外部碎片问题,基于此,提出了段页式系统。
段页式系统先将用户程序分成若干个段,再把段分为若干个页,并为每一个段赋予一个段名。段页式系统中,地址结构由段号、段内页号、页内地址三部分构成。
在段页式系统中,为了便于实现地址转换,须配置一个段表寄存器,其中存放段表始址和段表长TL,进行地址变换时,首先利用段号S,将它与段表长TL进行比较,若S<TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应页的页表项位置,从中读出该页所在的物理块号b,再利用b和页内地址构成物理地址。
在段页式系统中,为了获得一条指令或数据,需要访问内存三次,第一次访问时访问内存中的段表,从中取得页表始址,第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址,第三次访问才是真正的从第二次访问所得的地址中,取出指令或数据。同样,也可以增设高速缓冲寄存器用于加快访问速度。
虚拟存储器
前面所介绍的存储器管理方式都有一个共同的特点,即他们都要求将一个作业全部装入内存后方能运行,于是,出现了下面两种情况
① 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行。
② 做大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存让他们先运行,而将其他大量作业留在外存上等待。
为了解决上述问题,可以增加物理内存,但是其不太现实,另外是从逻辑上扩充内存容量。
基于程序的局部性原理(时间局限性和空闲局限性),程序在运行之前,没有必要全部装入内存,仅需将那些当前要运行的少数页面或段先装入内存便可运行。其余部分暂留在磁盘上,程序运行时,如果它所要访问的页(段)已经调入内存,便可继续执行下去,但如果程序所要访问的页(段)尚未调入内存(缺页或缺段),此时程序应利用OS的请求调页(段)功能,将它们调入内存,以使进程继续执行下去。如果此时内存已满,无法再装入新的页(段),则还需利用页(段)的置换功能,将内存中暂时不用的页(段)调至磁盘上,再将要访问的页(段)调入内存,使程序继续执行。这样,可以使很大的用户程序在较小的内存空间中运行。从用户的调入看,该系统具有很大的内存容量,但是,用户看到的大容量只是一种感觉,这种存储器被称为虚拟存储器。所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统,其逻辑容量由内存容量和外存容量之和决定,其运行速度接近内存,成本接近外存。
7.1 虚拟存储器的实现方法
在虚拟存储器中,允许将一个作业分多次调入内存,其建立在离散分配的存储管理方式上。
① 请求分页系统,在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统,其允许只装入少量页面的程序(数据),便启动运行,以后,再通过调页功能及页面置换功能,陆续地把要运行的页面调入内存,同时把暂时不用的页面换出到外存,置换是以页面为单位。其需要必要的硬件和软件支持。硬件有请求分页的页表机制(它是在纯分页的页表机制上增加若干项而形成的,作为请求分页的数据结构)、缺页中断机构(每当用户程序要访问的页面尚未调入内存时,便产生一缺页中断,请求OS将所缺的页调入内存)、地址变换机构(在纯分页的基础上发展形成)。软件有用于实现调页的软件和实现页面置换的软件。
② 请求分段系统,在分段系统的基础上,增加了请求调段功能和分段置换功能所形成的段式虚拟存储系统。其允许只装入少量段的用户程序和数据,即可启动运行,以后再通过调段功能和段的置换功能将咱不运行的段调出,同时调入即将运行的段,置换是以段为单位。其需要必要的硬件和软件支持,硬件有请求分段的段表机制(它是在纯分页的段表机制上增加若干项而形成的,作为请求分段的数据结构)、缺段中断机构(每当用户程序要访问的段尚未调入内存时,便产生一缺段中断,请求OS将所缺的段调入内存)、地址变换机构(在纯分段的基础上发展形成)。软件有用于实现调页的软件和实现页面置换的软件。
7.2 虚拟存储器的特征
① 多次性,一个作业会被分成多次调入内存运行,多次性是虚拟存储器最重要的特征。
② 对换性,允许在作业的运行过程中进行换进、换出。换进换出能够有效地提高内存利用率。
③ 虚拟性,使用户所看到的内存容量远大于实际内存容量。
虚拟性是以多次性和对换性为基础的,仅当系统允许将作业分多次调入内存,并能够将内存中暂时不运行的程序和数据换至磁盘上时,才有可能实现虚拟存储器,而多次性和对换性有必须建立在离散分配的基础上。
八、请求分页存储管理方式
请求分页是建立在分页基础上的,增加了请求调页功能和页面置换功能。
8.1 请求分页中的硬件支持
① 页表机制,其基本作用仍然是将用户地址空间中的逻辑地址变换为内存空间中的物理地址,由于只将应用程序的一部分调入内存,还有一部分仍在盘上,故需要再页表中再增加若干项,供程序(数据)在换进、换出时参考,请求分页系统中的页表项如下
说明:状态位P,用于指示该页是否已调入内存,供程序访问时参考;访问字段A,用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供选择换出页面时参考;修改位M,表示该页在调入内存后是否被修改过,由于内存的每一页在外存上保留有一个副本,因此,若未被修改,则在置换时就不需要再将该页写回到外存上,若被修改,则必须重写到外存上,M位供置换页面时参考;外存地址,指出该页在外存上的地址,通常是物理块号,供调入该页时参考。
② 缺页中断机构,当要访问的页面不在内存时,产生一个缺页中断,请求OS将缺的页面调入内存,缺页作为中断,也需要经过保护CPU现场、分析中断原因、转入中断处理程序进行处理、恢复CPU环境等。但是,其与一般中断相比有一些不同,主要在于:在指令执行期间产生和处理中断信号(通常CPU都是在一条指令执行完后,才检查是否有中断请求到达,若有,则响应,否则,继续执行下一条指令,然而,缺页中断是在指令执行期间,发现所要访问的指令或数据不再内存时所产生和处理的),一条指令在执行期间,可能产生多次缺页中断。
③ 地址变换机构,在分页系统地址变换基础上,为实现存储器而增加的某些功能而形成。如产生和处理缺页中断,以及从内存中换出一页功能等。
补充(外页表)(question 3)
8.2 内存分配策略和分配算法
在为进程分配内存时,涉及到如下三个问题:最小物理块数的确定、物理块的分配策略、物理块的分配算法。
① 最小物理块数的确定,指能够保证进程正常运行所需的最小物理块数,当系统为进程分配的物理块数小于此值时,进程将无法运行。进程应获得的最少物理块数与计算机的硬件结构有关,取决于指令的格式、功能、寻址方式。
② 物理块的分配策略,在请求分页系统中,可采取两种内存分配策略,固定和可变分配策略,在进行置换时,也可采用全局置换和局部置换,可组合出如下三种适用的策略。固定分配局部置换(为每个进程分配一定数目的物理块,整个运行期不再改变,如果进程在运行中发现缺页,则只能从该进程在内存的n个页面中选出一页换出,然后再调入一页,以保证分配给该进程的内存空间不变,若开始为进程分配的物理块数太少,则会频繁缺页,降低系统吞吐量,若太多,则使内存中驻留的进程数目减少,进而造成CPU空闲或其他资源空闲的情况),可变分配全局置换(先为系统中的每个进程分配一定数目的物理块,而OS自身也保持一个空闲物理块队列,当某进程发现缺页时,由系统从空闲物理块队列中取出一个物理块分配给该进程,并将欲调入的缺页装入其中,仅当空闲物理队列的物理块用完时,OS才能从内存中选择一页调出,该页可能是系统中任一进程的页,这样,会是那个进程的物理块减少,进而使缺页率增加),可变分配局部置换(为每个进程分配一定数目的物理块,当进程缺页时,只允许从该进程在内存中的页面中选出一页换出,这样不会影响其他进程的运行,如果该进程频繁发生缺页,则系统需要再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止,反之,若一个进程正在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数,但不应该引起缺页率明显增加)。
③ 物理块分配算法,可采用平均分配算法(将系统中所有可供分配的物理块平均分配给各个进程)、按比例分配(根据进程的大小按比例分配物理块)、考虑优先权的分配算法(将重要的,紧迫的作业分配较多的内存空间,可将系统的物理块分成两部分,一部分按比例分配给各进程,另一部分则根据进程的优先权适当地增加相应份额后,分配给进程)
九、页面置换算法
在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存已五空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中,但应将哪个页面调出,必须根据一定的算法来确定,通常,把选择换出页面的算法称为页面置换算法,置换算法的好坏,直接影响到系统的性能。一个好的页面置换算法,应该具有较低的页面更换频率。
9.1 最佳置换算法
是一种理论上的算法,所选择的被淘汰页面将是以后用不使用的,或者是在最长时间内不再被访问的,采用最佳置换算法,可以保证获得最低的缺页率,由于无法预知一个进程在内存的若干个页面中,哪个页面是未来最长时间内不再被访问的,因而该算法无法实现,但可以以此评价其他算法。假设系统为某进程分配了三个物理块,并考虑如下的页面号引用串:7, 0 ,1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。在进程运行后的置换如下图。
采用最佳置换算法发生了6次页面置换。
9.2 先进先出页面(FIFO)置换算法
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰,该算法实现简单,只需要把一个进程已调入内存的页面,按照先后次序链接成一个队列,并设置一个指针,称为替换指针,使之指向最老的页面,但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,FIFO算法并不能保证这些页面不被淘汰。
使用FIFO算法时进行了12次页面置换。
9.3 最近最久未使用(LRU)置换算法
该算法根据页面调入内存后的使用情况来进行决策,由于无法预测各页面将来的使用情况,LRU只能使用最近的过去代替最近的将来,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次访问以来所经历的时间t,当需要淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。
使用LRU算法时进行了9次页面置换
。
9.4 Clock置换算法
为每一页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列,当某页被访问时,其访问位置为1,置换算法在选择一页淘汰时,只需要检查页的访问位,如果是0,就选择该页换出;若为1,则重新置为0,暂不换出,给该页第二次驻留内存的机会,再按照FIFO算法检查下一页面。当检查到队列中的最后一个页面时,若其访问位仍然是1,则再返回到队首去检查第一个页面,该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面置换出去,故又把该算法称为最近未用算法NRU(Not Recently Used)
在将一个页面换出时,如果该页已经被修改过,便需要将该页重新写回到磁盘上,但如果没有被修改过,则不必将它拷回磁盘,在改进的Clock算法中,增加了一个置换代价的因素,这样,选择页面换出时,既要是未使用过的页面,又是要未被修改过的页面,把同时满足这两个条件的页面作为首选淘汰页面。由访问位A和修改位M可以组合如下四种类型的页面
① (A = 0, M = 0),表示该页最近既未被访问,又未被修改,是最佳淘汰页面。
② (A = 0, M = 1),表示该页最近未被访问,但已被修改,并不是很好的淘汰页面。
③ (A = 1, M = 0),表示该页最近已被访问,但未被修改,该页可能被再次访问。
④ (A = 1, M = 1),表示该页最近已被访问且被修改,该页可能再被访问。
对于置换而言,执行如下几步。
① 从指针所指示的当前位置开始,扫描循环队列,寻找A = 0 且 M = 0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页,在第一次扫描期间不改变访问位A。
② 如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A = 0 且 M = 1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位置为0。
③ 如果第二步也失败,即未找到第二类页面,则将指针返回到开始位置,并将所有的访问位复为0,然后重复第一步,如果仍然失败,则重复第二步,则一定能够找到被淘汰的页。
十、请求分段存储管理方式
只需先调入若干个分段便可启动运行,当所访问的段不在内存中时,可请求OS将所缺的段调入内存。也同样需要硬件的支持。
10.1 请求分段中的硬件支持
为了快速完成请求分段功能,需要支持的硬件有段表机制、缺段中断机制、地址变换机构。
① 段表机制,由于只有一部分段装入内存,其余段仍留在外存上,需要再段表中增加若干项,以供程序调进、调出时参考。
说明:各字段意义如下存取方式(用于标识本分段的存取属性是只执行、只读、还是允许读/写),访问字段A(用于记录该段被访问的频繁程度),修改位M(表示该页在进入内存后是否已被修改过,供置换时参考),存在位P(表示本段是否已调入内存,供程序访问时参考),增补位(用于表示本段在运行过程中是否做过动态增长),外存始址(本段在外存中的起始地址,即起始盘块号)。
② 缺页中断机构,进程运行时发现所需的段尚未调入内存,便由缺段中断机构产生一个缺段中断信号,进入OS后由缺段中断处理程序将所需要的段调入内存。需要在一条指令的执行期间,产生和处理中断,以及一条指令执行期间,可能会产生多次缺段中断。
③ 地址变换机构,其在分段系统地址变换机构基础上形成,增加了缺段中断的请求和处理功能。
question
question 1:cache与memory存储一致性问题
暂时先向cache写入,用标志加以注明当该修改字从cache中替换出时写入,或者每次写入cache时同时写入memory。保持cache和memory一致。
question 2: TLB
内存管理单元(英语:memory management unit,缩写为MMU),有时称作分页内存管理单元(英语:paged memory management unit,缩写为PMMU)。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)[1]、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换(bank switching,尤其是在8位的系统上)。
工作机制[编辑]
现代的内存管理单元是以页的方式,分割虚拟地址空间(处理器使用的地址范围)的;页的大小是2的n次方,通常为几KB(千字节)。地址尾部的n位(页大小的2的次方数)作为页内的偏移量保持不变。其余的地址位(address)为(虚拟)页号。
页表条目[编辑]
内存管理单元通常借助一种叫做转译旁观缓冲器(Translation Lookaside Buffer,缩写为TLB)的相联高速缓存(associative cache)来将虚拟页号转换为物理页号。当后备缓冲器中没有转换记录时,则使用一种较慢的机制,其中包括专用硬件(hardware-specific)的数据结构(Data structure)或软件辅助手段。这个数据结构称为分页表,页表中的数据就叫做分页表项(page table entry,缩写为PTE)。物理页号结合页偏移量便提供出了完整的物理地址。
页表或转换后备缓冲器中数据项包括的信息有:一、“脏位”(页面重写标志位,dirty bit)——表示该页是否被写过。二、“访问位”(accessed bit)——表示该页最后使用于何时,以便于最近最少使用页面置换算法(least recently used page replacement algorithm)的实现。三、哪种进程可以读写该页的信息,例如用户模式(user mode)进程还是特权模式(supervisor mode)进程。四、该页是否应被高速缓冲的信息。
有时,TLB或PTE会禁止对虚拟页的访问,这可能是因为没有物理随机存取存储器(random access memory)与虚拟页相关联。如果是这种情况,MMU将向CPU发出页错误(page fault)的信号。操作系统(operating system)将进行处理,也许会尝试寻找RAM的空白帧,同时创建一个新的PTE将之映射到所请求的虚拟地址。如果没有空闲的RAM,可能必须关闭一个已经存在的页面,使用一些替换算法,将之保存到磁盘中(这被称之为页面调度(paging)。在一些MMU中,PTEs或者TLB也存在一些缺点,在这样的情况下操作系统将必须释放空间以供新的映射。
益处[编辑]
有些情况下,页错误的出现表示可能存在软件错误,并能够被应用内存管理单元的内存保护特性通过禁止出错程序避免出现非法访问其他程序内存。通常地, 操作系统会为每个程序分配虚拟内存地址。
此外,内存管理单元能够减少程序的内存碎片化现象。当程序分配并释放内存块后,释放的内存可能出现碎片化,从而导致最大的连续可用内存块远小于已分配内存总量。在虚拟内存实现后,虚拟内存可以映射多个不连续的物理内存区块为一个连续区块,而这种不连续分配机制得益于内存分页。
question 3 : 外页表
外页表是指虚页号与磁盘实地址的对应表。外页表主要作用是实现虚地址到辅存实地址的转换。与之相反,虚页号和内存实地址的对应表称为内页表。外页表的内容是在将程序装入辅存时填写的,其中M是装入位。M=1时,表示该扇区中的页已从海量存储器装入磁盘,通常将外页表放于辅存中,当发生缺页中断需要查用时才将它调入内存,从虚页表找外页表可由软件实现 [1] 。
当页表或段表中的有效位指示发生页面失效时,表示需要访问的那一页或那一个程序段还没有装入到主存储器中,这时必须进行外部地址变换。外部地址变换的目的是要找到辅存(磁盘存储器)的实地址,并且把需要访问的那一页或那一个程序段调入到主存储器中。
在操作系统中,通常把页面失效当作一种异常故障来处理。在页式虚拟存储器和段页式虚拟存储器中,由于页面是按固定大小划分的,因此,页面失效可能发生在一条指令的执行过程中。例如,对于按照字节编址的主存储器,有可能出现一条指令跨越页面存放的情况。如果前一页已经在主存储器中,而后一页还没有调入主存储器,则在取指令过程中就可能发生页面失效。同样,在取操作数,特别是取字符串,间接寻址及写回运算结果的过程中都可能发生页面失效。对于这种异常故障,处理机必须立即响应并且处理,否则正在执行的指令无法继续执行下去。
外部地址变换的过程如图3.13所示。由于页面失效的概率非常低,因此,外部地址变换通常用软件来实现。每一个用户程序都有一张外页表,之所以称为外页表是因为它是在外部地址变换中使用的,与在内部地址变换中使用的页表被称为内页表相对应。虚拟地址空间中的每一个页面或每一个程序段,在外页表中都有对应的一个存储字。在每一个存储字中除了必须有磁盘存储器的地址之外,至少还应该包括一个装入位。
由于每一个用户程序有一张外页表,因此,通过多用户虚地址中的用户号U就能够找到该用户程序的外页表起始地址。再通过虚页号P就能唯一确定外页表中与需要访问的页面相对应的那个存储字。如果该存储字中的装入位为"1",则表示要访问的页面已经在磁盘存储器中,否则表示要访问的页面还不在磁盘存储器中,需要从磁带、光盘存储器等海量存储器中调入。
图3.13 外部地址变换
由于虚拟地址空间中的每一个页面在外页表中都要有对应的一个存储字,因此,外页表也要采用前面介绍的多级页表技术。
如果在整个程序的装入和执行过程中,不需要磁带、光盘等海量存储器介入,则外页表页可以与内页表合并成一个页表。当装入位为"1"时,表示要访问的页面已经在主存储器中,这时,页表中的地址字段指出该页在主存储器中的实页号。如果装入位为"0",则表示要访问的页面在磁盘存储器中,这时,页表中的地址字段指出该页存放在磁盘存储器中的磁盘实地址。
根据所采用的地址映象和地址变换方法不同,有多种不同类型的虚拟存储器。目前主要有页式虚拟存储器、段式虚拟存储器和段页式虚拟存储器等三种。然而,这三种虚拟存储器的基本原理、所采用的主要技术和工作流程等是基本相同的。
参考 https://www.cnblogs.com/leesf456/p/5616041.html