【操作系统笔记1】内存层次结构之 物理存储空间--逻辑存储空间

版权声明:QQ: 1063385677 Copyright ©2019 CielleeX 本文地址: https://blog.csdn.net/Ciellee/article/details/89435849

cpu <-- Cache(L1缓存,L2缓存) <-- 主存(掉电丢失)<-- 硬盘(虚拟内存)(掉电不丢失)

操作系统在内存管理方面需要重点完成的目标:
抽象:逻辑地址空间
保护:独立地址空间
共享:访问相同内存
虚拟化:获得更多的地址空间

  1. 物理地址空间:
    硬件支持的地址空间,实际硬盘地址

  2. 逻辑地址空间:
    程序拥有的内存范围(每个程序逻辑地址都是从0x00开始的,和实际物理内存存在一定的偏移,由MMU控制映射关系)
    整个过程为,CPU需要访问程序的一个地址,MMU根据映射表查询对应的物理地址,如果有就直接把物理地址告诉CPU;如果没有,则到内存中去查找,找到后,将主存内的内容通过总线给到CPU。

内存碎片问题:
①内存空间不能够再被利用
②外部碎片: 在分配单元间的未使用内存
③内部碎片:在分配单元中的使用内存

内存分配方法:
首次适配First fit:(简单,容易产生更大的空闲块;缺点:容易产生外部碎片,不确定性)
最优适配算法Best fit:查找一个更加适配分配的空闲块,避免分割大空闲块,减少外部碎片产生的尺寸
最差适配

内存分段寻址方案
段访问机制: 二维,一个段一个内存块,段表由操作系统来建立,不同段的大小不一致
访问地址需要知道 段号 + 段内偏移

内存分页寻址方案
页:划分物理内存为固定大小的帧,大小是2的幂 (物理内存的页frames 和 逻辑内存的页pages 大小 要一致,由MMU控制转换)

帧(Frame): 物理内存被分割为大小相等的帧,物理地址二元组(f,o) = 2^n(帧大小) x f (帧号) + o(帧内偏移)
页(Pages): 逻辑地址空间被划分为大小相等的页,逻辑地址二元组(p,o) = 2^n(页大小) x p(页号) + o(页内偏移)
Pages Table:由操作系统建立,保存了逻辑地址 – 物理地址 之间的映射关系,从而可以由页转换为帧。
注意: 页是连续的虚拟内存,帧不一定是连续的物理内存,不是所有的页都有对一个的帧,如果CPU访问了不存在对应帧的页,则会产生一个异常

页表结构:
每个运行的程序都有一个页表
PTBR: 页表基地址寄存器
resident bit : 驻留位,1说明该页存在对应的帧,0说明不存在对应的帧
举例:比如16bit地址的系统,具有32k实际物理内存,每页1024byte,16bit 可以访问的虚拟空间为 64kB

希望空间越小越好,希望速度越快越好
分页机制的性能问题:页表可能占用很大,每个程序需要独立的页表,当页表很大时,不可能放入CPU存储中,只能放在内存中,因此CPU查找地址时,需要首先访问内存中的页表,再访问内存地址,需要访问两次内存,时间开销比较大。

  1. 基于逻辑地址页表的查找方案
    页表的空间和时间问题:
    TLB(Translation Look-aside Buffer): 位于CPU内部,缓存近期访问的页帧转换表项
    CPU 查找地址时,如果TLB命中,物理页号可以很快被获取;如果TLB未被命中,对应的表项被更新到TLB中(该动作可能时CPU完成,也可能时操作系统完成)。

    二级页表: p1(一级页表) + p2(二级页表) + o(页表内偏移)
    通过这种方式,以时间来换空间
    从时间上,开销更大,CPU查询3次才能获取到地址,
    从空间上,这种方式,因为可以将P1总驻留位为0的P2二级表搬出主存,保存再内存中,节省空间

    多级页表: p1(一级页表) + p2(二级页表)+ p3(三级页表) + o(页表内偏移)

  2. 基于物理地址页帧号的查找方案
    反向查找: 通过实际物理帧号 来 查找对应的逻辑地址页号,这样可以确保页表大小可以只与物理大小相关,而不与逻辑大小相关,节省内存开销。
    每一个帧和一个寄存器关联,寄存器包括如下信息:
    Residence bit: 此帧是否被占用
    Occupier:对应的页号
    Protection bit:保护位

    举例:
    物理内存实际大小为 4096*4096 = 4K * 4K = 16M
    页面大小: 4096Byte = 4K
    页帧数:4096 = 4K
    页寄存器使用的空间(假设8byte/register): 8 * 4096 = 32kb
    页寄存器带来的额外开销: 32k/16M = 0.2% (大概)
    虚拟内存大小: 任意

  3. 基于哈希(hash)查找的方案
    哈希函数:输入是逻辑page num ,进程标志PID,输出物理frame num
    对页号来做哈希计算,在CPU中只保存物理页帧号,相对传统页表来说占用空间小,付出的代价是哈希计算的时间开销(需要高速和高效的哈希计算函数–硬件实现,以及有效的解决冲突的处理机制–软件配合)

猜你喜欢

转载自blog.csdn.net/Ciellee/article/details/89435849