虚拟内存
不同的进程并发的运行时,需要占用实际的内存(物理内存)资源,而实际的物理内存的资源往往是小于计算机打开的进程同时运行所需要的物理内存,这就是通过虚拟内存实现的 。
所有进程是共享同一个物理内存的,但是通过虚拟内存它所看到的是自己独占了当前系统的内存。这里独占的就是虚拟内存,他并不是独占了当前物理内存。事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,实际上并不立即就把虚拟内存对应位置的程序数据和代码拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好,等到运行到对应的程序时,发现不在物理内存中才会通过缺页异常,来拷贝数据。每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。在进程切换时,其他进程的数据又会有可能覆盖当前在物理内存的数据。
虚拟内存的好处
- 扩大地址空间;
- 内存保护:每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改;
- 公平内存分配。采用了虚存之后,每个进程都相当于有同样大小的虚存空间;
- 当进程通信时,可采用虚存共享的方式实现;
- 当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存;
- 虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。在内存中可以保留多个进程,系统并发度提高;
- 在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片 。
虚拟内存的代价
- 虚存的管理需要建立很多数据结构,这些数据结构要占用额外的内存;
- 虚拟地址到物理地址的转换,增加了指令的执行时间
- 页面的换入换出需要磁盘I/O,这是很耗时的,但这也是迫不得已;
- 如果一页中只有一部分数据,会浪费内存