虚拟存储器

虚拟存储器

3.1概述

对一个程序来说,程序、数据和堆栈的总大小总是超过实际物理内存的大小,因此操作系统希望把当前使用的部分内容放到物理内存,把其他未使用的内容放到下一级存储器。

对于32位处理器来说,其地址空间0-0xFFFF_FFFF,4GB,其中一个地址就称为虚拟地址。与之相对的是物理存储器,一般物理存储器(内存)的容量不能超过处理器最大可以寻址空间。

虚拟地址和实际物理地址之间需要内存管理单元MMU进行地址转换。

采用虚拟地址可由操作系统负责调度,将实际物理地址动态地分配给各个程序。

3.2 地址转换

最常用的是基于分页的虚拟存储器。

虚拟地址空间划分以页为单位,典型页大小为4KB,相应的物理地址空间也以同样大小划分,称为frame。程序开始运行时,以页为单位将当前需要的内容从硬盘中搬移到物理内存,从而使处理器能够运行比物理内存更大的程序。

因为frame和page大小相等,因此虚拟地址和实际地址进行转换时只需要转换页码,不需要关注页内偏移地址。

若虚拟地址找不到对应的物理地址,则产生page fault异常送给处理器,由异常处理程序进行处理。

单级页表

为了减少page fault发生的频率,采用一张表格来存储虚拟地址到物理地址的对应关系,称为page table,页表。一般将页表放在物理内存中,每次操作系统将 一个程序调入物理内存中执行时都将页表寄存器设置好。当使用页表寄存器和虚拟地址进行寻址时,若找到的对应表项valid为1,则说明这个虚拟地址和物理内存已经完成了映射,可以找到数据。若valid为0,则说明发生page fault,需要操作系统从下一级寄存器将所需内容搬移出来。

将页表放在物理内存中,每次要得到一个虚拟地址对应的数据都要对物理内存访问两次。第一次访问页表获得物理地址,第二次使用物理地址访问物理内存才能得到需要的数据。这种方法效率较低。

一般一个4GB的虚拟空间,只有少部分获得利用,大部分页表内容都是空的,造成页表利用效率极低。

多级页表

多级页表可以减少页表对物理存储空间的占用,并易于用硬件实现。

多级页表将一个单级页表划分为若干个子页表,处理器在执行进程时根据实际需求搬移子页表,而不是整个页表。这样就不再需要占用大片连续的物理内存空间,子页表可以存放在物理内存中不连续的位置,提高物理内存利用效率。但如此做,也需要增加一个二级页表,用来记录各个子页表在物理内存中的位置。

通过多级页表获取一个虚拟地址对应的数据,首先需要访问第一级页表获得第二级页表的位置,然后访问第二级页表才能得到虚拟地址对应的物理地址,再根据物理地址获得相应数据。

3.3 程序保护

为了对不同进程之间加以保护,不允许其互相修改自己的内容,操作系统要具有最高控制权。因为操作系统也是程序,也需要访问存储器内容,那必然需要经过页表,因此可以设置操作系统和用户进程对不同页的访问权限。

3.4 加入TLB和Cache

TLB的设计

因为采用两级页表的话需要访问两次物理内存才能获得相应物理地址,但物理内存的运行速度相对于处理器来说不在同一量级,因此可以借鉴Cache的设计理念,用一个速度比较快的缓存,将页表中最近使用的PTE缓存下来,这种缓存称为TLB。

TLB不同于Cache,页表只具有时间相关性,而不具备空间相关性。

一般为了减少TLB缺失(miss)的频率,会采用全相连的方式设计TLB,但这样也导致TLB容量不能太大。现代处理器中很多采用两级TLB,第一级采用哈佛结构,分为指令TLB,数据TLB,采用全相连结构。第二级数据和指令共享,采用组相连结构。

posted @   骑猪上树的少年  阅读(255)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
回到顶部

目录导航

点击右上角即可分享
微信分享提示