虚拟地址空间和物理地址空间
物理地址空间是实实在在存在于计算机中,并且对于每一台计算机来说只有一个。
虚拟地址空间是指虚拟的、人们想象出来的地址空间,它实际并不存在。每个进程都有自己独立的虚拟空间,而且每个进程只能访问自己的地址空间。(做到了进程的隔离)
它出现的原因
- 如何将计算机上有限的物理内存分配给多个程序使用。解决的问题:
-地址空间不隔离(可能会不小心修改了其他程序的内存数据,导致其他程序运行失败) - 内存使用效率低(大量的数据换入换出)
- 程序的运行地址不确定(需要重定位)
解决方法:
把程序给出的地址看作一种虚拟地址,然后通过某些映射方式。将虚拟地址转换为实际的物理地址。
- 只要能妥善额额控制好虚拟地址到物理地址的映射过程,就可以保证任意一个程序所能够访问的物理内存区域和另一个程序相互不重叠,达到地址空间隔离的效果。
分段
把一段与程序所需要的内存空间大小的虚拟空间映射到某个地址空间。
- 先假设虚拟空间的地址从0x00000000到0x00A00000,物理地址是从0x00100000到0x00B00000的一块空间,然后进行一一映射,虚拟空间的每个字节相对应于物理空间中的每个字节。
- 映射过程由软件(比如操作系统)来设置,实际的地址转换由硬件完成。
- 解决了地址隔离问题
- 解决了重定位的问题(毕竟使用虚拟地址空间进行编程就可以了,不需要考虑物理地址的变化)
- 但是使用效率没有解决。内存不足时,被换入换出的是整个程序,会造成大量的磁盘访问操作,从而影响速度。
分页
把地址空间人为地等分成固定大小的页,每一页的大小由硬件决定,或硬件支持多种大小的页,由操作系统决定页的大小。
- 把进程的虚拟地址空间按页分割,把常用的数据和代码装载到内存中,把不常用的保存在磁盘里,当需要用的时候再把它从磁盘中取出来。
- 虚拟页:虚拟空间的页
- 物理页:物理内存中的页
- 磁盘页:磁盘中的页
- 虚拟空间的有些页可以被映射到同一个物理页,从而实现内存共享。
- 进程需要用到不在内存中的页时,硬件会读取到 页错误 ,然后操作系统接管进程,把对应的页从磁盘中读出来并装入内存,然后将装入内存的这个页和对应的虚拟页建立映射关系。
- 每个页可以设置权限属性,并且只有操作系统有权修改这些属性,因此操作系统可以保护自己和保护进程。