物理内存其实就是RAM。RAM和ROM的区别说一下,因为RAM的读取速度要比ROM快很多,但是也贵很多,所以RAM也被放在离CPU更近的地方。如果我们的程序都存放在ROM里面,每次读取数据和指令都得跑到磁盘上去取,速度就会很慢,也造成了CPU性能的浪费。所以说RAM的大小关乎程序运行的性能。
但是,假设我们运行一个程序,就把这个程序所以资源全部装载到内存,会遇到这些问题:
(1)进程空间不隔离,访问内存即直接访问物理磁盘,对进程的修改就很有可能造成磁盘数据的破坏
(2)内存使用效率低。在A和B都运行的情况下,如果用户又运行了程序C,而程序C需要20M大小的内存才能运行,而此时系统只剩下8M的空间可供使用,所以此时系统必须在已运行的程序中选择一个将该程序的数据暂时拷贝到硬盘上,释放出部分空间来供程序C使用,然后再将程序C的数据全部装入内存中运行。可以想象得到,在这个过程中,有大量的数据在装入装出,导致效率十分低下。
虚拟就把在将从内存找到磁盘的地址的过程增加了一步,这一步使得分配给程序的地址不能直接找到物理地址,而是经过操作系统的映射才能找到物理内存上,只要操作系统处理好这种映射关系,最后在磁盘上的数据就能相互独立,互不干扰。
分段
实现的是虚拟地址上某一段的能够和物理地址一一对应。这样程序就只要关心虚拟地址,而不关心到底分配到了哪一块物理地址上去。
分页
利用分段,解决了第一个和第三个问题,但是还是没解决程序一次性装载的问题,分页就是解决办法。
假设系统是32位的,那么系统的寻址范围就是32位,假设给虚拟地址空间分页,每页的大小是4k(字节),那么可以分到2^20页,采用一级页表的话,一个页表里面可以存放2^10个格子,每个格子的大小为4字节,这样的话每个页表的大小为4K字节,一共需要2^10个页表来指向这4G的空间,最后还需要一个页目录表,来指向这1024个页表。算下来,每个程序在执行的时候都要分配一个4M大小的空间来存放页表。
书上说用到二级页表可以节省空间,但是如何节省并不明确。从你最终要存储的表项来看,无论如何你存储的表项是不会少的,而且多级页表还会增加存储开销。其实是这样的,二级表只是从进程的角度来看,为进程节省了页表项(其实所有的页表存储空间增大了)。二级模式通过只为进程实际使用的那些虚拟内存区请求页表来减少页表,就是进程未使用的页暂时可以不用为其建立页表,因为如果使用一级页表的话,你就必须为所有的4G范围内分配页表,不能细分。每个活动进程必须有一个分配给它的页目录,不过没必要马上为进程的所有页表都分配ram,只有在进程实际需要一个页表时才给该页表分配ram,这样就提高了效率。