OS-虚拟化内存相关内容

操作系统-虚拟化内存

地址空间

地址空间:由操纵系统提供的一个易用的物理内存抽象

包含内容:

  • 代码 (各种指令)
  • 堆 malloc分配的内存,动态数据结构等
  • 栈 局部变量、函数参数、返回值等

对于用户级程序员来说,看到的都是虚拟地址

虚拟内存的三个目标:

  • 透明 操作系统提供的虚拟地址假象不该被程序看破,程序的行为就好像自己拥有私有物理空间
  • 效率 追求虚拟化尽可能的在时间和空间上高效
  • 保护 操作系统应确保进程受到保护,不受其他进程影响,操作系统本身也不受进程影响。
内存操作API

两种内存类型

  • 栈内存 申请和释放由编译器隐式完成,也称为自动内存
  • 堆内存 对于长期内存要求所使用,所有申请和释放由程序员显示完成。

malloc()系统调用

传入要申请的堆的大小,成功返回一个指向新申请空间的指针,失败返回NULL;

sizeof()被认为是一个编译时操作符,其大小在编译时就已经得知。

在位一个字符串声明空间时,请习惯如下使用

malloc(strlen(s)+1)

free()调用

释放不在使用的堆,接收一个参数,由malloc返回的指针。

地址转换

利用地址转换,硬件对每次内存访问进行处理,将指令中的虚拟地址转换位数据实际存储的物理地址。

动态重定位

基址加界限机制

CPU需要两个硬件寄存器:基址寄存器和界限寄存器

地址转换规则:实际物理地址 = 虚拟地址 + 基址(偏移量)

界限寄存器:提供访问保护

分段

泛化的基址/界限

给地址空间内的每一个逻辑段一对基址和界限寄存器对。

一个段只是地址空间里面的一个连续定长的区域,典型地址空间有三个逻辑不同的段(,代码、栈、堆)

段错误:在支持分段的机器上面发生了非法的内存访问

段寄存器:段标识符 + 偏移量

支持共享:设置保护位,标识程序能否读写该段,或者执行其中的代码。

在使用段时,物理内存中可能会出现许多的小空闲空间,难以利用,称之位外部碎片

解决外部碎片的方法:

  • 紧凑物理内存 ,重新安排已有的段
  • 利用空闲列表管理算法,试图保留较大的内存快用于分配
空闲空间管理

空闲列表,在堆上管理空闲空间的数据结构。

该结构包含了管理内存区域中所有空闲块的引用,不一定真的是列表,只是某种可以追踪空闲空间的数据结构。

分隔与合并

空闲列表包含一组元素,记录堆中那些空间还没有被分配。

分割操作:找到一块可以满足请求的空闲空间,将其分割,第一块返回给用户,第二块留在空闲列表中。(如果请求的空间小于某块空闲块,分配程序通常进行分割)

合并操作

在应用程序调用free(),归还堆中的空间,将查看归还内存块的地址以及邻近的空闲空间块,如果新归还空间块与原空闲空间相临,则合并内存块。

基本策略:

最优匹配:遍历空闲列表,找到和请求大小一样或者更大的内存块,然后选择这组候选者中最小的一块返回

最差匹配:尝试寻找最大的内存块,分割满足用户后将剩余部分加入空闲列表。尝试在空闲列表中保留较大的块。

首次匹配:找到第一个足够大的块,将请求的空间返回给用户,剩余空间留给后续请求。

下次匹配:多维护一个指针,指向上一次查找的结束的位置,目的是为了将对空闲列表的查询操作扩散到整个列表中去,避免对列表开头的频繁分割。

分离空闲列表:如果某个应用程序经常申请一种大小的内存空间,那就用一个独立的列表只管理这样大小的对象,其他大小的请求都交给更通用的内存分配程序。

伙伴系统:二分伙伴分配程序,空闲列表从概念上被看成大小位2的N次方的大空间,当一个内存分配请求时,空闲列表被递归的一分为二,直到刚好可以满足请求的大小,此分配策略只允许分配2的次幂大小内存块,会产生内部碎片;才释放时判断伙伴空间是否空闲进行递归合并向上回溯。

分页

将空间分割为固定长度的分片,把物理内存看成是定长槽块的阵列,叫做页帧

页表:为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个保存一个数据结构,称为页表。

页表作用:为地址空间的每个虚拟页面保存地址转换。从而知道每个页在物理内存中的位置。

页表是每个进程一个的数据结构

组成:虚拟页面号(VPN)和页内偏移量(offset)

在线性页表中,表现为一个数组,操作系统通过虚拟页表号(VPN)检索该数组,并在该引索处查找页表项(PTE),以便找到物理帧号(PFN)。

页表有效位:用于指定特定地址转换是否有效

页表保护位:表明页是否可读写,执行。

存在位:表明该页在物理内存还是在磁盘上

脏位:表明页面被带入内存后是否被修改过

参考位:用于追踪页面是否被访问

使用分页,不会导致外部碎片,支持稀疏虚拟地址,但是分页如果不小心考虑可能会导致机器较慢和内存浪费。

在分页中,页表太大,会消耗太多的内存,为了让页表更小,使用如下方法。

1)更大的页,使用更大 的页会将页表的大小缩小,但是面临的问题是大内存会导致每页的浪费,称为内部碎片。

2)混合分页和分段,以杰少页表的开销,为每个逻辑分段提供一个页表

3)多级页表

将线性页表变成类似树的东西,将页表分成页大小的单元,如果整页页表项无效,则不分配该页页表。

为了追踪页表的页是否有效,增加一个新结构叫做页目录。

页目录为每页包含一个项(PDE),拥有有效位和页帧号,如果PDE项是有效的,意味着该项指向的页表中至少有一页是有效的。如果PDE项无效,则PDE其他部分无效。

多级页表分配的页表空间与正在使用的地址空间内存量成比例,很紧凑,并且支持稀疏地址空间

在TLB未命中时,需要从内存加载两次,一次用于页目录···

快速地址转换TLB

地址转换旁路缓冲存储器(TLB)简称地址转换缓存

首先从虚拟地址中提取页号(VPN),然后检查TLB是否有该页的映射,如果有则TLB命中,然后从TLB中取出页帧号(PFN),与原来虚拟地址中的偏移量组合形成期望的物理地址,并访问内存。

如果在TLB中没有找到转换映射(未命中),则硬件访问页表来寻找转换映射,并用该转换映射跟新TLB,当更新成功后,系统会重新尝试该指令。此时TLB中有了此转换映射,内存引用很快得到处理。

TLB 的内容:VPN | PFN | 其他位

页交换机制

交换空间:在硬盘上面开辟一部分空间用于物理页的移入和移出

存在位:如果存在位设置位1 ,则表示该页存在于物理内存中,如果存在位设置为0,则页不在内存中,而在硬盘上。

页错误:访问不在物理内存中的页。

处理页错误:当操作系统收到页错误时,他会在PTE中查找地址,并将请求发送到硬盘,将页读取到内存中。

页交换:

在将硬盘中的页读取到内存中时,如果内存空间不够,那就要执行页交换策略。

在页交换中,为了保证操作系统有少量的空闲内存,我们设置高水位HW和底水位线LW,来决定何时从内存

中清除页。当操作系统发现有少于LW的页可用时,后台释放内存的线程开始工作,直到有HW个可用的物理页。

页交换策略

程序平均内存访问时间:AMAT = (Ph*Tm)+(Pm*Td) ;

Tm表示内存访问成本,Td表示访问磁盘的成本、Ph表示缓存中找到数据的概率(命中)、Pm表示缓存中找不到数据的概率(未命中)

最优替换策略

即替换内存中最远将来才会被访问到的页,可用达到未命中最低,但是无法具体实现,此方法只要用于和其他策略进行对比。

FIFO策略

先入先出替换策略

页进入系统时,简单的放入一个队列中,当发生替换时,队列尾部的页先被提出

优势:实现非常简单

随机策略

在内存满的时候随机选择一个页进行替换实现简单,效率取决于运气;

LRU策略

利用历史数据作为参考,如果某个 程序在过去访问过某个页,则很有可能在不久的将来会再次访问该页。

LRU 最近最少使用,策略替换最近最少使用的页面(需要替换上次使用距现在最远的页面。)

局部性原则:程序倾向于表现出两种类型的局部性,空间局部性(如果页p被访问,则围绕他的页p+1和p-1也可能被访问)和时间局部性(近期访问过的页面很有可能在不久的将来再次访问)

不同工作负载下几种策略的效率

1)工作负载无局部性,三种策略区别不大命中率完全由缓存决定

2)80-20 负载场景,80%的引用是访问20%的页。

随机和FIFO也能很好运行,但效率不如LRU。

3)循环顺序工作负载

LRU和FIFO最差 0%的命中率,随机策略表现较好。

缺页

页面置换的数目

近似LRU算法

在硬件增加一个使用位,每当页被引用时,将使用位设置为1,当必须进行页替换时,操作系统找到一个页,如果其使用位是1,意为这此页最近使用过,将此为设置为0,然后指针跳到下一页继续寻找,直到找到一个使用位为0的页。

思想:周期性的清除使用位,然后通过区分使用位是1还是0来判断该替换哪个页。

脏页:如果页已经被修改并因此变脏,则提出他就必须将其写入磁盘,需要昂贵的时间成本,一些虚拟机倾向踢出干净页,因此要支持此行为,硬件应该包含一个修改位。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值