虚拟内存的起因虚拟,是不存在的意思,那么不存在的内存如何使用呢。首先假设没有虚拟内存,现有物理内存100k,其中加载了部分程序,目前只剩余50k,但是接着要加载一个70k大小的程序。程序员在开发的时候不可能知道程序会运行在内存充足还是不充足的情况下,如果他能够直接使用100k的所有内存,那么就可以不用考虑这些问题了,而这个直接使用所有内存就是虚拟内存。那么怎么将虚拟内存和物理内存对应起来呢,这就是OS需要做的内存管理需要做的事情了。 通俗的说,就是在编程人员的眼里,他们能使用的内存大小是所有物理内存,甚至是更大的内存,而计算机只有固定的物理内存,却需要为每个程序提供空间,OS就是这两者之间的协调者。 早期的实现方式-交换式、覆盖式早期对虚拟内存的实现方式主要有两种,这两种各有优缺点,现代使用的正式结合这两种方式的优点进行改造的技术。 第一种称为交换式,顾名思义,就是当内存不够时将未被使用的进程交换到硬盘中,为即将执行的程序腾出空间,至于具体要交换哪一个进程则是由具体的算法决定的。 第二种称为覆盖式,当前准备执行的程序不可能每一部分都需要同时执行,那么就可以将其中不能同时执行的代码统一放到同一块内存空间中执行,当需要加载它们的时候将空间中的直接覆盖即可。使用此种方式可以实现共享库的功能。 其中覆盖式需要开发者将程序分解为多个独立的模块,交换式则需要操作整个进程。 对两个优点进行结合产生的虚拟内存技术将覆盖式和交换式的优点结合,可以每次交换部分页,将进程分为多个大小相等的页,将需要加载的页覆盖到未被使用的页空间中,通过这种方式就可以实现每个进程好像拥有所有内存的假象了,这种技术被称为虚拟内存技术。 支撑虚拟内存技术存在的两个原理要想实现虚拟内存技术,两个原理是必不可少的,那就是时间局部性和空间局部性。 时间局部性是指当程序的某一块被执行后,在不久的将来此块还会被执行 空间局部性是指当程序的某一块被执行后,那么其周围的其余部分也将被执行 通过这两个原理,将程序划分为多部分就可以保证不会出现每部分只被执行一次后就被换出 具体的实现机制-虚拟页式内存管理基于虚拟内存技术实现的方式是虚拟页式内存管理,首先是内存被划分为1k大小的块,虚拟内存也被划分为1k大小的块,给进程分配空间时按照虚拟内存的地址进行分配,然后通过mmu硬件的支持将虚拟地址转换为物理内存地址,如果对应的物理页不存在就会引起缺页中断,如果内存空间不足则会引起置换操作,具体要置换的页由各种置换算法决定。 |
|