虚拟存储器是什么?它的特征、功能及作用有哪些?其三种映射方式是怎样的? 虚拟存储器机制与高速缓存Cache机制很类似,高速缓存Cache是缓存了内存中的数据,虚拟存储器是在内存中缓存了磁盘的数据。如果虚拟存储器中数据不存在,那么需要从磁盘上读取数据,然后放入内存。由于磁盘的速度要比内存慢10万倍,所以除了必要的情况,应尽量少的从磁盘反复读取数据。虚拟存储器采用全相联映射方式,所以每个虚拟地址可以映射到内存的任何一个空闲位置,因此与Cache类似,虚拟存储器必须有一种方法确定每个进程虚拟地址对应内存的位置或磁盘位置,其的映射方式有3种:分页式、分段式和段页式。下文中小编详细为大家介绍虚拟存储器是什么,它的特征、功能、作用有哪些,大小决定因素是什么,及三种映射方式详解。 虚拟存储器是什么? 虚拟存储器(Virtual Memory):在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理贮存容量大得多,可寻址的“主存储器”。虚拟存储区的容量与物理主存大小无关,而受限于计算机的地址结构和可用磁盘容量。根据所用的存储器映像算法,虚拟存储器管理方式主要有段式、页式、和段页式三种。 虚拟存储器是如何工作的? 基于局部性原理可知,应用程序运行前仅须将那些当前要运行的少数页面或段先装入内存,其余部分暂留磁盘上。如果程序所要访问的页或段尚未调入内存,就发生缺页或缺段请求。如果此时内存已满,OS需要利用页置换功能,将内存中暂时不用的页调至磁盘上,再将需要访问的页调入内存。 虚拟存储器有哪些特征? 虚拟存储器的特征可以用16个字来概括:虚拟扩充、部分装入、离散分配、多次对换。 对于虚拟存储器这个基本概念应从以下4个方面进行理解,这些也是虚拟存储器所具有的基本特征: ①虚拟扩充 虚拟存储器不是扩大物理内存空间,而是扩充逻辑内存容量。就是说,用户编程时所用到的地址空间可以远大于实际内存的容量。例如,实际内存只有1MB,而用户程序和数据所用的空间却可以达到10MB或者更多。所以,用户“感觉”内存扩大了。 ②部分装入 每个进程不是全部一次性地装入内存,而是分成若干部分。当进程要执行时,只需将当前运行需要用到的那部分程序和数据装入内存。以后在运行过程中用到其他部分时,再分别把那些部分从外存调入内存。 ③离散分配 一个进程分成多个部分,它们没有被全部装入内存。即使装入内存的那部分也不必占用连续的内存空间。这样,一个进程在内存的部分可能散布在内存的不同地方,彼此并不连续。这样做,不仅可避免内存空间的浪费,而且为进程动态调入内存提供方便。 ④多次对换 在一个进程运行期间,它所需的全部程序和数据分成多次调入内存。每次调入一部分,只解决当前需要,而在内存的那些暂时不被使用的程序和数据,可换出到外存的对换区;甚至把暂时不能运行的进程在内存的全部映像都换出到对换区,以腾出尽量多的内存空间供可运行的进程使用。被调出的程序和数据在需要时可以重新调入内存中。 虚拟存储器的功能是怎样的? (1)它将主存看成一个存储在磁盘上的地址空间的高速缓存,在主存中只保留活动区域,并根据需要在磁盘和主存之间来回传送数据; (2)他为每个进程提供了一致的地址空间,从而简化了存储器管理; (3)它保护了每个进程的地址空间不被其它进程破坏; 虚拟存储器有什么作用? 虚拟内存的作用 内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内存里储存的文件释放到原来的安装目录里了。 虚拟存储器的大小是由哪些因素决定的? 例如,32位地址总线的计算机,虚拟存储器的大小为4GB,但实存未必有这么大,实存由计算机的内存条大小决定,如插1G的内存条,内存就是1GB。如果我要编制一个程序,空间大小为4GB,那剩下的3GB从何而来?虚拟存储器的大小虽说可以随意调节(最大可以调节主存+磁盘总容量),不由地址线决定。但那么大的虚拟存储器没有意义,例如地址线32根,最多只能找到4GB个存储单大小的空间,那设置成100G的虚拟存储空间毫无意义,因为根本找不到那部分的地址单。因此统一化虚拟存储器的容量由计算机地址总线数量决定。 虚拟存储器的三种映射方式详解 分页式虚拟存储器 分页式存储器把内存和虚拟地址空间都划分成大小相等的页面,磁盘和内存按页面为单位交换信息。通常把虚拟地址空间的页面成为虚拟页/逻辑页(VP),内存中的页面成为页框/物理页(PP)。 1.页表 操作系统在内存中给每个进程生成一个页表,页表中对应每个虚拟页都有一个表项,表项内容包括存放位置字段、装入位、修改位、替换控制位、存取权限位、禁止缓存位。它们的作用分别如下: ①存放位置字段:用来建立虚拟页和物理页之间的映射,用于虚拟地址到物理地址的转换 ②装入位:也称有效位或存在位,为1表示磁盘数据已调入内存,位置字段指向物理页号。为0表示磁盘数据没有被调入内存,若位置字段为null则说明此位置空闲,若不为null则说明等待磁盘数据调入内存 ③修改位:标识页面是否被修改过,在执行回写策略时根据此字段判断是否需要把数据写回磁盘 ④替换控制位:标识页面使用情况,配合替换策略设置 ⑤访问权限位:标识页面是可读可写、只读、只可执行,用于存储保护 ⑥禁止缓存位:标识页面是否可以装入Cache,保证磁盘、内存、Cache数据一致性 页表、内存、磁盘的映射示意图如图所示:
映射示意图 例如,CPU执行一条指令需要访问数据,该数据正好在虚拟页VP1中,查询页表可知,VP1装入位为1,对应的物理页PP0,这时就可以通过地址转换部件把将虚拟地址转换为物理地址,然后访问PP0的数据。 如果数据在VP6中,VP6对应的装入位为0,表示页面缺失,发生“缺页”异常,需要操作系统进行“缺页”异常处理程序处理。“缺页”异常处理程序根据页表中VP6对应的存放位置字段,从磁盘中将数据读出,然后找一个空闲的物理页框存放,若内存中没有空闲的页框,则选择一个页面替换到磁盘上。 因为采用写回策略,所以页面淘汰时,需要根据修改位确定是否要写回磁盘。缺页处理过程中需要对页表进行相应的更新。缺页异常处理结束后,程序回到原来发生缺页的指令继续执行。 对于VP0和VP4,随着进程的动态执行,这些页面可能就会有了具体的数据。例如,当调用malloc函数时,堆区增长,新增的堆区正好与VP4对应,则操作系统就在磁盘上分配一个存储空间给VP4,同时把VP4页表项中的存放位置字段填上,对应的就是磁盘上的起始地址。之后便等待访问到这页数据时,再次执行上面的缺页异常流程,读取数据。 2.地址转换 上面说完了页表、内存、磁盘的映射关系和数据读取流程,其中有个环节是需要把虚拟地址转换为真正的物理地址,转换工作由CPU中的存储器管理部件(MMU)完成,具体做法如下: ①虚拟地址分为两部分:高位为虚拟页号,低位为页内偏移地址 ②物理地址也分为两部分:高位是物理页号,低位为页内便宜地址 ③每个进程都有一个页表基址寄存器,存放该进程页表首地址 ④根据页表基址寄存器找到对应的页表,由虚拟地址高位部分的虚拟页号为索引,找到页表项 ⑤若装入位为1,则取出对应的物理页号,然后和虚拟页内地址拼接,得到司机的物理地址 ⑥如装入位为0,则交给操作系统执行“缺页”处理 执行流程如图所示:
执行流程 3.快表 从上述过程可以看出,每次访问内存都需要先查页表,然后根据规则找出物理地址,然后再访问实际的物理地址对应的数据。如果发生缺页,还要进行页表替换、页表修改等操作,访问内存的次数就更多。采用虚拟存储器,访问内存的次数增加了很多。那有没有什么办法减少访问次数,还能达到同样的效果呢? 答案是可以的,我们可以把页表中最活跃的几个页表项复制到高速缓存Cache中,这种高速缓存Cache中的页表项组成的页表称为快表(TLB)。 这样在进行地址转换时,先查看快表中是否命中,如果命中,则无需访问内存中的页表即可。通过这种方式可大大降低内存访问的次数,提升效率。 到此可以总结一下CPU访问数据的完整过程,如图所示:
CPU访问数据的完整过程 分段式虚拟存储器 分页方式的虚拟存储器优点是页长固定,易管理,不存在碎片。但缺点是页长与程序的逻辑大小无关。例如,某个时刻一段代码有一部分在内存中,另外一部分则在磁盘上,不利于编程时的独立性,且给存储保护和存储共享造成了麻烦。所以又提出了分段式的存储器。把一段程序按照类别划分为段,例如方法、操作数、常数划分到不同的段中,每个段都是一组相对完整的逻辑信息。这样做的好处是可以按不同类型进行存储管理,也利于多个程序组合时,对同一段逻辑可以组合复用提供了便利。 分段的方式具体如下: ①虚拟地址由段号和段内地址组成 ②内存按程序中的段划分,每个段在内存中的位置记录在段表中 ③每个进程都有一个段表,每个段在段表中有一个段表项,标识段的位置、长度、访问权限、使用和装入情况 分段存储器把虚拟地址转换为物理地址流程如图4所示:
虚拟地址与物理地址的转换 1.分段式虚拟存储器优点 ①段的划分与程序的自然分界相对应 ②段的易于编译、管理、修改和保护,也便于多道程序共享 ③段具有动态可变长度,允许自由调度以便利用内存空间 2.分段式虚拟存储器缺点 ①段的长度不相同,起点和终点不固定,给内存分配带来麻烦 ②容易在内存中留下零碎空间,导致空间浪费 段页式虚拟存储器 段页式虚拟存储器是结合了分页式和分段式的优点,具体方式如下: ①程序按模块分段,段内再分页,用段表和页表进行两级定位管理 ②段表中每个表项对应一个段,每个段表中包含一个指向该段页表起始位置以及控制信息和保护信息 ③页表指明该段各页在内存中的位置和是否装入、修改等状态信息 ④程序数据调入调出按页进行,又可以按段实现共享和保护。 缺点是地址映射过程需要多次查表。 每个用户进程有一个基号,标识用户进程,进程的段表起始地址存放在各自对应的基地寄存器中,格式如图所示:
用户进程格式 逻辑地址到物理地址的转换过程如图所示:
逻辑地址与物理地址的转换 虚拟存储器的存储保护 为了避免多个程序运行时互相干扰,或者某个程序不合法地访问了其他程序的数据,应该对每个程序进行存储保护,保护的对象包括操作系统和用户程序。 (1)对操作系统存储保护主要是硬件提供支持: ①支持至少2种运行模式:管理模式、用户模式,操作系统在管理模式下管理各种功能,用户进程运行在用户模式下 ②部分CPU状态只能由系统进程写,用户进程只能读:例如段表、页表首地址、TLB内容等 ③提供让CPU在管理模式和用户模式之间切换的机制:通过“异常”处理让CPU从用户模式切换到管理模式,异常处理完成后通过“返回”指令让CPU回到用户模式 (2)对于用户进程的保护主要分为访问方式保护和存储区域保护: ①访问方式保护:检查“访问越权”,通过段表或页表的访问权限位控制,例如共享区域只可读不可写,程序段只可执行或只读,未授权区域不可访问等 ②存储区域保护:检查“地址越界”,通过段页的起始地址和终止地址控制
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/89331.html