物理内存和虚拟内存
物理内存
- 物理内存时有限的,当有多个进程要执行的时候,假设都要给4G内存,很显然你内存小一点,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内存的操作是很没效率的
- 由于指令都是直接访问物理内存的,那么我这个进程就可以修改其他进程的数据,甚至会修改内核地址空间的数据,这是我们不想看到的
虚拟内存:
- 通过 虚拟内存 可以让程序可以拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。
- 使用虚拟寻址,CPU需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有一个被称为 内存管理单元(Memory Management Unit, MMU)的硬件。MMU 需要借助存放在内存中的页表来动态翻译虚拟地址,该页表由操作系统管理。
虚拟地址、物理地址
首先,我们打开一个进程发一个指令,会生成一个虚拟地址,该虚拟地址中有虚拟页号和页偏移量,由虚拟页号和MMU中的页表寄存器(表示页表在主存当中的起始位置)做一个偏移,就可以找到与这个虚页号对应的页表项在主存当中的物理地址,如果有效位为1的话,表示当前主存有这个页,那么我们就将这个页表项取出来,也就是知道了物理页号,再用这个物理页号与虚拟地址中的页内偏移相拼接,这样就得到物理地址。这样实现了虚拟地址向物理地址转化的过程。
如果有效位为0的话,表示要的页不在主存中,这个时候产生一个缺页异常,请求操作系统将所需要页调换进主存。之后返回产生缺页异常的进程,再次进行虚实地址的转化。