赞
踩
虚拟内存是为了解决多个程序运行时内存不足的问题而出现的技术。
虚拟内存可以将外存当做内存来使用,它使得程序运行时感觉自己运行在一个连续的地址空间,而实际物理地址却不一定是连续的。
大多数操作系统都使用了虚拟内存,如window的虚拟内存和linux的交换空间。
在编译期间,为变量分配一个虚拟地址;在运行期间,MMU(内存管理单元,用于获取虚拟地址对应的物理地址)通过存储在内存中的页表获取这个变量虚拟地址对应的实际内存物理地址,但是这个时候该变量还未分配物理地址,所以MMU查不到它对应的物理地址是什么,此时发生了缺页中断。需要为它在内存上分配一块物理地址,并将该地址写回页表供以后使用。
虚拟内存被分割成大小固定的页,称为虚拟页(VP),物理内存也被分成大小固定的页,叫物理页(PP),虚拟页的大小和物理页的大小相同。因此,虚拟内存包括未分配的、已分配未缓存到内存的、已分配缓存到内存的。
发生缺页中断时,若物理内存空间满了,需要将物理空间中的数据和磁盘对换来腾出空间,称为页面置换。
页面置换算法:
虚拟内存采用的是分页技术,也就是将虚拟内存分页,将每一页和物理内存进行映射。
由于分页页面大小是固定的,存储动态增长的数据时可能会发生覆盖问题。因此提出了分段的想法,分段是把地址空间划分为多个段,每个段的大小可以不同而且可以动态增长,可以解决覆盖问题。
段页式:
程序的地址空间划分为多个拥有独立地址的段,每个段上的地址空间划分成大小相同的页,这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。
分页和分段的比较:
快表:
快表是为了加快根据虚拟地址查找物理地址的速度,建立在虚拟地址和内存页表之间的一个缓存Cache,当需要查询物理地址时,先访问快表,若快表中存在,则直接访问内存地址数据,当快表中不存在,再去访问内存,并把内存中对应的物理地址写回到快表中,若快表满了,则会通过一定的置换算法进行置换。
其实到这里不难发现,快表的思想和我们实际中用到的redis思想类似,都是通过增加缓存的方式提高访问速度。
以上的知识点设计的较多,但都是围绕虚拟内存来展开的。
打个比方:分页是你家1平米、2平米、3平米这样的计算方式,分段是把你家分成卧室、厨房等。所以分段是给程序划分独立的地址空间。
打个不恰当的比方,虚拟内存相当于你和别人说,你家特别大,有书房、卧室、影音室等等等等,还写在了一张纸上,但实际上你家只有2个房间。这时候一个人(程序)看着这张纸,说要看你家的书房,现在2个空房间,所以发生了缺页中断,你把你家的一个房间装修成书房给他看了,这时候这个人说看你家的卧室,你又把另一个房间装饰成卧室给他看了,这时候他又要看书房,好的命中了你就直接把书房给他看了,这时候他又要看厨房,你想刚才他看书房了说不定一会还要看,就只能先把卧室的东西先搬出去,再把房间装饰成厨房给他看。总之大概就是这个意思。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。