20145225 《信息安全系统设计基础》第14周学习总结

第九章 虚拟存储器

虚拟存储器是计算机系统最重要的概念之一,它是对主存的一个抽象

三个重要能力:

  • 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存
  • 它为每个进程提供了一致的地址空间,从而简化了存储器管理
  • 它保护了每个进程的地址空间不被其他进程破坏

第一节 物理和虚拟寻址

1.物理地址

 

计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址PA

根据物理地址寻址的是物理寻址。

2.虚拟地址

虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。

使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址

第二节 地址空间

1.地址空间

地址空间是一个非负整数地址的有序集合:

{0,1,2,……}

2.线性地址空间

地址空间中的整数是连续的。

3.虚拟地址空间

CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。

4.地址空间的大小

由表示最大地址所需要的位数来描述。

N=2^n:n位地址空间

主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。

第三节 虚拟存储器作为缓存的工具

虚拟存储器——虚拟页VP,每个虚拟页大小为P=2^平字节

物理存储器——物理页PP,也叫页帧,大小也为P字节。

 

1.DRAM缓存的组织结构

2.页表

3.缺页

4.虚拟存储器中的局部性

第四节 虚拟存储器作为存储器管理的工具

  • 操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间。
  • 抖个虚拟页面可以映射到同一个共享物理页面上。
  • 存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法。

VM简化了链接和加载、代码和数据共享,以及应用程序的存储器分配。

第五节 虚拟存储器作为存储器保护的工具

这里需要知道PTE的三个许可位:

  • SUP:表示进程是否必须运行在内核模式下才能访问该页
  • READ:读权限
  • WRITE:写权限

第六节 地址翻译

具体符号见上图

地址翻译就是一个N元素的虚拟地址空间VAS中的元素和一个M元素的物理地址空间PAS中元素之间的映射。

页面基址寄存器PTBR指向当前页表。

MMU利用VPN选择适当的PTE。

PPO=VPO。

1.当页面命中时,CPU动作:

  • 处理器生成虚拟地址,传给MMU
  • MMU生成PTE地址,并从高速缓存/主存请求得到他
  • 高速缓存/主存向MMU返回PTE
  • MMU构造物理地址,并把它传给高速缓存/主存
  • 高速缓存/主存返回所请求的数据给处理器。

    2.处理缺页时:

  • 处理器生成虚拟地址,传给MMU
  • MMU生成PTE地址,并从高速缓存/主存请求得到他
  • 高速缓存/主存向MMU返回PTE
  • PTE中有效位为0,触发缺页异常
  • 确定牺牲页
  • 调入新页面,更新PTE
  • 返回原来的进程,再次执行导致缺页的指令,会命中

一、结合高速缓存和虚拟存储器来看

  • 首先,在既使用SRAM高速缓存又使用虚拟存储器的系统中,大多数系统选择物理寻址
  • 主要思路是地址翻译发生在高速缓存之前
  • 页表目录可以缓存,就像其他的数据字一样

二、利用TLB加速地址翻译

TLB:翻译后备缓冲器,是一个小的、虚拟存储的缓存,其中每一行都保存着一个由单个PTE组成的块

步骤:

  • CPU产生一个虚拟地址
  • MMU从TLB中取出相应的PTE
  • MMU将这个虚拟地址翻译成一个物理地址,并且将它发送到高速缓存/主存
  • 高速缓存/主存将所请求的数据字返回给CPU

三、多级页表

多级页表——采用层次结构,用来压缩页表

1.以两层页表层次结构为例,好处是:
  • 如果一级页表中的一个PTE是空的,那么相应的二级页表就根本不会存在
  • 只有一级页表才需要总是在主存中,虚拟存储器系统可以在需要时创建、页面调入或调出二级页表,只有最经常使用的二级页表才缓存在主存中。
2.多级页表的地址翻译:

四、端对端的地址翻译

这一部分看懂书上的例题。

第七节 案例研究

一、Core i7地址翻译

在这里,PTE有三个权限位:

  • R/W位:确定内容是读写还是只读
  • U/S位:确定是否能在用户模式访问该页
  • XD位:禁止执行位,64位系统中引入,可以用来禁止从某些存储器页取指令

还有连个缺页处理程序涉及到的位:

  • A位,引用位,实现页替换算法
  • D位,脏位,告诉是否必须写回牺牲页

二、Linux虚拟存储器系统

Linux为每个进程维持了一个单独的虚拟地址空间,如图:

内核虚拟存储器包括:内核中的代码和数据结构。

一部分区域映射到所有进程共享的物理页面

另一部分包含每个进程都不相同的数据。

一、Linux虚拟存储器区域

区域:就是已分配的虚拟存储器的连续片。

区域的例子:

  • 代码段
  • 数据段
  • 共享库段
  • 用户栈
  • ……

每个存在的虚拟页面都保存在某个区域中。内核为系统中的每个进程维护一个单独的任务结构task_struct:

一个具体区域的区域结构包括:

  • vm_start:指向起始处
  • vm_end:指向结束处
  • vm_prot:描述这个区域包含的所有页的读写许可权限
  • vm_flags:是共享的还是私有的
  • vm_next:指向下一个区域

二、Linux缺页异常处理

1.虚拟地址A是否合法?

不合法,触发段错误,终止进程

合法,进入下一条

2.存储器访问是否合法?即,是否有权限?

不合法,触发保护异常,终止程序

合法,进入下一条

3.这时,是针对合法的虚拟地址进行合法的操作。所以:选择一个牺牲页面,如果被修改过就换新的并更新页表。

第八节 存储器映射

即指Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程。

映射对象:

1.Unix文件系统中的普通文件

2.匿名文件(全都是二进制0)

一、共享对象和私有对象

1.共享对象
  • 共享对象对于所有把它映射到自己的虚拟存储器进程来说都是可见的

  • 即使映射到多个共享区域,物理存储器中也只需要存放共享对象的一个拷贝。

2.私有对象
  • 私有对象运用的技术:写时拷贝
  • 在物理存储器中只保存有私有对象的一份拷贝

fork函数就是应用了写时拷贝技术,至于execve函数:

二、使用mmap函数的用户级存储器映射

1.创建新的虚拟存储器区域

#include <unistd.h>
#include <sys/mman.h> void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); 成功返回指向映射区域的指针,若出错则为-1

参数含义:

  • start:这个区域从start开始
  • fd:文件描述符
  • length:连续的对象片大小
  • offset:距文件开始处的偏移量
  • prot:访问权限位,具体如下:

    PROT_EXEC:由可以被CPU执行的指令组成
    PROT_READ:可读
    PROT_WRITE:可写
    PROT_NONE:不能被访问
  • flag:由描述被映射对象类型的位组成,具体如下:

    MAP_ANON:匿名对象,虚拟页面是二进制0
    MAP_PRIVATE:私有的、写时拷贝的对象
    MAP_SHARED:共享对象

    2.删除虚拟存储器:

    include

    include <sys/mman.h>

    int munmap(void *start, size_t length);
    成功返回0,失败返回-1

从start开始删除,由接下来length字节组成的区域。

第九节 动态存储器分配

1.堆:

是一个请求二进制0的区域,紧接在未初始化的bss区域后开始,并向上(更高的地址)生长。有一个变量brk指向堆的顶部

2.分配器的两种基本风格:

a.显示分配器-malloc和free
b.隐式分配器/垃圾收集器

一、malloc和free函数:

系统调用malloc函数,从堆中分配块:

#include <stdlib.h>void *malloc(size_t size); 成功返回指针,指向大小至少为size字节的存储器块,失败返回NULL

系统调用free函数来释放已分配的堆块:

#include <stdlib.h>void free(void *ptr); 无返回值

ptr参数必须指向一个从malloc、calloc或者reallov获得的已分配块的起始位置。

为什么要使用动态存储器分配?

因为经常知道程序实际运行时,它们才知道某些数据结构的大小。

二、分配器的要求和目标:

1.要求

  • 处理任意请求序列
  • 立即响应请求
  • 只使用堆
  • 对齐块
  • 不修改已分配的块

2.目标:

  • 最大化吞吐率(吞吐率:每个单位时间里完成的请求数)
  • 最大化存储器利用率——峰值利用率最大化

三、碎片

虽然有未使用的存储器,但是不能用来满足分配请求时,发生这种现象。

1.内部碎片

发生在一个已分配块比有效载荷大的时候

易于量化。

2.外部碎片

发生在当空闲存储器合计起来足够满足一个分配请求,但是没有一个单独的空间块足以处理这个请求时发生

难以量化,不可预测。

四、隐式空闲链表

堆块的格式:

由一个字的头部,有效荷载,和可能的额外填充组成。

将堆组织成一个连续的已分配块和空闲块的序列:

空闲块通过头部中的大小字段隐含地连接着,分配器可以通过遍历堆中所有的块,从而间接地遍历整个空闲块的集合。

需要:特殊标记的结束块。

系统对齐要求和分配器对块格式的选择会对分配器上的最小块大小有强制的要求。

五、放置已分配的块——放置策略

1.首次适配

从头开始搜索空闲链表,选择第一个合适的空闲块

2.下一次适配

从上一次搜索的结束位置开始搜索

3.最佳适配

检索每个空闲块,选择适合所需请求大小的最小空闲块

六、申请额外的堆存储器

用到sbrk函数:

#include <unistd.h>vid *sbrk(intptr_t incr); 成功则返回旧的brk指针,出错为-1

通过将内核的brk指针增加incr来扩展和收缩堆。

七、合并空闲块

合并是针对于假碎片问题的,任何实际的分配器都必须合并相邻的空闲块。

有两种策略:

  • 立即合并
  • 推迟合并

八、带边界的合并

这个合并的意思是,因为头部的存在,所以向后合并是简单的,但是向前合并是不方便的,所以就在块的最后加一个脚部,作为头部的副本,就方便了合并,具体四种情况如下:

空闲块总是需要脚部的。

九、实现简单的分配器

这里课本上给了一个详细的例子,关于如何实现一个简单分配器的设计,有几点是需要注意的:

  • 序言块和结尾块:序言块是初始化时创建的,而且永不释放;结尾块是一个特殊的块,总是以它为结束。
  • 有一个技巧,就是将重复使用的,操作复杂又有重复性的,这些可以定义成,方便使用也方便修改。
  • 需要注意强制类型转换,尤其是带指针的,非常复杂。
  • 因为规定了字节对齐方式为双字,就代表块的大小是双字的整数倍,不是的舍入到是。

十、显式空闲链表

1.区别

(1)分配时间

隐式的,分配时间是块总数的线性时间

但是显式的,是空闲块数量的线性时间。

(2)链表形式

隐式——隐式空闲链表

显式——双向链表,有前驱和后继,比头部脚部好使。

2.排序策略:

  • 后进先出
  • 按照地址顺序维护

十一、分离的空闲链表

分离存储,是一种流行的减少分配时间的方法。一般思路是将所有可能的块大小分成一些等价类/大小类。

分配器维护着一个空闲链表数组,每个大小类一个空闲链表,按照大小的升序排列。

有两种基本方法:

1.简单分离存储

每个大小类的空闲链表包含大小相等的块,每个块的大小就是这个大小类中最大元素的大小。

(1)操作

如果链表非空:分配其中第一块的全部

如果链表为空:分配器向操作系统请求一个固定大小的额外存储器片,将这个片分成大小相等的块,并且连接起来成为新的空闲链表。

(2)优缺点

优点:时间快,开销小

缺点:容易造成内部、外部碎片

2.分离适配

每个空闲链表是和一个大小类相关联的,并且被组织成某种类型的显示或隐式链表,每个链表包含潜在的大小不同的块,这些块的大小是大小类的成员。

这种方法快速并且对存储器使用很有效率。

3.伙伴系统——分离适配的特例

其中每个大小类都是2的幂

这样,给定地址和块的大小,很容易计算出它的伙伴的地址,也就是说:一个块的地址和它的伙伴的地址只有一位不同。

优点:快速检索,快速合并。

第十节 垃圾收集

垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配块,这些块被称为垃圾,自动回收堆存储的过程叫做垃圾收集

1.基本知识

垃圾收集器将存储器视作一张有向可达图,只有当存在一条从任意根节点出发并到达p的有向路径时,才说节点p是可达的,而不可达点就是垃圾。

2.Mark&Sweep垃圾收集器

有两个阶段:

  • 标记:标记出根节点的所有可达的和已分配的后继
  • 清楚:释放每个未被标记的已分配块。

相关函数:

ptr定义为typedef void *ptr
  • ptr isPtr(ptr p):如果p指向一个已分配块中的某个字,那么就返回一个指向这个块的起始位置的指针b,否则返回NULL
  • int blockMarked(ptr b):如果已经标记了块b,那么就返回true
  • int blockAllocated(ptr b):如果块b是已分配的,那么久返回ture
  • void markBlock(ptr b):标记块b
  • int length(ptr b):返回块b的以字为单位的长度,不包括头部
  • void unmarkBlock(ptr b):将块b的状态由已标记的改为未标记的
  • ptr nextBlock(ptr b):返回堆中块b的后继

3.C保守的Mark&Sweep——平衡二叉树

根本原因是C语言不会用类型标记来标记存储器位置。

转载于:https://www.cnblogs.com/nizaikanwoma/p/6195845.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字后端——布线

布线是继布局和时钟树综合之后的重要物理实施任务&#xff0c;其内容是将分布在芯片核内的模块、标准单元和输入输出接口单元( I /O pad&#xff09;按逻辑关系进行互连&#xff0c;其要求是百分之百地完成它们之间的所有逻辑信号的互连&#xff0c;并为满足各种约束条件进行优…

streamsets 集成 minio s3测试

具体streamsets crate 集成可以参考 streamsets crate 以下文档只关注minio 集成的配置 minio 服务 搭建 具体搭建参考&#xff1a; https://www.cnblogs.com/rongfengliang/p/9197315.html 创建bucket &#xff08;crate 集成使用&#xff09; 测试的csv 文件从https://www.s…

【codecombat】 试玩全攻略 第十四关 已知敌人

第十四关 已知敌人 在这一关里&#xff0c;我们的英雄获得了一副可以看见敌人的眼镜&#xff0c;所以他很强势的学会了“发现敌人”的技能。 hero.findNearestEnemy()命令&#xff0c;单词多了&#xff0c;首字母都要大写了&#xff0c;不然分不出来。玩过wow的小伙伴用过 宏命…

数字后端——信号完整性分析

随着光刻和集成电路制造工艺的不断进步&#xff0c;以及芯片的特征尺寸从深亚微米到纳米的迅速采用&#xff0c;人们一方面因为芯片的功能极大提高而受益&#xff0c;另一方面&#xff0c;当逻辑门的沟道长度减小时&#xff0c;门的开关时间会减小&#xff0c;这意味着输出驱动…

CMOS图像传感器——TDI CIS

一、面阵与线阵图像传感器 人们在日常生活中见到的相机大多基于普通的面阵图像传感器,这种相机多用来拍摄静止的物体。即使用它们來拍摄运动的物体,也仅仅是缩短了相邻两次拍摄的时间间隔,无需对所拍摄图像进行额外操作,对物体的运动方向和速度也没有限定条件。 除此之外,…

做好数据挖掘模型的9条经验总结

爱数据学习社 welcome数据挖掘是利用业务知识从数据中发现和解释知识(或称为模式)的过程&#xff0c;这种知识是以自然或者人工形式创造的新知识。当前的数据挖掘形式&#xff0c;是在20世纪90年代实践领域诞生的&#xff0c;是在集成数据挖掘算法平台发展的支撑下适合商业分析…

数字后端——低功耗设计物理实施

一、低功耗设计方案综述 为了实现集成电路的低功耗设计目标&#xff0c;我们需要在系统设计阶段就采用低功耗设计方案&#xff0c;因为随着设计流程的逐步推进&#xff0c;到了芯片设计实现阶段&#xff0c;降低芯片功耗的方法将越来越少&#xff0c;可节省功耗的百分比将不断下…

H5项目开发分享——用Canvas合成文字

以前曾用Canvas合成、裁剪、图片等《用H5中的Canvas等技术制作海报》。这次用Canvas来画文字。 下图中“老王考到驾照后”这几个字是画在Canvas上的&#xff0c;与在PS中打入的字非常接近&#xff0c;毫无违和感。 前面一段时间也在研读JavaScript设计模式相关的知识&#xff0…

CMOS图像传感器——SNR计算

图像质量评价在计算机视觉,人工智能,高清视频传输上面有很广泛的应用。目前,图像质量评价主要分为三个方向,有参考图像的质量评价,半参考的图像质量评价,以及无参考的图像质量评价。许多时候,我们利用CIS采集的RAW DATA本身就是含噪信号,因为我们往往不知道感兴趣的像素…

Java this 关键字的用法

this 关键字的用法 this 在类中就是代表当前对象&#xff0c;可以通过 this 关键字完成当前 对象的成员属性、成员方法和构造方法的调用。 那么何时用 this? 当在定义类中的方法时&#xff0c;如果需要调用该类对象&#xff0c;就可以用 this 来表示这个对象。也就是说&#x…

数字图像处理——中值滤波及其改进算法

一、算法介绍 中值滤波器是非线性滤波器的一个例子&#xff0c;它在保留图像特征方面非常有效。 但是&#xff0c;滤波器的窗口大小直接影响中值滤波器的性能。 较小的窗口保留了特征&#xff0c;但会导致噪声抑制的减少。 在较大窗口的情况下&#xff0c;噪声抑制很高&#xf…

环信快速集成,以及实际集成中遇到的坑

一.pod集成遇到的问题 1.直接pod 安装 pod EaseUI, :git > https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git 在这个过程中&#xff0c;如果你pod已经安装了sdwebimage&#xff0c;mjrefresh等他自身包含的三方&#xff0c;就需要在你的podfile里面把这个给删…

用NPOI从DataBase到Excel '2

NPOI的C# Helper代码2 1 public static MemoryStream ExportXls(DataTable dt)2 {3 HSSFWorkbook wk new HSSFWorkbook();4 ISheet sheet null;5 6 string sheetName "Sheet1";7 if (!string.Is…

CMOS图像传感器——噪声模型

由于CMOS图像传感噪声的复杂性和不可控性,学者们一直在寻求一种能对其比较精确表的噪声模型。在图像降噪领域,为了降低算法设计的复杂度,人们普遍采用基于信道相关噪声的模型(即加性噪声),但其缺点就是不能精确地表示传感器的噪声。于是Hirakawa提出了一 种精确CMOS传感器…

TCp传输粘包问题

解决TCP网络传输“粘包”问题 当前在网络传输应用中&#xff0c;广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口&#xff08;API&#xff09;。TCP/IP传输层有两个并列的协 议&#xff1a;TCP和UDP。其中TCP&#xff08;transport control protocol&#xff0c;传…

AtomicIntegerArray和AtomicIntegerFieldUpdater

2019独角兽企业重金招聘Python工程师标准>>> AtomicIntegerArray 对int数组中元素的操作不是原子性的&#xff0c;所以存在并发操作时&#xff0c;我们应该使用AtomicIntegerArray类来代替int数组。 下面是验证演示代码&#xff1a; public class AtomicIntegerArra…

CMOS图像传感器——高动态范围

动态范围是CMOS 图像传感器中很重要的一项评价指标。动态范围指示了CMOS 图像传感器能够在同一帧图像中同时探测到的最大光强信号和最小光强信号的范围。动态范围通常用dB 形式来表示,其计算公式如下 其中Pmax 和Pmin 分别是最大非饱和光强与最小可探测光强。对于线性…

《Linux内核设计与实现》读书笔记(七)- 中断处理

中断处理一般不是纯软件来实现的&#xff0c;需要硬件的支持。通过对中断的学习有助于更深入的了解系统的一些底层原理&#xff0c;特别是驱动程序的开发。 主要内容&#xff1a; 什么是中断中断类型中断相关函数中断处理机制中断控制方法总结1. 什么是中断 为了提高CPU和外围硬…

入门视频采集与处理(学会分析YUV数据)

标签&#xff1a;分析码流 视频采集 RGB YUV 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/555791做视频采集与处理&#xff0c;自然少不了要学会分析…

数字后端——时序验证

时序验证则是采用时序分析等方法验证设计是否满足时序收敛&#xff0c;这些时序检验工作包括反向标定(back-annotation)、时序与功耗的检验、时序与信号完整性的检验和当代低功耗纳米先进设计中的“多模式多端角”(MMMC&#xff0c;multi-mode multi-comer)检验。 一、反向标定…