交换产生的问题:
内存和磁盘的交换产生碎片
地址空间增长困难
空间增长效率低下
空间增长存在“天花板”限制
解决办法
碎片产生的原因:每个程序大小不同
解决办法:将空间按照某种规定大小进行分配。只要将虚拟内存与物理内存都分成大小一样的部分,我们称为页。然后按页分配,即可以克服碎片问题。
解决空间增长受限的原因:一个程序需要完全加载到内存中才可以运行
解决办法:使程序无需全部加载就可以运行。
- 用分页的思想处理:将当前需要的页面放在内存中,暂时不用的页面放在磁盘上。
分页内存管理
核心:将虚拟内存空间和物理内存空间划分为大小相同的页面,并以页面作为内存空间分配的最小单位
分析:这样分配之后,物理空间是页面的整数倍,并且空间分配以页面为单位,将不会产生外部碎片。
分页系统下:一个程序发出的虚拟地址由 页面号和页内偏移值 组成。
页面号 | 页内偏移地址 |
---|---|
X | Y |
页面寻址的方法克服了交换系统所有的缺陷
地址翻译
分页系统的核心:页面的翻译,即从虚拟页面到物理页面的映射。由内存管理单元(MMU)完成。
翻译过程:MMU接收由CPU发出的虚拟地址,将其翻译为物理地址后发送给内存。内存单元按照物理地址进行相应访问后读出或写入相关数据。
对于每个程序,MMU都为其保存一个页表,该表里存放的是虚拟页面到物理页面的映射。
页表
页表的根本功能是提供虚拟页面到物理页面的映射。
MMU依赖页表进行一切与页面有关的管理活动。
这些活动包括判断某一页面号是否在内存里,页面是否受到保护,页面是否有非法空间等。
页表的功能除了提供虚拟到物理页的映射外,还记录以下相关信息。
缓存禁止 | 访问位 | 修改位 | 保护标识区 | 在内存否 | 物理页面号 |
---|---|---|---|---|---|
缓存禁止:指示页面是否允许放在缓存里
访问位记录:该页面是否被访问过
修改位:该页面自从加载到物理内存后是否被修改过
保护标识位:记录该页的受保护情况,如是否允许读写执行等。
在内存否:记录该虚拟页面是否已经在物理内存里
物理页面号:该虚拟页面对应的物理页面(如果该虚拟页面已经映射到物理内存的话)
多级页表
多级页表根据存放的内容分为:顶级页表,一级页表、二级页表等。
顶级页表中存放一级页表的信息,一级页表存放二级页表的信息。最后一级页表中存放的才是虚拟页面到物理页面的映射。程序运行时,顶级页表常驻内存,次级页表按需要决定是否放在物理内存。
假如:使用两层页表,虚拟地址的前10位可作为顶级页表的索引,中间10位可作为次级页表索引,最后12位可作为页内偏移值。
CPU发出一个虚拟地址时,将虚拟地址一分为三。
用最前面的10位值找到顶级页表对应记录,得到次级页表。
用中间10位值作为索引在刚才获得的次级页表中找到对应的记录,得到对应的物理页面号。
然后再物理页面号与页内偏移值合并起来获得最后的物理地址。
多级页表的缺点:因为内存访问要经过好多次访问,所以降低了系统的速度。
由于产生缺页中断需要更换页面
分页系统下,一个程序的所有页面不一定都在内存中,这样,在执行的过程中就可能发生页面不在内存的情况。
如果访问的页面不存在,则系统发生却也中断。缺页中断服务程序将负责把位于磁盘上的数据加载到物理内存上。如果物理内存还有空闲页面,直接使用空闲的页面。