现代操作系统采用“分层储存器体系“ 计算机拥有若干兆快速、昂贵且易失性的高速缓存,价格与速度适中的同易失性的内存以及不易失访问速度慢的大容量的磁盘存储
操作系统中分层存储器体系的部分称为存储管理器。任务是记录哪些内存正在使用,哪些可分配,在进程需要时分配内存,进程使用完毕释放内存。
1.地址空间
早期的操作系统是直接将物理地址直接暴露给进程,但是缺陷很多。为了要保证多个应用程序同时处于内存中而彼此独立,提出地址空间,可以解决保护和重定位定位两大问题。
地址空间是一个进程用来寻址内存的一套地址集合,每个进程都有自己的地址空间,并且与其它地址空间相互独立,除了某些特殊情况下需要共享地址空间外。
1.1基址寄存器和界限寄存器
早期的物理地址与地址空间之间的映射法——利用基址寄存器和界限寄存器,进程运行时,把程序起始物理地址和程序长度分别放入基址寄存器和界限寄存器,每次CPU访问某地址时在把指令发送到总线前会先把进程发出的地址加上基址寄存器的值,即实际物理地址发送到总线。同时检查进程地址是否超过界限寄存器值。若超过,则终止访问。此法缺点是每次访问都要计算一次加法,效率低。
1.2交换技术
由于内存有限,所有进程所需的RAM远大于实际内存,从而需要处理内存超载,有两种方法1.交换技术2.虚拟内存技术。
交换技术即进程运行一段时间后,把它存回磁盘,使它不占用内存。
交换的时候会在内存区产生很多空闲区即空洞,此时可使用内存紧缩技术,速度极慢,一般不采用
很多进程在执行过程中会动态分配内存,这样可以为进程分配预留的空间。而预留的空间可以在进程存回磁盘时可以不交换以提高效率。
2.空闲内存管理
2.1 位图法
内存划分为很多分配单元,每个分配单元代应位图中的一个位,
缺点:存储管理器在寻找空闲地址时就要扫描位图(一块固定的内存),找到k个连续为0的串。(假设0位代表空闲)比较耗时。
2.2 链表法
用一个链表记录已分配的内存段和空闲内存段。链表中的节点要么包含进程要么包含两个进程之间的空闲区。每个节点的内容:空闲区或内存区的标识,起始地址和长度,指向上一节点和下一节点的指针。一般来讲,是按照地址顺序在链表中存放进程和空闲区的。
假设存储管理器已知要创建的进程需要的存储空间大小。
2.21 首次适配法,沿着段链表搜索,找到第一个大小符合条件的节点,分配之。
此时空闲区会分裂成两部分,即多产生一个节点,一部分是进程节点,一部分是空闲区节点。
优点:速度快,搜索节点最少
2.22 下次适配法
沿着链表搜索,找到第一个合适的链表节点,记录之,分配给进程空间,下次有进程在需要分配时,就从此处作为搜寻起点。
2.23 最佳适配法
搜索链表所有节点,找到内存大小最接近的节点,
缺点:会产生大量的小空闲区
当为空闲区和进程区各自维护一个链表这样速度都可以提高,但是会增加复杂度和内存释放速度变慢,因为每次释放进程都要先删除进程链表节点,然后插入空闲链表。
3.虚拟内存
基本思想:每个程序拥有自己的地址空间,这个空间分为多个块,每个块称作一个页面,每个页有连续的地址范围。这些页被映射到物理地址。不是所有的页都必须在内存中程序才能执行。当程序引用到一部分已经在物理内存中的地址空间时,立刻执行映射并访问,否则操作系统负责将缺失的部分装入物理内存再执行。许多程序的片段同时保存在内存中。当一个进程在将它的一部分装入内存中,CPU可以给其他进程使用。
执行映射的工作由内存管理空间完成。页表给出虚拟地址和物理内存地址之间的映射关系,可以将虚拟页表看做一个函数,自变量是虚拟页号,因变量是实际物理地址。
页面项的结构:页框号(实际物理地址),保护位:允许什么类型的访问(读、写、执行权限),修改位:记录读入内存后有没有被修改过、访问位:帮助页面置换算法的使用。
高速缓存禁止位:禁止该页面被高速缓存。对于映射到设备寄存器的页面有用。
3.1 加速分页过程
1.加快分页方法 利用一个转换检测缓冲区(TLB),包含少量表项。表项内容:有效位、修改位、保护位、页框号和虚拟页面号、MMU在收到虚拟地址页面号先到TLB中寻找,若存在则跳过页表直接读出页框号,若不存在,去页表寻找,找到后更新TLB。
2.针对大内存的页表
法1:多级页表
假设有一个32位的虚拟地址,前十位PT1域标识顶级页表,中间十位PT2域标记,后12位为偏移量。由于偏移量是12位,故每个页表大小为4KB。共2^20个页表。
当一个32位虚拟地址送到MMU时,MMU首先提取PT1的十位,以此索引到4MB的虚拟内存空间,即二级页表的地址,然后提取PT2域,在二级页表中以此十位索引到实际的页框值。然后将页框值加上偏移量就得到·实际物理内存地址。这样就避免了将全部2^32个页表项都要储存的处境。
法2;倒排页表法
但实际使用64位址的时候,由于页表项太多,多级制也行不通。在实际内存中,每一个页框一个表项。而不是每一个虚拟页面一个表项。这样即使虚拟页面再多,页表项数目也只与实际内存页框数相关。但此时内存访问时不能以虚拟页面作为参数直接在页表中找到地址了。而是搜索整个页表项。此时使用TLB来加速。让TLB记录所有频繁使用的页面。当TLB失效时再搜索散列表。以虚拟地址来散列。使具有相同散列值的虚拟页面;链接在一起。