目录
在早期的计算机中,是没有虚拟内存的概念的。我们要运行一个程序,会把程序全部装入内存,然后运行。
当运行多个程序时,经常会出现以下问题
一.为什么要有虚拟内存
1,进程地址空间不隔离,没有权限保护。
由于程序都是直接访问物理内存,所以一个进程可以修改其他进程的内存数据,
甚至修改内核地址空间中的数据。
2,内存使用效率低
当内存空间不足时,要将其他程序暂时拷贝到硬盘,然后将新的程序装入内存运行。
由于大量的数据装入装出,内存使用效率会十分低下。
3,程序运行的地址不确定
因为内存地址是随机分配的,所以程序运行的地址也是不确定的。
二.虚拟地址和物理地址
对于32位系统,寻址指针为4字节,对应的虚拟地址空间为0-2^32,即0-4G。
对于64位系统,寻址指针为8字节,对应的虚拟地址空间为0-2^64,即0-16G。
要注意的是,这个地址空间是虚拟的,并非实际存在的。
Linux内核把虚拟地址空间分为两部分:用户进程空间,内核进程空间。
如下入所示:
在缓存原理中,换入/换出的数据以块为最小单位。在内存管理时,页是地址空间的最小单位。
虚拟地址空间划分为多个固定大小的虚拟页(VP),物理地址空间(DRAM内存)划分为多个固定大小的物理页(PP),
虚拟页和物理页的大小是一样的,通常为4KB。
虚拟页和物理页存在着以下关系:
虚拟页和磁盘文件映射,然后缓存到物理页。
根据是否映射,是否缓存,可以将虚拟页的状态分为以下三种:
1,未映射的页
即虚拟页没有映射到磁盘文件
2,未缓存的页
虚拟页映射到了磁盘文件,但是没有缓存到物理页,也就是内存上。
3,缓存的页
虚拟页映射到了磁盘文件,并且缓存到物理页