• 深入理解计算机系统--虚拟存储器


    1.物理和虚拟寻址:
    虚拟寻址:CPU产生一个虚拟地址(virtual address),由存储器管理单元(Memory Management Unit,NMU)与操作系统共同处理虚拟地址,
    最终生成物理地址,进行访存。

    2.地址空间:主存中的每一个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理空间的物理地址。这就是虚拟存储器的基本思想。

    3.(1)虚拟存储器作为缓存的工具:
    虚拟存储器为一个存放在磁盘上的N个连续的字节大小的单元组成的数组。
    物理存储器即时主存(DRAM),作为缓存来对应存储磁盘上的每一页。
    VM系统将虚拟存储器分割为称为虚拟页的大小固定的块。(VP,virtual page)
    物理存储器也分为和虚拟存储器的虚拟页大小相等的物理页。(PP,Physical page)
    DRAM在主存中缓存虚拟页。
    (2)因为对磁盘的访问时间比较长,所以一般情况下对与DRAM来说是使用写回法而不是写直达法。
    页表:表示一个页表条目。每一个条目记录一个标志位和一个物理地址。
    DRAM缓存和磁盘是全相联的,即每个物理页可以对应任意的虚拟页。
    (3)虚拟存储器的实际应用的效率同样基于局部性原理。
    局部性原则保证了在任意时刻,程序将往往在一个较小的活动页面集合上工作,这个集合叫做工作集或者常驻集。
    当工作集的大小超出了物理存储器的大小时,那么程序将产生颠簸(thrashing)。

    4.VM简化链接(允许每个进程的存储器映像使用相同的基本格式)。/简化加载/简化共享/简化存储器的分配。

    5.VM作为存储器的保护工具:通过设置一些标记位来限制进程对存储器的读写访问。

    6.使用多级页表以防止页表过大带来的影响。

    7.存储器映射:Linux将一个虚拟存储区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储区域的内容。这个过程成为存储器映射。
    交换空间限制当前进程能够分配的虚拟页面的总数。

    8.当运行时需要额外的虚拟存储器时,用 动态存储器分配器 具有更好的移植性。
    动态存储器分配器维护着进程的虚拟存储器区域,成为堆。对于每个进程,内核维护着一个变量brk,它指向堆的顶部。
    分配器有两种基本风格。两种风格都要求应用显示地分配块。不同之处在于由那个实体释放已分配的块。
    分为:显示分配器,要求应用显示地释放已分配的块。 用malloc申请的空间需要通过调用free来释放。
    隐式分配器,要求分配器检测一个已分配的块何时不再被程序使用,那么就释放这个块。

    9.碎片问题:一般分为内部碎片与外部碎片。

    10.注意指针和他们所指向的对象大小不一定是相同的。
    所以函数如:

    1 int **makeArray(int n,int m)
    2 {
    3 int i;
    4 int **A = (int **)malloc(n*sizeof(int *)); //注意其中sizeof参数应该是int *类型的!
    5 for(i = 0;i < n; i++)
    6 A[i] = (int *)malloc(m * sizeof(int));
    7 return A;
    8 }
  • 相关阅读:
    C#网络编程TCP通信实例程序简单设计
    C#网络编程TCP通信实例程序简单设计
    2329: 密码破解【数组】
    纸牌游戏小猫钓鱼
    认识栈
    认识队列
    2754: C++习题快速排序
    3047: 快速排序算法
    Problem A: C语言习题 链表建立,插入,删除,输出
    Problem C: 动态规划基础题目之数字三角形
  • 原文地址:https://www.cnblogs.com/rickhsg/p/3741184.html
Copyright © 2020-2023  润新知