zoukankan      html  css  js  c++  java
  • # 2017-2018-1 20155224 《信息安全系统设计基础》第十一周学习总结

    2017-2018-1 20155224 《信息安全系统设计基础》第十一周学习总结

    教材学习内容总结

    1. 理解虚拟存储器的概念和作用
    2. 理解地址翻译的概念
    3. 理解存储器映射
    4. 掌握动态存储器分配的方法
    5. 理解垃圾收集的概念
    6. 了解C语言中与存储器有关的错误
    • 虚拟存储器(Virtual Memory),是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完善交互,它为每个进程提供一个大的,一致的,私有地址空间。通过一个清晰的机制,虚拟存储器提供了三个要重的能力:

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

      • 虚拟内存是核心的
      • 虚拟内存是强大的
      • 虚拟内存是危险的
    • 物理地址:计算机系统的主存被组织成一个人由M个连续的字节到校的单元组成的数组。每字节都有一个唯一的物理地址。第一个字节的地CPU生成址为0,接下来的字节地址为1,再下一个是2,依次类推。给定这种简单的结构,CPU访问存储器的最自然的方式就是使用物理地址。

    • 虚拟地址:早期的PC使用物理寻址,而且诸如数字信号处理器,嵌入式微控制器以及Cray超级计算机这样的系统仍然继续使用这种寻址方式。而为通用计算机设计师的现代处理器使用的是虚拟寻址。使用虚拟寻址时,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址(这个过程叫做地址翻译,相关硬件为存储器管理单元MMU)

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

      • 线性地址空间:地址空间中的整数是连续的

      • 虚拟地址空间:一个带有虚拟存储器的系统中,CPU从一个有N=2^n个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间。

    • 虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组,每个字节都有一个唯一的虚拟地址,这个唯一的虚拟地址是作为到数组的索引的。

    • VM系统通过将虚拟存储器分割为称为虚拟页的大小固定的块作为磁盘和主存之间的传输单元,每个虚拟页大小为P=2^p。物理存储器被分割为大小也为P字节的物理页称为帧。

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

      • 未分配的
      • 缓存的
      • 未缓存的
    • DRAM缓存的组织结构是由巨大的不命中开销驱动的。

      • 全相联:任何虚拟页可以放在任何的物理页中
      • 因为对磁盘的访问时间很长,总是使用写回而不是直写
      • 更复杂精密的替换算法
    • 软硬件联合,包括操作系统软件、MMU(内存管理单元)中的地址翻译硬件、一个存放在物理内存中叫做页表的数据结构,提供虚拟内存系统判定虚拟页是否换存在DRAM中的某个地方的功能。

      • 如果是,确定虚拟内存放在哪个物理页中。
      • 如果不命中,系统判断虚拟页存放在磁盘的哪个位置,在物理内存中选择一个牺牲页,并将虚拟页从磁盘复制到DRAM中,替换这个牺牲页。
    • 页表:存放在物理存储器一个数据结构,叫做页表(page table)。页表将虚拟页映射到物理页。

    • 页表就是一个PTE(page table entry,页表条目)的数组。虚拟地址空间中的每个页在页表中的一个固定偏移量处都有一个PTE。

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

      • 如果设置了有效位,地址字段就表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页。
      • 如果未设置有效位,一个空地址表示虚拟页未分配,否则,这个地址就指向该虚拟页在磁盘中的起始位置。
    • DRAM缓存的组织结构

      • 不命中处罚很大
      • 是全相联的——任何虚拟页都可以放在任何的物理页中。
      • 替换算法精密
      • 总是使用写回而不是直写。
    • 页命中

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

      • 缺页异常:会调用内核中的缺页异常处理程序,选择一个牺牲页。
      • 页:虚拟存储器的习惯说法,就是块
      • 交换=页面调度:磁盘和存储器之间传送页的活动
      • 按需页面调度:直到发生不命中时才换入页面的策略,所有现代系统都使用这个。
    • 局部性原则保证了在任意时刻,程序将往往在一个较小的活动页面集合上工作,这个集合叫做工作集/常驻集。

    • 颠簸:工作集大小超出了物理存储器的大小。

    • 虚拟存储器作为存储器管理的工具

      • 操作系统每个进程都有一个独立的页表,因而也就是一个独立的虚拟地址空间。
      • 按需页面调度和独立的虚拟地址空间的结合,对系统中存储器的使用和管理造成了深远的影响。特别地,VM简化了链接和加载、代码和数据共享,以及应用程序的存储器分配。
      • 简化链接:独立的地址空间允许每个进程为它的存储器映像使用相同的基本格式,因而不管代码和数据实际存放在物理存储器的何处,它的一致性极大地简化了链接器的设计和实现,允许生成全链接的可执行文件,这些可执行文件是独立于物理存储器中代码和数据的最终位置的。
      • 简化加载:虚拟存储器使得容易向存储器中加载可执行文件和共享文件对象。系统加载时只需分配那些数据和代码区域的连续的虚拟页面区域,将它们标识为无效,且页面条目地址指向目标文件中适当的位置。
      • 简化共享:操作系统通过不同进程的页表,将各自的私有的数据和代码映射到不同的物理页面;而对共享的代码和数据,就将适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享这部分代码的一个拷贝。
      • 简化存储器分配:由于页表的工作方式,操作系统只需分配一个适当数字个连续的虚拟存储器页面,但可以映射到任意分散的物理存储器中。
      • 一个概念:将一组连续的虚拟页面映射到任意一个文件中的任意一个位置的表示法叫做存储器映射。
    • 虚拟存储器作为存储器保护的工具

      • PTE的三个许可位:
        • SUP:表示进程是否必须运行在内核模式下才能访问该页
        • READ:读权限
        • WRITE:写权限
      • 在PTE上添加一些额外的许可位来控制对一个虚拟页面内容的访问。例如:SUP位表示进程是否必须运行在内核模式下才能访问网页;READ位和WRITE位的读和写进行访问。如果一条指令违反了这些许可条件,那么cpu就触发一个一般保护故障,将控制传递给一个内核中的异常处理程序。
    • 地址翻译:地址翻译是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中元素之间的映射。

    • 页表基址寄存器:

      • CPU中的一个控制寄存器,叫做页表基址寄存器(page table base register,PTBR)指向当前页表。N位的虚拟地址包含两个部分:一个p位的VPO(virtual page offset,虚拟页面偏移)和一个n-p位的VPN(virtual page number)。MMU利用VPN来选择适当的PTE。如VPN0选择PTE0。因为物理和虚拟页面都是p字节的,所以PPO(physical page offset物理页面偏移)和VPO是相同的,所以,将页表条目中PPN(physical page number,物理页号)和虚拟地址中的VPO串联起来,就是相应的物理地址。
    • 页面命中完全由硬件处理的,而处理缺页要求硬件和OS内核协作完成。 - 多级页表——采用层次结构,用来压缩页表。

      • 以两层页表层次结构为例,好处是:
        • 如果一级页表中的一个PTE是空的,那么相应的二级页表就根本不会存在
        • 只有一级页表才需要总是在主存中,虚拟存储器系统可以在需要时创建、页面调入或调出二级页表,只有最经常使用的二级页表才缓存在主存中。
    • 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:显式空闲链表与隐式空闲链表的不同之处比较。
    • 问题1解决方案:
    1. 分配时间

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

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

    1. 链表形式

    隐式——隐式空闲链表

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

    代码托管

    (statistics.sh脚本的运行结果截图)

    上周考试错题总结

    • Unix/Linux中,对于代码fd=open("foo",O_WRONLY,0766),umask=022,下面说法正确的是()
      A .
      进程对foo是只写的
      B .
      同组成员能写foo
      C .
      使用者可以执行foo
      D .
      任何人都可以写foo
      正确答案: A C 你的答案: A B C D

    • 关于open(2),下面说法正确的是( )
      A .
      flag 参数中O_RDONLY,O_WRONLY,O_RDWR至少要有一个
      B .
      O_RDONLY|O_WRONLY == O_RDWR
      C .
      fd=open("foo.txt",O_WRONLY|O_APPEND,0),调用write(fd,buff,n)写入foo.txt的数据不会破坏已有数据。
      D .
      fd=open("foo.txt",O_WRONLY|O_APPEND,0644),必将导致其他人不能写foo.txt
      正确答案: A C 你的答案: A C D

    • Linux中下列概念中可以用Unix I/O处理的是()
      A .
      普通文件
      B .
      设备文件
      C .
      目录
      D .
      套接字
      正确答案: A B C D 你的答案: A C D

    • 输入输出是针对()来讲的?
      A .
      CPU
      B .
      主存
      C .
      I/O设备
      D .
      计算机
      正确答案: B 你的答案: C

    结对及互评

    点评模板:

    • 博客中值得学习的或问题:
      • xxx
      • xxx
      • ...
    • 代码中值得学习的或问题:
      • xxx
      • xxx
      • ...
    • 其他

    本周结对学习情况

    - [20155219](http://www.cnblogs.com/paypay/)
    - 结对照片
    

    - 结对学习内容
        - 第九章教材内容
    

    其他(感悟、思考等,可选)

    xxx
    xxx

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:XX小时

    • 实际学习时间:XX小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    032 代码复用与函数递归
    031 实例7-七段数码管绘制
    030 函数的定义与使用
    029 函数和代码复用
    2.4 Buffer
    2.3 字符串链接
    2.2 去除字符串特别字符
    2.1 字符串查询
    存储数据_文件读写
    template模板
  • 原文地址:https://www.cnblogs.com/nxy970408/p/7967471.html
Copyright © 2011-2022 走看看