虚拟内存
1、计算机的存储机制
2、虚拟内存的出现
在没有虚拟内存的时候,那个时候的计算机,程序指令所访问的内存地址就是物理内存地址. 也就是不得不把程序的全部装进内存当中,然后运行。物理内存其实就是插在计算机主板内存槽上的实际物理内存,CPU可以直接进行寻址.。物理内存的容量是固定的,但是寻址空间却取决于cpu地址线条数,如32位机,则寻址空间为2^32 = 4G,所以最大支只持4G的寻址空间,即使插了8G的内存条也只能使用4G内存。
直接使用物理地址进行寻址会出现以下几个问题。
- 内存空间利用率的问题:各个进程对内存的使用会导致内存碎片化,当要用malloc分配一块很大的内存空间时,可能会出现虽然有足够多的空闲物理内存,却没有足够大的连续空闲内存这种情况,东一块西一块的内存碎片就被浪费掉了。
- 读写内存的安全性问题:物理内存本身是不限制访问的,任何地址都可以读写,而现代操作系统需要实现不同的页面具有不同的访问权限,例如只读的数据等等。
- 进程间的安全问题:各个进程之间没有独立的地址空间,一个进程由于执行错误指令或是恶意代码都可以直接修改其它进程的数据,甚至修改内核地址空间的数据,这是操作系统所不愿看到的。
- 内存读写的效率问题:当多个进程同时运行,需要分配给进程的内存总和大于实际可用的物理内存时,需要将其他程序暂时拷贝到硬盘当中,然后将新的程序装入内存运行。由于大量的数据频繁装入装出,内存的使用效率会非常低。
3、进程虚拟地址空间的区域划分
Linux系统会给当前每一个进程分配一个2^32位大小(4G)的一块空间,这块空间就叫做进程的虚拟地址空间。
IBM公司关于虚拟的解释:
它存在,你看得见,它是物理的
它存在,你看不见,它是透明的
它不存在,你看得见,它是虚拟的
它不存在,你看不见,它被删除