地址重定位
地址重地位是指将用户程序目标代码中相对于0地址开始的所有指令、数据地址变换成指令、数据所在的主存物理地址。有以下两种方法
静态重定位
操作系统将目标代码加载到主存中时,将目标代码所有地址域改为“原地址+目标代码所在主存起始地址”
动态重定位
在执行访存指令时将“原地址+目标代码所在主存起始地址”后进行访问
MMU(内存管理单元)
当每条指令运行时,MMU将逻辑地址(虚拟地址)和寄存器中的基址相加转化为物理地址,这个过也被称为地址转换
分段
程序由若干段组成如代码段、数据段、栈段等。代码段是程序指令形成的段,数据段中存放程序使用的数据,栈段用来实现函数调用。
分段机制
程序分段以后,就不会作为一个整体载入内存,而应该分别处理程序中的各个段,此时程序中多个段会分别载入内存,这是就需要记录每个段的基址,多个基址就会形成一个段表
地址转换
采用了分段机制后,程序中的逻辑地址就会变成“段号:段内偏移”这样的基本格式。在进行地址转换时,首先就需要找到段号信息,利用段号信息找到基址,将基址与段表起始地址相加得到物理地址。
分页
机制
分页机制首先将物理内存分割成大小相等的页框,然后再将代码段等也分割成同样大小的页,最后将所有页都映射到页框上,完成物理内存页框的使用。
地址转换
页表中存储了页号和页框的映射表,通过页号和偏移地址找到对应的页框从而完成逻辑地址对物理地址的映射
快表(TLB)
首先要引入多级页表的概念,多级页表就是将页表像书一样进行多级目录从而加快查找页表的速度
而快表就是利用硬件电路来解决多级页表造成的时间开销,快表中会缓存那些常用的逻辑页映射关系,此时地址转换的过程就是:先查快表,如果命中就很快获得页框号,如果没有,则查找页目录表、查找页表、找到物理页框号并更新快表。从而达到降低时间开销的目的
段页式内存管理
机制
首先将程序分成多个段,然后将中间结构分割出多个区和每个段建立映射,完成分段,将中间结构分割成页并将这些页放到物理内存的页框中,并建立这个页和页框的映射完成分页
这个中间结构能分割成区和页(也就是一段地址区域),所以它就是一个地址空间,但这个地址空间的地址没有对应存储单元。总的来说这个结构是一个看起来和物理内存一样但是没存储单元的虚拟内存,也正是虚拟内存这个概念将分段和分页有机地结合在一起
虚拟内存
虚拟内存就是操作系统提高给进程的一个规整的地址空间,用户可以随意访问这个空间中的任何地址。但由于实际物理内存可能比虚拟内存小,所以虚拟内存不可能全部映射到物理内存上,这中间就会产生内存换入换出的问题
换入换出
换入
首先在段页式机制地址转换过程中,要根据段表从逻辑地址算出虚拟地址,根据虚拟地址和页表获得物理地址,查找页表后没找到对应的物理页,这是因为这一页虚拟内存区域还没有和物理内存建立关联,此时没有映射所以才要换入
换入的核心就是在缺少虚拟页时请求调页。此时MMU会向CPU发出缺页中断,在这个中断处理中,操作系统会去磁盘中找到这个虚拟页,与此同时寻找一个空闲的物理内存页框,将这个虚拟页和物理页框建立关联,再更新页表来记录这个映射关系。中断处理返回后继续执行被中断的指令。
换出
如果找到空闲的物理内存页框就直接读入虚拟页,否则就要从现有已映射的物理内存页框中换出一页,这里这引出了我们页面换出算法
页面换出算法
先进先出(FIFO)
选择换出最先进入的页面,该算法会将那些经常被访问的页面换出导致缺页率提高
最优置换(OPT)
被换出的页面将是最长时间内不再被访问,通常可以保证最低的缺页率,但是只存在理论可能,因为无法知道一个页面多长时间不再被访问
最近最少使用(LRU)
我们不知道未来的页面情况,但是可以知道过去的页面情况,LRU将会把最近最久未使用的页面换出
通常我们使用页面栈来实现LRU,每次访问某个虚拟页面时,就将这个页面浮动到栈顶,而被压在栈底的页面就是最近最少使用的,采用页面栈之后,每次虚拟页面访问都要调整页面在栈中的位置,如果出现了缺页,就选择位于栈底的那个页面进行换出
clock算法(二次机会算法)
将所有页框形成环形链表,用R一位二进制记录时间戳,1代表被访问了、0代表未被访问。当产生缺页时,从上一次缺页处理停留的位置开始扫描,如果R为1则置为0,如果R为0则换出该页面。
系统颠簸
如果系统频繁发生缺页就会导致频繁的换入换出,从而导致CPU*等待时间过长利用率下降,这个现象就被称为系统颠簸
解决
通过估计系统当前进程需要覆盖的局部是多大,操作系统保证分配到该进程的物理页框数量大于其局部即可,工作集模型就是用来解决这个问题的数学方法,其核心就是统计进程在最近一个历史窗口中访问了哪些页,这些页的集合就被称为工作集WS,通过设定参数来确定恰好的工作集大小