zoukankan      html  css  js  c++  java
  • 20145228 《信息安全系统设计基础》第十四周学习总结

    教材学习内容总结

    虚拟存储器

    一、作为缓存的工具

    二、作为存储器管理的工具

    三、作为存储器保护的工具

    计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每宇节都有一个唯一的物理地址 。第一个字节的地址为 0,接下来的字节地址为 1,再下一个为 2, CPU 访问存储器的最自然的方式就是使用物理地址。我们把这种方式称为物理寻址 。

    早期的 PC 使用物理寻址,现代处理器使用的是一种称为虚拟寻址的寻址形式。

    1.虚拟存储器的作用:

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

    (1)物理寻址

    •主存被组织成一个由M个连续的字节大小的单元组成的数组,依次类推的寻址方式称为物理寻址。

    (2)虚拟寻址

    •CPU生成一个虚拟地址来访问主存,在被传送到存储器之前先转换成适当的物理地址。地址翻译通过CPU芯片上的存储器管理单元完成。

    2.地址空间

    地址空间是一个非负整数地址的有序集合:{0,1,2,……}

    (1)线性地址空间

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

    (2)虚拟地址空间

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

    (3)物理地址空间

    •与系统中的物理存储器的M个字节相对应。

    (4)地址空间的大小

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

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

    •任意时刻,虚拟页面的集合都被分为三个不相交的子集:

    •未分配的:VM系统还没分配/创建的页,不占用任何磁盘空间。

    •缓存的:当前缓存在物理存储器中的已分配页

    •未缓存的:没有缓存在物理存储器中的已分配页

    DRAM 缓存的组织结构

    SRAM 缓存位于 CPU 和主存之间的 Ll、 L2 和 L3 高速缓存。

    DRAM 缓存来表示虚拟存储器系统的缓存,它在主存中缓存虚拟页。

    在存储层次结构中, DRAM 缓存的位置对它的组织结构有很大的影响。

    DRAM 缓存中的不命中比起 SRAM 缓存中的不命中要昂贵得多,因为 DRAM 缓存不命中要由磁盘来服务,而 SRAM 缓存不命中通常是由基于 DRAM 的主存来服务的。

    DRAM 缓存的组织结构完全是由巨大的不命中开销驱动的。

    页表

    页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组。

    •页表就是一个页表条目PTE的数组。

    PTE:由一个有效位和一个n位地址字段组成的,表明了该虚拟页是否被缓存在DRAM中。

    •页表的组成:有效位+n位地址字段

    •如果设置了有效位:地址字段表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页。

    •如果没有设置有效位: •空地址:表示该虚拟页未被分配

    •不是空地址:这个地址指向该虚拟页在磁盘上的起始位置。

    缺页

    •缺页:就是指DRAM缓存不命中。

    •缺页异常:会调用内核中的缺页异常处理程序,选择一个牺牲页。

    •页:虚拟存储器的习惯说法,就是块

    •交换=页面调度:磁盘和存储器之间传送页的活动

    •按需页面调度:直到发生不命中时才换入页面的策略,所有现代系统都使用这个。

    地址翻译

    当页面命中时,CPU硬件执行步骤

    •处理器生成虚拟地址,传给MMU

    •MMU生成PTE地址,并从高速缓存/主存请求得到他

    •高速缓存/主存向MMU返回PTE

    •MMU构造物理地址,并把它传给高速缓存/主存

    •高速缓存/主存返回所请求的数据给处理器。

    处理缺页时,CPU硬件执行步骤

    •处理器生成虚拟地址,传给MMU

    •MMU生成PTE地址,并从高速缓存/主存请求得到他

    •高速缓存/主存向MMU返回PTE

    •PTE中有效位为0,触发缺页异常

    •确定牺牲页

    •调入新页面,更新PTE

    •返回原来的进程,再次执行导致缺页的指令,会命中

    多级页表

    用来压缩页表的常用方法是使用层次结构的页表。

    一个两级页表层次结构。 注意地址是从上往下增加的

    这种方法从两个方面减少了存储器要求。

    1.如果一级页表中的一个 PTE 是空的,那么相应的二级页表就根本不会存在,这代表着一种巨大的潜在节约,因为对于一个典型的程序, 4GB 的虚拟地址空间的大部分都将是未分配的。

    2.只有一级页表才需要总是在主存中:虚拟存储器系统可以在需要时创建、页面调入或调出二级页表,这就减少了主存的压力:只有最经常使用的二级页表才需要缓存在主存中。

    带多级页表的地址翻译并不比单级页表慢很多。

    Linux 虚拟存储器系统

    一个虚拟存储器系统要求硬件和内核软件之间的紧密协作。

    内核虚拟存储器包含内核中的代码和数据结构。内核虚拟存储器的某些区域被映射到所有进程共享的物理页面。

    内核虚拟存储器的其他区域包含每个进程都不相同的数据。

    fork 函数

    当 fork 函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的 PID。为了给这个新进程创建虚拟存储器,它创建了当前进程的 mm_struct、区域结构和页表的原样拷贝。它将两个进程中的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时拷贝。

    当 fork 在新进程中返回时,新进程现在的虚拟存储器刚好和调用 fork时存在的虚拟存储器相同。当这两个进程中的任一个后来进行写操作时,写时拷贝机制就会创建新页面,因此,也就为每个进程保持了私有地址空间的抽象概念。

    execve 函数

    execve 函数在当前进程中加载并运行包含在可执行目标文件 a.out 中的程序,用 a.out 程序有效地替代了当前程序。加载并运行 a.out 需要以下几个步骤:

    •删除已存在的用户区域。

    •映射私有区域。

    •映射共享区域。

    •设置程序计数器 (PC)。

    动态存储器分配

    分配器将堆视为一组不同大小的块的 集合来维护。每个块就是一个连续的虚拟存储器片,要么是已分配的,要么是空闲的。己分配的 块显式地保留为供应用程序使用。空闲块可用来分配。空闲块保持空闲,直到它显式地被应用所分配。一个已分配的块保持已分配状态,直到它被释放,这种释放要么是应用程序显式执行的,要么是存储器分配器自身隐式执行的。

    垃圾收集

    应用通过调用 malloc 和 free 来分配和释放堆块。应用要负责释放所有不再需要的已分配块。

    垃圾收集器 是一种动态存储分配器,它自动释放程序不再需要的己分配 块。这些块称为垃圾 。

    自动回收堆存储的过程叫做垃圾收集。在一个支持垃圾收集的系统中,应用显式分配堆块,但是从不显示地释放它们。在 C 程序的上下文中,应用调用 malloc,但是从不调用 free。反之,垃圾收集器定期识别垃圾块,并相应地调用 free,将这些块放回到空闲链表中。

    Mark&Sweep 垃圾收集器

    •Mark&Sweep垃圾收集器由标记阶段和清除阶段组成,标记阶段标记出根节点所有可达的和已分配的后继,清除阶段释放每个未被标记的已分配块。

    •在对Mark&Sweep的描述中使用下列函数

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

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 4000行 30篇 350小时
    第一周 0/ 0 2/2 20/30
    第二周 100/100 1/3 20/50
    第三周 300/400 1/4 20/70
    第四周 0/400 0/4 0/70
    第五周 300/700 2/6 20/90
    第六周 100/800 2/8 20/110
    第七周 100/900 2/10 20/130
    第八周 0/900 3/13 20/150
    第九周 200/1100 3/16 20/170
    第十周 300/1400 3/19 25/195
    第十一周 500/1900 3/22 25/230
    第十二周 0/1900 3/25 10/240
    第十三周 500/2400 2/27 25/265
    第十四周 300/2700 1/28 25/290

    参考资料

  • 相关阅读:
    Socket编程实现客户端与服务器一对一聊天
    HttpClient获取页面信息与Jsoup封装获取
    代码推送
    re正则
    MySQL 的主从复制
    关于前后端的缓存
    session/cookie/token
    如何保证缓存(redis)与数据库(MySQL)的一致性
    进程与线程(程序与任务)
    QA/QC
  • 原文地址:https://www.cnblogs.com/J000/p/6194373.html
Copyright © 2011-2022 走看看