操作系统(三):物理内存管理

操作系统(三):物理内存管理

1计算机体系结构

在这里插入图片描述

2内存层次结构

在这里插入图片描述
1.寄存器、cache
速度快,容量小,操作系统无法直接管理。放置数据指令有限
2.主存(物理内存)
操作系统中要运行代码,容量大,但是速度慢于CPU。
3.硬盘
当主存代码过多时或需要永久保存的内存,有些代码需要放到硬盘中(通过操作系统控制)。

3操作系统任务

在这里插入图片描述
操作系统作为软件,需要和硬件高度配合,了解内存架构、MMU(内存管理单元)硬件组件负责处理CPU的内存访问请求。
1.抽象:不用考虑物理内存及外设位置,只考虑一段连续的地址空间----逻辑(虚拟)地址空间
2.保护:内存中存在多个应用程序,当进程之间访问时,需要存在保护机制隔离进程之间地址空间
3.共享:进程之间安全可靠的数据传递
4.虚拟化:内存不够时,把暂时不需要的访问的数据临时放到硬盘中。

4地址空间与地址空间生成

4.1 物理地址与逻辑地址

1.物理地址空间:与硬件直接对应,管理控制由硬件完成。
2.逻辑地址空间:一个运行程序所拥有的内存范围。

4.2逻辑地址生成

  1. 对于一段函数代码,函数名就是一个地址。
    2.通过编译,所生成语言代码依然用符号代表变量和函数的名字。
    3.通过汇编器后,会生成汇编语言,汇编语言的起始地址都是从0开始的,将变量函数符号名转为相对地址,这个地址空间是从0开始连续地址空间
    4.函数和函数之间通过链接,完成将多个.o程序变为单一执行程序:.exe文件。这个程序就是可以执行,存在硬盘内存中的程序。这个程序地址已经进行了全局分布。
    5.执行程序会通过载入放到内存中运行,完成逻辑地址的分配,是应用程序可以运行。此时相对执行程序到逻辑地址会有一个偏移,最后实现程序运行。

在这里插入图片描述

4.2逻辑地址到物理地址的映射

4.2.1映射方法

在这里插入图片描述

应用程序访问某条指令时,该指令如何对应到具体的物理地址:对于一条特定指令,他会有自己的逻辑地址,ALU要运行该指令时,要将该指令从内存空间中取出来,逻辑地址和物理地址之间的映射关系表(缓存部分)存在于内存管理单元(MMU)中,通过查表获得并提取对应物理地址位置。如果通过一个处理过程,去内存里找。

1.CPU执行指令,ALU部件通过逻辑地址请求指令内容
2.MMU通过逻辑地址与物理地址之间的映射表(缓存部分),获得对应的物理地址。如果找不到,则去内存中map找。
3.找到,控制器给主存发出对应物理地址内容访问请求
4.主存将对应内容通过总线传给CPU

4.2.2操作系统作用

1.逻辑地址到物理地址的映射关系建立:操作系统负责建立逻辑地址到物理地址的映射关系,可以放到CPU缓存,加快处理过程。
2.程序地址空间安全监测:操作系统要确保放到内存中程序相互之间不能干扰,确保每个程序地址空间是合法的。地址空间包括起始地址和长度,通过查map获得是否满足限制。

5操作系统管理内存方法

5.1连续内存分配

5.1.1内存碎片

当给程序分配空间时,可能会出现一些无法被利用的空闲碎片空间。
1.外部碎片:分配单元之间无法被利用的内存碎片
2.内部碎片:分配给任务内存大小大于任务所需内存大小时,多出来的内存碎片。

5.1.2分区的动态分配

连续内存分配情况:将应用程序从硬盘加载到内存中,给内存分配一块内存。应用程序运行访问数据,数据的连续内存空间。

5.1.2.1内存分配算法:

具体问题具体分析适配算法。

1.首次适配:

定义:使用第一块内存大小大于需求大小的可用空闲块
实现方法:需要有一个按地址排序的空闲块列表。寻找第一个满足内存需求的空闲块。对于回收,要考虑空闲块与相邻空闲块合并问题。
优点:简单,易于产生更大的空闲块,想着地址空间结尾分配
缺点:产生外部碎片,具有不确定性

2.最优适配:

定义:寻找整个空闲块中,最满足分配请求的空闲块,内存差值最小。
实现方法:需要有一个按尺寸排序的空闲块列表,寻找最满足分配的内存块。对于回收,要考虑空闲块与相邻空闲块合并问题。
优点:避免分割大空闲块,最小化外部碎片的产生,简单
缺点:外部碎片很细,有很多微小碎片,不利于后续分配管理。

3.最差适配:

定义:找到差距最大的内存空闲块。
实现:需要有一个按尺寸排序的空闲块列表,寻找差距最大的内存块。对于回收,要考虑空闲块与相邻空闲块合并问题。
优点:避免产生微小外部碎片,分配效率高,适用于分配中大快
缺点:对于大块请求带来一定影响

5.1.3 减少内存碎片方法

1.紧致:压缩式碎片整理

调整运行程序的位置。
1.重定位的时机。不能在程序运行时进行,可以在程序等待时拷贝。
2.内存拷贝开销很大。

2.swaping:交换式碎片整理

把硬盘作为一个备份。把等待的程序包括数据(主存)挪到硬盘上。当硬盘上程序需要执行时再拷贝到主存上。
1.交换那个程序,减小开销
2.交换的时机

5.2非连续内存分配

5.2.1连续内存分配和非连续内存分配

  • 连续内存分配缺点:1.分配给一个程序的物理内存是连续的,内存利用率较低,由外碎片内碎片的问题·。
  • 非连续内存分配优点:1.程序物理地址是非连续的 2.更好的内存利用和管理 3.允许共享代码与数据 4.支持动态加载和动态链接
    非连续内存分配缺点:建立虚拟地址到物理地址的映射,软件开销太大,可以用硬件支持
  • -》硬件两种管理方案:分段和分页

5.2.1分段

分段地址空间

对于一段程序内存可以分为:程序(主程序+子程序+共享库)+变量(栈、堆、共享数据段)
分段:更好的分离与共享,将逻辑地址空间分散到多个物理地址空间
逻辑地址是连续的,将具有不同功能的映射到物理空间中,这些段大小不一,位置不一
在这里插入图片描述

硬件实现分段寻址机制

一维逻辑地址有不同段组成,首先将逻辑地址分为两段:段寻址(段号)+段偏移寻址(addr)
通过段号在段表找到逻辑内存的段起始地址,看段起始地址是否满足段大小限制,不满足返回内存异常,满足将逻辑地址加偏移量是物理地址。

段表:
1.存储逻辑地址段段号到物理地址段号之间的映射关系
2.存储段大小,起始地址
段表的建立:操作系统在寻址前建立。

5.2.2分页

分页地址空间
  • 需要页号和页地址偏移。相比分段,分页页帧大小固定不变。
  • 可以划分物理内存至固定大小的帧,将逻辑地址的页也划分至相同内存大小。大小是2的幂。
建立方案
  • 页帧(Frame):物理内存被分割为大小相等的帧

一个内存物理地址是一个二元组(f,o)
物理地址 = 2^S*f+o
f是帧号(F位,2^F个帧),o是帧内偏移(S位,每帧2^S字节),

  • 页(Page):逻辑地址空间分割为大小相等的页

页内偏移大小 = 帧内偏移大小(页帧大小和页大小一致)
页号大小和帧号大小可能不一致

一个逻辑地址是一个二元组(p,o)
逻辑地址 = 2^S*p+o
p:页号(P位,2^P个页),o:页内偏移(S位,每页2^S个字节)

页寻址机制

CPU寻址(逻辑地址),逻辑地址包含两部分(p,o),首先把p(页号)作为索引,再加上页表基址查页表(pagetable)中对应帧号(物理地址中f),知道帧号加上页内偏移就是物理地址(f,o)。

页表:以页号为索引的对应的帧号(物理地址),为此需要知道页表的基址位置(页号从哪个地址开始查)。
页表的建立:操作系统初始化时,enable分页机制前就需要建立好

  • 分页与分段:
    分页:相比分段,分页页内存固定,导致页内偏移大小范围是固定的。不需要想分段一样考虑分页大小不一致的问题。
  • 逻辑地址和物理地址空间
    1.总逻辑页大小和总物理帧大小不一致,一般逻辑地址空间大于物理地址空间。
    2.逻辑地址空间连续,物理地址空间不连续。减少内外碎片。
页表
页表结构
  • 页表是个数组,索引是页号,对应的数组项内容里有帧号。

数组项内容包括:

  • Flags(标志位)
    dirty bit
    resident bit
    clock/reference bit
  • 帧号

注: 1byte/B(字节) = 8bit(比特),1KB = 2^10B

分页机制性能问题

1.时间开销:访问一个内存单元需要两次内存访问

页表不能放在CPU里,只能放在内存里,CPU先做内存寻址找页表基址,再进行页表访问,进行两次内存访问,访问速度很慢

2空间代价:页表占用空间

1.64位计算机,每页1KB,页表大小?2^54个数的页表,很大
2.多个程序有多个页表

解决方法
  • 时间上:缓存 ——快表,TLB,Translation Look-aside Buffer

TLB:

  • 位于CPU中的一块缓存区域,存放常用的页号-帧号对,采用关联内存的方式实现,具有快速访问功能。
    -CPU寻址时会先通过页号在TLB查找,看是否存在页号的Key,对应得到帧号,进而得到物理地址(减少对物理地址的访问)。TLB未命中,把该项更新到TLB中(x86CPU这个过程是硬件完成,对于mps是操作系统完成)。
    编写程序时,把访问的地址写在一个页号里。
  • 空间上:间接访问(多级页表机制),以时间换空间

二级页表:

  • 对于逻辑地址(p1,p2,o)
    CPU寻址时先通过p1查找一级页表,一级页表中存放的是二级页表的p2的起始地址,再在二级页表对应起始地址查找偏移p2,对应存放的就是帧号。提高时间开销,但一级页表中不存在页表项就不需要占用二级页表项的内存,节省空间。

多级页表

  • 页号分为K个部分,建立页表“树”
    在这里插入图片描述
  • 页表大小与物理地址大小——反向列表

  • 背景:
    1.页表大小和逻辑地址空间大小对应,逻辑空间越大对应页表项越多,有没有方法让页表大小与物理地址大小有关,而不是逻辑地址大小?
    2.64位地址空间,前向映射需要5级页表

  • 定义:
    以物理帧号作为索引,查找逻辑页页号。

  • 优点:
    与虚拟地址空间无关,不需要多级页表,整个系统只需要一个表。占空间少。

  • 缺点:
    需要有一个高效的索引方法。硬件+软件配合。

  • 实现方案:
    1.基于页寄存器的方案:
    以帧号为索引,列表项内容是页号。
    页寄存器:每个帧和一个寄存器关联,寄存器内容包括一些符号位以及对应页号。
    2.基于关联内存的方案
    key:页号,value:页帧号
    缺点:(放到CPU中)开销大,设计成本大,硬件逻辑复杂,容量小
    3.基于哈希(hash)查找的方案
    哈希表:输入页号,输出帧号,再加入PID(用来解决哈希冲突)
    f=h(PID,p)

  • 问题:
    1.一个输入可能对应多个输出——PID
    2.反向列表需要存放在内存中 ——TLB

6虚拟内存

6.1 虚拟内存产生原因

  • 程序规模增长速度远大于存储器容量的增长速度。
  • 理想存储器:更大、更快、更便宜的非易失性存储器。
    在这里插入图片描述
    -解决容量不够的问题解决方法:
    1.程序太大:可以采用手动覆盖,只保存需要的指令和数据
    2.程序太多:采用自动交换技术
    3.有限内存:自动虚拟存储技术

6.2覆盖技术(DOS)

  • 目标:在较小可用内存中运行较大的程序。常用于多道程序系统,与分区存储管理配合使用。
  • 实现方法:
  • 把程序按照自身逻辑结构,划分为若干个功能上相对独立的程序模块,让不会同时执行的模块共享同一块内存区域,按时间先后来运行。
  • 常用部分代码和数据常驻内存,负责管理调用调出。(A)
  • 不常用部分在其他程序模块中实现,平时存放在外存中,需要时装入内存(BC)
  • 不存在调用关系的木块不必同时装到内存,从而可以相互覆盖,令这些模块共用一个分区。(BC/DEF)
  • 左图覆盖:1.A/BC/DEF(110K) 2.A/BEF/CD(100K)
    在这里插入图片描述
  • 缺点:
    1.设计开销
    2.时间开销

6.3交换技术(UNIX)

  • 目标:多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多内存资源。
  • 方法:将暂时不能运行的程序送到外存,从而获得空闲内存空间。操作系统把一个进程的整个地址空间内容保存到外存中(swap out),将外存中某个进程的地址空间读入到内存中(swap in)。换入换出内容的大小为整个程序的地址空间
  • 实现:
    1.什么时候交换:只当内存空间不够或又不够的危险时
    2.交换区大小:足够大已足以存放所有用户进程的所有内存映像的拷贝,能对这些内存映像进行直接存取。
    3.换入换出后的内存寻址问题:动态地址映射

6.4覆盖与交换技术

1.覆盖只发生在没有相互调用程序内的模块,发生在程序内,需要程序员手动覆盖,增加程序员负担。
2.交换是以在内存中的程序大小为单位进行的,是程序程序之间的,不需要给出各模块之间的逻辑覆盖结构,操作系统内部完成,增加处理器开销。
3.交换发生在内存中程序与管理程序/操作系统之间,覆盖发生在运行程序的内部。

6.5虚存技术

6.5.1目标

  • 目标:像覆盖技术一样,只放程序一小部分,过程由操作系统自动完成。像交换技术一样,实现进程在内存和外存之间的交换。只对进程的部分内容在外存和内存之间进行交换。

系统的局部性原理:

  • 指程序在执行过程中一个较短时期,所执行的指令地址和指令操作数地址,局限于一定区域:
    1.时间局部性:一条指令执行间隔时间以及数据的访问间隔时间集中在一次较短时间内
    2.空间局部性:相邻执行的指令和数据都集中在一个较小区域内。

6.5.2方法

  • 方法:在页式或段式内存管理的基础上实现
    1.装入程序时,不必将全部程序装入到内存,将执行部分装入到内存,就让程序进行。
    2.程序执行时,如果需执行指令或访问数据尚未在内存中(缺页/缺段),处理器通知操作系统将相应页面或段调入到内存,然后执行程序。
    3.操作系统将内存中暂时不实用的页面或段调出保存在外存上,腾出更多空闲空间寻访要装入的程序以及要调入的页面和段。

6.5.3特征

  • 特征:
    1.用户空间大:实现虚拟空间物理空间的分离,用户虚拟空间通常大于实际物理内存空间。32位虚拟地址理论上可访问4GB。计算机物理内存256M,但硬盘大于4GB。
    2.部分交换:虚拟存储调入调出是对部分虚拟内存地址空间进行的。
    3.不连续性:物理内存分配不连续,虚拟地址空间使用不连续。

6.5.4实现

6.5.4.1虚拟页式内存管理
  • 页式存储管理的基础上增加请求调页页面置换的功能:
  • 1.请求调页:程序运行时发现缺页,产生缺页中断请求,系统处理中断时,将外存相应页面调入内存的过程。
  • 2.页面置换:当物理内存不够用时,进行页面置换,换出不常用页,换入常用页。
  • 页表表项
    在这里插入图片描述

驻留位:该页在内存还是外存中(1在,0不在)
保护位:访问权限(只读、可写、可执行)
修改位:页是否被修改过,系统回收物理页时,是否将内容写回外存。
访问位:最近是否被访问过,用于页面置换。

  • 缺页中断:
    在这里插入图片描述

1.产生缺页中断(驻留位为0)
2.内存中是否有空闲物理页,有就分配物理页帧f,然后转5。没有转3。
3.使用页面置换算法选择替换的物理页帧f,对应逻辑页q,查询对应页表项,如果修改位置1需要写回外存。
4.把逻辑页q对应页表项修改,驻留位置0。
5.硬盘中数据以页单位读到对应物理页帧f处,然后修改页表,把逻辑页p对应驻留位置1,页帧号位置f。
6.调回中断处重新执行指令。

  • 后备存储(Backing Store)
    一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)的某个位置。
  • 硬盘存储数据分类:

1.数据:
2.代码:指令,执行程序
3.动态链接库:库文件,需要时读取
4.其他段:分区形式存在,程序在运行过程中产生的数据,没有对应到具体的文件(数据代码库)中,是动态产生空间,存入在swap file(交换空间)中。

  • 虚拟内存性能:有效存储器访问时间(effective memory access time)
EAT = 访存时间*页面命中几率+page fault处理时间*page fault几率。

EAT = 10(1-p)+5000000p(1+q)
访存时间:10ns 磁盘访问时间:5ms
pagefault几率:p dirtypage几率:q

6.6局部页面置换算法

6.6.1功能

当缺页中断发生时,需要调入新的页面二内存已满时,选择内存当中哪个物理页面置换。

6.6.2 目标

尽可能减少页面的换进换出次数(缺页中断次数)。在局部性原理指导下依据过去的同级相互局来进行预测。

6.6.3页面锁定

有一些必须常驻内存的应用进程。比如操作系统的关键部分或时间关键应用进程。实现方法是在页表中添加锁定标志位(lock bit)。

6.6.4 实现方法

记录进程对页访问的轨迹,搭建模拟环境,进行虚拟地址跟踪,生成页面轨迹(不需要考虑偏移)。

6.6.4.1 最优页面置换算法
  • 思路:当一个缺页中断发生时,对于保存在内存当中的每个逻辑页面,计算在下一次访问前还需要等待多长时间,选择等待时间最长的作为被置换页面。
  • 特性:理想情况,实际系统无法实现(未来无法预知),可用做其他算法性能评价的依据(运行程序,几句页面访问情况,第二次可以使用最优算法运行)
6.6.4.2先进先出算法(FIFO)
  • 思路:选择在内存中驻留最长的页面淘汰。通过一个链表,记录所有位于内存当中的逻辑页面。链首驻留时间最长,链尾驻留时间最短。当发生缺页中断时,把链首页面淘汰,新页面添加到链表末尾。
  • 特性:性能较差(一步跟不上,步步跟不上),调出页面可能是经常访问的页面,有Belady现象,FIFO很少单独使用。
  • Belady现象:
6.6.4.3最近最久未使用算法(LRU)
  • 思路:选择最久未使用的页面淘汰。依据局部性原理近似最优页面置换算法。(根据历史推测未来)
  • 实现:记录各个页面使用时间先后顺序:
    1.链表:维护当前访问页面。首为刚访问,尾为最久未使用。每次访问内存,找相应界面,从链表中摘下移动到链表首。访问页插入栈顶。
    2.活动页面栈,发生缺页中断时,淘汰链表末尾页面。查栈内有没有相同页号,有抽出淘汰。却页时选择栈底页面淘汰。
6.6.4.4时钟页面置换算法
  • 思路:Clock页面置换,LRU近似,FIFO改进。用到页表项当中的访问位,初始化置0,被访问置1。各个页面组织成环形链表,指针指向最老的页面。发生缺页中断时,指针指向最老页面项,访问位为0,立即淘汰;访问位为1,置0指向下一格,循环查找。
6.6.4.5二次机会算法
  • 考虑替换“脏”页具有一个巨大的代价,所以同时使用脏页和访问位来知道置换。两个bit都为0就替换,否则先置换访问位为0再置换脏位为0。
  • 在这里插入图片描述
6.6.4.6最不常用法(IFU)
  • 思路:选择访问次数最少的页淘汰。考虑访问次数,FIFO:考虑的是时间。
  • 实现:每个页面加一个访问计数器,每当一个页面被访问时,页面访问计数器加1.缺页中断时,淘汰计数值最小的页面。隔一段时间次数变少一次(加入时间)。

6.6.5局部页面置换算法比较

6.6.5.1 Belady现象
  • 背景:采用FIFO时,有时会出现分配物理页面增加,缺页率反而提高的异常现象。
  • 原因:置换特征和进程访问内存的动态特征是矛盾的,与置换算法目标不一致,置换出去的不一定是进程不访问的。只体现存在时间,不体现访问时间。
  • LRU符合栈算法特点。基于栈的算法,会记录一些页面分配的优先级即resident bit,这样会对使用性进行模拟,像根据历史推测未来,根据未来推测历史这种,而FIFO是随机页面置换算法,没有对应的模拟就会出现这个问题。
6.6.5.2 LRU/FIFO/CLOCK页面置换算法比较
  • LRU和FIFO都可以用链表和栈。FIFO根据页面进入内存时间来排序,LRU根据页面最近访问时间来排序。如果程序没有局部性特点,LRU会退化为FIFO。

进程中页与页之间最好有局部性特征,算法才能生效

  • LRU性能较好但系统开销大,FIFO系统开销小,但会发生Belady现象。CLOCK基于LRU和FIFO之间,性能近似于LRU。

6.7 全局页面置换算法

6.7.1局部置换算法问题

eg:对于FIFO,不同的物理页帧数产生缺页中断数目不同。考虑在程序的不同阶段访问特征不同(开始内存需求端,中间少)。考虑操作系统跑多个程序,最好可以动态分配各个进程的物理页帧大小。

6.7.2工作集模型

  • 工作集模型:证明并定量分析局部性原理。
  • 工作集:一个进程当前正在使用的逻辑页面集合

二元函数W(t,delta)表示
t:当前执行时刻
delta:工作集窗口,一个定长的页面访问时间窗口
W(t,delta)为当前时刻t之前delta时间窗口中所有页面组成的集合。
|W(t,delta)|:工作集大小,页面数量
在这里插入图片描述

6.7.3常驻集

  • 指当前时刻进程实际驻留在内存当中的页面集合。
  • 常驻集与工作集
    1.工作纪实进程运行时的固有性质,常驻集取决于系统分配给进程的物理页面数目,及所采用的页面置换算法。
    2.如果一个进程的整个工作集都在内存中,那么工作集是常驻集的子集,进程将处理运行,不会有太多缺页中断。
    进程常驻集大小达到某个数目后,再给他分配更多物理页面,缺页率也不会明显下降。

6.7.4全局页面置换算法

6.7.4.1工作集页置换算法
  • 思路:追踪前n和引用,在之前n个内存访问的页引用是工作集,n被称为窗口大小。 当替换时要替换掉不在工作集窗口里面的页,工作集窗口随着时间轴平移。当某一页不在时间集窗口内,则也会被丢掉。
  • 工作集窗口:时间+size,窗口里的页为当前时间内访问页。
  • 相比局部,当前放在物理内存中放哪些页面取决于,取决于他是否在工作集窗口内,在多个程序之间确保缺页可能性的降低。
6.7.4.2缺页率页面置换算法
  • 思路:修改窗口大小变化(常驻集变化),在进程运行中动态调整常驻集大小。使用缺页率算法(PFF),动态调整常驻集大小。
  • 缺页率:“”缺页次数/内存访问次数”或“缺页平均时间间隔的倒数”
  • 影响因素:
    1.页面置换算法
    2.分配给进程的物理页面数目
    3.页面本身大小
    4.程序编写方法
  • 缺页率算法:缺页率过高增加工作集,分配更多物理页面。缺页率过低,减少工作集来减少物理页面数。
    -
    在这里插入图片描述
6.7.4.3 对比

缺页率与工作集:
工作集:每次访问就需要判断是否抛出
缺页率:只有在发生缺页中断时才判断是否抛出
这些都是根据工作集大小和缺页频度大小动态调整
局部只在满的时候思考是否抛出

6.8抖动

  • 当常驻集<<工作集,会发生多次缺页中断,需要多次替换页面,产生“抖动”。
  • 量化抖动:
    1.缺页频率,缺页平均时间MTBF/缺页服务时间PFST尽量等于1(蓝线)
    2.内存大小

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值