虚拟内存是为了解决多个程序运行时内存不足的问题而出现的技术。
虚拟内存可以将外存当做内存来使用,它使得程序运行时感觉自己运行在一个连续的地址空间,而实际物理地址却不一定是连续的。
大多数操作系统都使用了虚拟内存,如window的虚拟内存和linux的交换空间。
在编译期间,为变量分配一个虚拟地址;在运行期间,MMU(内存管理单元,用于获取虚拟地址对应的物理地址)通过存储在内存中的页表获取这个变量虚拟地址对应的实际内存物理地址,但是这个时候该变量还未分配物理地址,所以MMU查不到它对应的物理地址是什么,此时发生了缺页中断。需要为它在内存上分配一块物理地址,并将该地址写回页表供以后使用。
虚拟内存被分割成大小固定的页,称为虚拟页(VP),物理内存也被分成大小固定的页,叫物理页(PP),虚拟页的大小和物理页的大小相同。因此,虚拟内存包括未分配的、已分配未缓存到内存的、已分配缓存到内存的。
发生缺页中断时,若物理内存空间满了,需要将物理空间中的数据和磁盘对换来腾出空间,称为页面置换。
页面置换算法:
- 最佳替换(OPT,Optimal replacement algorithm)
是一种理论上的算法,将置换未来最长时间不会访问到的页面。实际中并不会知道未来最长不会被访问到的页面是什么。 - 最近最久未使用(LRU,Least Recently Used)
将置换最近最久未使用的页面,维护一个访问链表,新访问的页面添加到链表的头部,那么链表的尾部就是最近最久未使用的页面。但是每次访问都需要更新链表,维护的代价较高。 - 最近未使用(N