精华内容
下载资源
问答
  • 2021-02-26 11:19:56


    一、虚拟内存

      虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块乘坐一页面(page)。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

    二、虚拟内存的作用

      虚拟内存提供了三个重要的能力:缓存、内存管理、内存保护。

      1. 缓存。将内存视为一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。

      2. 内存管理。为每个进程提供了一致的地址空间,简化内存管理。
      1)简化链接。独立地址空间允许每个进程的内存映像使用相同的基本格式。
      2)简化加载。
      3)简化共享。独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。在部分情况下,进程间还是需要共享代码和数据的,例如每个C程序都会调用C标准库中的程序(printf)、都需要调用相同的内核代码。操作系统通过将不同进程中适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享这部分代码的一个副本,而不是在每个进程中都包括单独的内核和C标准库的副本。
      4)简化内存分配。当运行在用户进程的程序要求额外的堆空间时,操作系统分配k个连续的虚拟内存页面,并且将它们映射到物理内存中任意位置的k个任意的物理页面。由于页表的存在,操作系统没必要分配k个连续的物理页面,页面可随机地分散在物理内存中。

      3. 内存保护。保护了每个进程的地址空间不被其他进程破坏。操作系统会控制进程对内存系统的访问,例如:
      1)不允许一个用户进程修改它的只读代码段;
      2)不允许用户进程读或修改任何内核中的代码和数据结构;
      3)不允许用户进程读或写其他进程的私有内存;
      4) 不允许用户进程修改任何其他进程共享的虚拟页表。

    参考文章:https://www.jianshu.com/p/baf3a13c47db

    三、分页系统实现虚拟内存原理

    1、虚拟内存技术的实现

      虚拟内存技术允许将一个作业分多次调入内存。采用连续分配方式时,会使相当一部分内存空间都处于暂时或“永久”的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。因此,虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。
      虚拟内存的实现有三种方式:请求分页存储管理、请求分段存储管理、请求段页式存储管理。
      不管是哪种方式,都需要有一定的硬件支持。一般需要的支持有以下几个方面:
      1)一定容量的内存和外存;
      2)页表机制(或段表机制),作为主要的数据结构。
      3)中断机构,当用户程序要访问的部分尚未调入内存时,则产生中断;
      4)地址变换机构,逻辑地址到物理地址的变换。

    2、请求分页管理方式

      大部分虚拟内存系统中都使用一种称为分页的技术。而在分页存储管理方式中,又根据运行作业时是否要把作业的所有页面都装入内存才能运行,分为基本分页存储管理方式和请求分页存储管理方式。显然,要想实现虚拟内存,我们需要使用请求分页管理方式。
      在任何一台计算机上, 程序引用了一组内存地址。地址可用过索引、基址寄存器、段寄存器或其他方式产生。由程序产生的这些地址称为虚拟地址,它们构成了一个虚拟地址空间。在没有虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到内存管理单元(Memory Management Unit,MMU),MMU把虚拟地址映射为物理内存地址。
      虚拟地址空间按照固定大小划分成被称为页面(page)的若干单元。在物理内存中对应的单元称为页框(page frame)。页面和页框的大小通常是一样的,但实际系统中的页面大小512字节到1GB。对应于64KB的虚拟地址空间和32KB的物理内存,可得到16个虚拟页面和8个页框。
      在请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。

    更多相关内容
  • 内存与cpu工作原理

    千次阅读 2017-05-03 22:25:47
    内存:通电状态下进行数据存储   cpu内部大致结构 程序控制器(CPU的控制中心) 职责: 1 分析或解释 指令 2 根据或析与解释结果向其他组件发出命令 3 控制cpu的工作进度和工作方式   当一条指令进入...

    cpu:执行程序

    内存:通电状态下进行数据存储

     

    cpu内部大致结构

    程序控制器(CPU的控制中心)

    职责:

    1 分析或解释 指令

    2 根据或析与解释结果向其他组件发出命令

    3 控制cpu的工作进度和工作方式

     

    当一条指令进入cpu……………….后!

    分析或解释该指令的编码内容;

    确定为执行该指令应该完成的动作;

    确定指令相关的参数;如:对于一个“加法指令”,需要确定两个被加数的【地址】

    将所需的数据从【主存储器】读取到 CPU的【寄存器】中;

    要求【算术逻辑运算器】进行相关的运算动作;

    指示【算术逻辑运算器】将运算结果放入【寄存器】或【主存储器】中。

     

    算术逻辑运算器(ALU:主要进行算术运算和逻辑运算)

    例子:

    1 一条指令进入cpu包含两个加数的操作地址

    2 程序控制器判断数据是在寄存器还是在主存储器中

    3 程序控制器取出数据并提交给算术逻辑运算器

    4 进行计算

    5 根据程序控制器的指示将结果存入寄存器或者主存中

     

    中断处理器(紧急事件引发的暂停)

    例子:

    1 发现中断信号

    2 程序控制器暂停正在运行的程序,并保存运行现场(cpu中的各种状态信息)

    3 程序控制器根据中断信号的编码,从特定位置启动中断处理程序(中断处理程序由操作系统提供)

    4 中断程序处理完成后,程序控制器恢复被暂停的程序

     

    中断信号来源:

    ·鼠标,键盘。。。。。。。。。。

    中断信号的接受:

    ·中断处理器接受中断的信号,并将中断信号的编码、中断处理程序的起始地址传给程序控制器

    中断信号的检测:

    ·中断程序在执行完成每条中断指令后,都会检测是否有新的中断指令出现

     

    寄存器组(内存与cpu之间的存储空间)

    1 寄存器组位于cpu中,存储空间小,可存放一次操作指令的数据

    2 需要区别与高速缓存,高速缓存一般情况下也会集成在cpu上,但存储容量远大于寄存器组,高速缓存用户放置一些常用数据

     

    指令(程序的基本单位)

    1 每一条指令都规定了cpu执行指令应该完成的工作(运算或者控制动作)

    2 控制cpu相关部件执行的操作,以配合完成指令所规定的功能

    3 工作周期为:“读取指令—执行指令” 周期循环的工作

     

    指令系统

    CPU芯片的硬件与使用它的软件之间的一种严格的协议,反映了CPU能够完成的全部功能

    规定:

    1能执行指令的全部类别

    2 指令的编码方式和每一类指令所涉及的参数等

    3 每一条指令用若干字节的二进制编码表示,包括它要完成的动作及其相关的参数

    4 指令分类:

             存储访问指令

    算术运算指令

    逻辑运算指令

    条件判断和分支转移指令

    输入输出指令

    其他用于系统控制的指令

     

    CPU向主存写入数据或读取数据

    三根总线:地址总线、控制总线、数据总线

    地址总线:放置存储单元地址

    控制总线:读或写标示

    数据总线:需要写入主存的数据或从主存读出的数据

     

    补充

    内部总线(连接运算器、控制器、各种寄存器的总线)

    CPU外部总线是连接南北桥、内存的总线

    展开全文
  • C++ 中内存对齐原理作用

    千次阅读 多人点赞 2018-01-07 16:54:46
    struct/class/union内存对齐原则有四个:1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小...

    struct/class/union内存对齐原则有四个:

    1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon。

    2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部”最宽基本类型成员“的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)。

    3).收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的”最宽基本类型成员”的整数倍.不足的要补齐.(基本类型不包括struct/class/uinon)。

    4).sizeof(union),以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真正存储于该地址。

    实例解释:下面以class为代表

    No.1

    class Data
    {
        char c;
        int a;
    };
    
    cout << sizeof(Data) << endl;

    No.2

    class Data
    {
        char c;
        double a;
    };
    
    cout << sizeof(Data) << endl;

    显然程序No.1 输出的结果为 8 No.2 输出的结果为 16 .

    No.1最大的数据成员是4bytes,1+4=5,补齐为4的倍数,也就是8。而No.2为8bytes,1+8=9,补齐为8的倍数,也就是16。

    No.3

    class Data
    {
        char c;
        int a;
        char d;
    };
    
    cout << sizeof(Data) << endl;

    No.4

    class Data
    {
        char c;
        char d;
        int a;
    };
    
    cout << sizeof(Data) << endl;

    No.3运行结果为 12 No.4运行结果为 8

    class中的数据成员放入内存的时候,内存拿出一个内存块来,数据成员们排队一个一个往里放,遇到太大的,不是把自己劈成两半,能放多少放多少,而是等下一个内存块过来。这样的话,就可以理解为什么No.3,No.4两端的代码输出结果不一样了,因为左边是1+(3)+4+1+(3)=12,而右边是1+1+(2)+4=8。括号中为补齐的bytes。

    No.5

    class BigData
    {
        char array[33];
    };
    
    class Data
    {
        BigData bd;
        int integer;
        double d;
    };
    
    cout << sizeof(BigData) << "   " << sizeof(Data) << endl;

    No.6

    class BigData
    {
        char array[33];
    };
    
    class Data
    {
        BigData bd;
        double d;
    };
    
    cout << sizeof(BigData) << "   " << sizeof(Data) << endl;

    No.5和No.6运行结果均为: 48

    在默认条件下,内存对齐是以class中最大的那个基本类型为基准的,如果class中有自定义类型,则递归的取其中最大的基本类型来参与比较。在No.5和No.6中内存块一个接一个的过来接走数据成员,一直到第5块的时候,BigData里只剩1个char了,将它放入内存块中,内存块还剩7个bytes,接下来是个int(4bytes),能够放下,所以也进入第5个内存块,这时候内存块还剩3bytes,而接下来是个double(8bytes),放不下,所以要等下一个内存快到来。因此,No.5的Data的size=33+4+(3)+8=48,同理No.6应该是33+(7)+8=48。

    顺便提一下Union: 共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。

    No.7

    class A
    {
        int i;
        char c1;
    }
    
    class B:public A
    {
        char c2;
    }
    
    class C:public B
    {
        char c3;
    }

    sizeof(C)结果是多少呢,gcc和vs给出了不同的结果,分别是8、16

    gcc中:C相当于把所有成员i、c1、c2、c3当作是在一个class内部,(先继承后对齐)

    vs中:对于A,对齐后其大小是8;对于B,c2加上对齐后的A的大小是9,对齐后就是12;对于C,c3加上对齐后的B大小是13,再对齐就是16 (先对齐后继承)

    关于c++对象继承后的内存布局,更详细的分析可以《深度探索参考c++对象模型》第三章

    内存对齐的主要作用是:

    1、 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

    2、 性能原因:经过内存对齐后,CPU的内存访问速度大大提升。具体原因稍后解释。

    这里写图片描述

    这是普通程序员心目中的内存印象,由一个个的字节组成,而CPU并不是这么看待的。

    这里写图片描述

    CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的。块大小成为memory access granularity(粒度) 本人把它翻译为“内存读取粒度” 。

    假设CPU要读取一个int型4字节大小的数据到寄存器中,分两种情况讨论:

    1、数据从0字节开始

    2、数据从1字节开始

    再次假设内存读取粒度为4。

    这里写图片描述

    当该数据是从0字节开始时,很CPU只需读取内存一次即可把这4字节的数据完全读取到寄存器中。

    当该数据是从1字节开始时,问题变的有些复杂,此时该int型数据不是位于内存读取边界上,这就是一类内存未对齐的数据。

    这里写图片描述

    此时CPU先访问一次内存,读取0—3字节的数据进寄存器,并再次读取4—5字节的数据进寄存器,接着把0字节和6,7,8字节的数据剔除,最后合并1,2,3,4字节的数据进寄存器。对一个内存未对齐的数据进行了这么多额外的操作,大大降低了CPU性能。

    这还属于乐观情况了,上文提到内存对齐的作用之一为平台的移植原因,因为以上操作只有有部分CPU肯干,其他一部分CPU遇到未对齐边界就直接罢工了。

    展开全文
  • 图解内存的工作原理及时序介绍

    千次阅读 2021-01-13 15:11:35
    并且,内存原理、结构与时序多年不会改变,无论将来内存技术如何进步,相信这篇文章的存在价值都不会打折扣。本文亦希望能通过对DRAM基本原理以及时序的介绍,在内存设置以及XMP的制作上有所帮助


    前言

    内存是PC配件中结构最简单的,但在BIOS中却是最难调的,很多玩家超频都卡在内存上。并且,内存的原理、结构与时序多年不会改变,无论将来内存技术如何进步,相信这篇文章的存在价值都不会打折扣。本文亦希望能通过对DRAM基本原理以及时序的介绍,在内存设置以及XMP的制作上有所帮助。


    第一部分:工作原理

    DRAM基本组成

    • 内存是由DRAM(动态随机存储器)芯片组成的。DRAM的内部结构可以说是PC芯片中最简单的,是由许多重复的“单元”——cell组成,每一个cell由一个电容和一个晶体管(一般是N沟道MOSFET)构成,电容可储存1bit数据量,充放电后电荷的多少(电势高低)分别对应二进制数据0和1。
    • 由于电容会有漏电现象,因此过一段时间之后电荷会丢失,导致电势不足而丢失数据,因此必须经常进行充电保持电势,这个充电的动作叫做刷新,因此动态存储器具有刷新特性,这个刷新的操作一直要持续到数据改变或者断电。而MOSFET则是控制电容充放电的开关。DRAM由于结构简单,可以做到面积很小,存储容量很大。
      在这里插入图片描述

    内存地址

    • 内存中的cell按矩阵形排列,每一行和每一列都会有一个对应的行地址线路(正规叫法叫做word line)和列地址线路(正规叫法是bit line),每个具体的cell就挂接在这样的行地址线路和列地址线路上,对应一个唯一的行号和列号,把行号和列号组合在一起,就是内存的地址。
      在这里插入图片描述
    • 上图是Thaiphoon Burner的一个SPD dump,每个地址是一个字节。不过我们可以把这些数据假设成只有一个bit,当成是一个简单的内存地址表,左边竖着的是行地址,上方横着的是列地址。例如我们要找第七行、倒数第二列(地址为7E)的数据,它就只有一个对应的值:FD。当然了,在内存的cell中,它只能是0或者1。

    寻址

    • 数据要写入内存的一个cell,或者从内存中的一个cell读取数据,首先要完成对这个cell的寻址。寻址的过程,首先是将需要操作的cell的对应行地址信号和列地址信号输入行/列地址缓冲器,然后先通过行解码器(Row Decoder)选择特定的行地址线路,以激活特定的行地址。
    • 每一条行地址线路会与多条列地址线路和cell相连接,为了侦测列地址线路上微弱的激活信号,还需要一个额外的感应放大器(Sense Amplifier)放大这个信号。
    • 当行激活之后,列地址缓冲器中的列地址信号通过列解码器(Column Decoder)确定列地址,并被对应的感应放大器通过连接IO线路,这样cell就被激活,并可供读写操作,寻址完成。从行地址激活,到找到列地址这段时间,就是tRCD。
      在这里插入图片描述

    内存cell的基本操作

    • 内存中的cell可以分为3个基本操作,数据的储存、写入与读取。为了便于理解,我不打算直接从电路控制上对cell操作进行说明,而是希望通过模型类比来达到说明问题的目的,如有不严谨之处,高手勿怪。要对内存cell进行读写操作,首先要完成上述寻址过程,并且电容的充电状态信号要被感应放大器感应到,并且放大,然后MOSFET打开,电容放电,产生电势变化,把电荷输送到IO线路,导致线路的电势也变化。当然,这只是个简单的描述,以下我们先来了解硅晶体中“电容”的结构和MOSFET的控制原理。

    硅晶体中的“电容”

    • 这里之所以“电容”两个字被打上引号,是因为硅晶体中并没有真正意义上的电容。硅晶体中的电容是由两个对置的触发器组成的等效电容。例如两个非门(Nor Gate)用如下图的方式对接。它可以通过周期性施加特定的输入信号,以把电荷保留在电路中,充当电容的作用。如下图,两个非门的输入端R和S互相交替做0和1输入,就可以把电荷储存在电路中。整个动态过程就是这样:
      在这里插入图片描述
    • 而R和S的波形就是如下图所示,刚好互为反相,差半个周期:
      在这里插入图片描述
    • 要让电容放电,我们只需要把R和S同时输入1或者0即可。因此这种电容的逻辑关系很简单:在同一时刻R和S输入状态不同(即存在电势差)时,电容为充电状态;在同一时刻R和S输入状态相同(即电势差为0)时,电容为放电状态。
      在这里插入图片描述

    MOSFET的控制原理——水库模型

    • 要说明这个MOSFET的控制原理,我们借助一个水库的模型来说明。MOSFET有三个极,分别是源极(Source)、漏极(Drain)和栅极(Gate)。下图左边就是一个MOSFET的电路图,右边是我们画出的一个水库模型。
      在这里插入图片描述
    • 图中S为源极,D为漏极,G为栅极。S极连接着电容,D级连接列地址线路,并接到数据IO,G则是控制电荷流出的阀门,连接行地址线路。电容在充电后电势会改变,这样S极的电势就会跟着改变,与D极形成电势差,而G极的电势,就决定了S极有多少电荷可以流入D极。
    • 由于电子是带负电荷,因此电子越多电势就越低。为了不至于混淆概念,我们把水池顶部电势定为0V,水池底部电势定为5V(仅举例说明,DRAM中的电容实际电压未必是5V)。当电子数量越多时,电势越低,接近0V,电子数量越少时,电势越高,接近5V。
      在这里插入图片描述
    • 用水库模型说明,就是左边的水池水量升高(电容充电后),当阀门关闭时,左边的水是不会往右边流的。然后阀门打开(降低,电势升高),左边的水就可以往右边流,阀门的高度就决定了有多少水能流去右边的水道(但是在数字电路中,MOSFET只有开和关两种状态,因此下文提到的打开MOSFET就是全开);
    • 同样道理如果右边水多,阀门打开之后也可以向左边流。因此在水库模型中,电容就充当了左边的水池,而MOSFET的栅极就充当了阀门,列地址线路和IO则充当了右边的水道。

    储存数据

    • MOSFET栅极电势为0V时,电容的电荷不会流出,因此数据就可以保存我们可以用2.5V为参考分界线,电容电势低于2.5V时,表示数据0,电势高于2.5V时,表示数据1。例如上一楼水库模型的左图,电容中储存的电子数高于一半的高度,电势低于2.5V,因此可以表示数据0。
    • 但以上只是理论情况,实际上电容会自然漏电,电子数量会逐渐减少,电势就会逐渐升高,当电势升高到2.5V以上时,数据就会出错,因此每隔一段时间必须打开MOSFET往电容中充电,以保持电势,这就是刷新。因此,数据的储存主要就是对电容中电势的保持操作。

    写入数据

    • 数据写入的操作分为写入0和写入1两种情况。写入前,电容原有的情况可能是高电势与低电势的状态,我们不用管它。写入0和写入1对cell的操作不尽相同,我们分别来看。
    • 先来看写入0的操作。写入开始时,IO线路上电势为0(水道处于水位最高点),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中的电势就跟着降低(水位升高),直到接近0V(水池被灌满),写入0完成,栅极电势降回0V,阀门关闭。
      在这里插入图片描述
    • 再看写入1的操作。写入开始时,IO线路上的电势为5V(水道水位为最低点),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中的电势跟着升高(水流出并降低水位)到接近5V,写入1完成,栅极电势回到0V,阀门关闭。
      在这里插入图片描述

    读取数据

    • 读取的时候,对漏极的电压操作跟写入有些不同。因为水道中的水比水池中的多,或者说水道的容量比水池要大得多。如果水道(漏极)的水为满或者空,在阀门打开的时候很容易出现水道的水倒灌进水池的现象,或是水池的水全部流去水道,这样就有可能导致电容中的电势状态改变,电容对应储存的0或者1也会改变。所以读取数据的时候,IO线路的电压应为1/2的满电势,即2.5V。
    • 读取也同样分读取0和1两种情况。在读取之前,电容中的电势应该是大于或者小于2.5V的,分别代表存储了1和0。由于刷新机制的存在,应该不会允许出现等于2.5V的情况。
    • 首先看读取0操作。电容中为低电势(假设为0V,水池为高水位),IO线路上电势升高至2.5V(这时水道水位比水池低),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中电势升高(水位降低),但由于水道容量较大,因此水位不会升高太多,但是总归也会有个电势的变低,最终电容与IO线路上的电势都变成0-2.5V的一个中间值,并且接近2.5V(假设为2.3V)。这时候感应放大器检测到IO线路上电势低于2.5V,因此识别出0读出。
      在这里插入图片描述
    • 再看读取1操作。电容中为高电势(假设为5V,水池空),IO线路上电势升高至2.5V(这时候水道水位比水池高),MOSFET栅极电势升高到5V(水库阀门降到最低),阀门打开,电容中电势降低(水位升高),但由于水道容量较大,水位不会降低太多,不过多少也会降低一点(电势会升高),假设升高到2.7V。这时候感应放大器检测到IO线路的电势高于2.5V,识别出1读出。
      在这里插入图片描述
    • 以上讲述的只是从cell到内存IO线路的读写操作,至于CPU-IMC-内存的读写操作,不在本文讨论范围。

    二、时序介绍

    时序及相关概念

    • 以下我把时序分为两部分,只是为了下文介绍起来作为归类,非官方分类方法。
    • 第一时序:CL-tRCD-tRP-tRAS-CR,就是我们常说的5个主要时序。
    • 第二时序:(包含所有XMP时序)
    • 在讲时序之前,我想先让大家明白一些概念。内存时钟信号是方波,DDR内存在时钟信号上升和下降时各进行一次数据传输,所以会有等效两倍传输率的关系。
    • 例如DDR3-1333的实际工作频率是666.7MHz,每秒传输数据666.7*2=1333百万次,即1333MT/s,也就是我们说的等效频率1333MHz,再由每条内存位宽是64bit,那么它的带宽就是:
    1333MT/s*64bit/8(8bit是一字节)=10667MB/s。
    
    • 所谓时序,就是内存的时钟周期数值,脉冲信号经过上升再下降,到下一次上升之前叫做一个时钟周期,随着内存频率提升,这个周期会变短。例如CL9的意思就是CL这个操作的时间是9个时钟周期。
    • 另外还要搞清楚一些基本术语:

    Cell:颗粒中的一个数据存储单元叫做一个Cell,由一个电容和一个N沟道MOSFET组成。
    Bank:8bit的内存颗粒,一个颗粒叫做一个bank,4bit的颗粒,正反两个颗粒合起来叫做一个bank。一根内存是64bit,如果是单面就是8个8bit颗粒,如果是双面,那就是16个4bit的颗粒分别在两面,不算ECC颗粒。
    Rank:内存PCB的一面所有颗粒叫做一个rank,目前在Unbuffered台式机内存上,通常一面是8个颗粒,所以单面内存就是1个rank,8个bank,双面内存就是2个rank,8个bank。Bank与rank的定义是SPD信息的一部分,在AIDA64中SPD一栏可以看到。
    DIMM:指一条可传输64bit数据的内存PCB,也就是内存颗粒的载体,算上ECC芯片,一条DIMM PCB最多可以容纳18个芯片。

    第一时序

    • CAS Latency(CL):CAS即Column Address Strobe,列地址信号,它定义了在读取命令发出后到数据读出到IO接口的间隔时间。由于CAS在几乎所有的内存读取操作中都会生效(除非是读取到同一行地址中连续的数据,4bit颗粒直接读取间隔3个地址,8bit颗粒直接读取间隔7个地址,这时候CAS不生效),因此它是对内存读取性能影响最强的。如下图,蓝色的Read表示读取命令,绿色的方块表示数据读出IO,中间间隔的时间就是CL。
      在这里插入图片描述
    • 已知CL时钟周期值CAS,我们可以使用以下公式来计算实际延迟时间tCAS:
    tCAS(ns)=(CAS*2000)/内存等效频率
    
    • 例如,DDR3-1333 CL9内存实际CAS延迟时间=(9*2000)/1333=13.50 ns
      或者反过来算,假如已知你的内存可以在7.5ns延迟下稳定工作,并且你想要DDR3-2000的频率,那么你可以把CL值设为8T(实际上8ns,大于7.5ns即可),如果你想要DDR3-1600的频率,那么你的CL值可以设到6T(实际7.5ns)。
      这个公式对于所有用时钟周期表示延迟的内存时序都可以用。
    • 说到这个公式,我想顺便说说大家对频率和时序的纠结问题。首先来回顾一下DDR一代到三代的一些典型的JEDEC规范,并按照上边那个公式算一下它的CL延迟时间:
    DDR-400 3-3-3-8:(3*2000)/400=15 ns
    DDR2-800 6-6-6-18:(6*2000)/800=15 ns
    DDR3-1333 9-9-9-24:刚才算了是13.5 ns
    
    • 再来看看每一代的超频内存的最佳表现(平民级,非世界纪录):
    DDR1 Winbond BH-5 DDR-500 CL1.5:(1.5*2000)/500=6 ns
    DDR2 Micron D9GMH DDR2-1400 CL4:(4*2000)/1400=5.71 ns
    DDR3 PSC A3G-A DDR3-2133 CL6:(6*2000)/2133=5.63 ns
    
    • 发现什么?不管是哪一代内存,随着频率提升,CL周期也同步提升,但是最后算出来的CL延迟时间却差不多。那么到了DDR4,JEDEC规范频率去到DDR4-4266,如果按照差不多的延迟,那么按照13ns多一些来算,那么CL值将达到28T!如果按照我们的极限超频延迟来算,DDR4-4266下的延迟也将达到12T。所以到了下一代DDR4,两位数的时钟周期将不可避免。
    • 所以,我想说的是,不要再去想什么DDR3的频率,DDR2的时序,在频宽严重过剩,IMC成为瓶颈的今天,它对性能没太多的提升。
    • DRAM RAS to CAS Delay(tRCD):RAS的含义与CAS类似,就是行(Row)地址信号。它定义的是在内存的一个rank(内存的一面)之中,行地址激活(Active)命令发出之后,内存对行地址的操作所需要的时间。
    • 每一个内存cell就是一个可存储数据的地址,每个地址都有对应的行号和列号,每一行包含1024个列地址,当某一行地址被激活后,多个CAS请求会被发送以进行读写操作。简单的说,已知行地址位置,在这一行中找到相应的列地址,就可以完成寻址,进行读写操作,从已知行地址到找到列地址过去的时间就是tRCD。当内存中某一行地址被激活时,我们称它为“open page”。
    • 在同一时刻,同一个rank可以打开8个行地址(8个bank,也就是8个颗粒各一个)。下图显示一个行地址激活命令发出,到寻找列地址并发出读取指令,中间间隔的时间就是tRCD。tRCD值由于是最关键的寻址时间,它对内存最大频率影响最大,一般想要上高频,在加电压和放宽CL值不奏效的时候,我们都要放宽这个延迟。
      在这里插入图片描述
    • DRAM RAS Precharge Time(tRP):RAS预充电时间。它定义的是前一个行地址操作完成并在行地址关闭(page close)命令发出之后,准备对同一个bank中下一个行地址进行操作,tRP就是下一个行地址激活信号发出前对其进行的预充电时间。由于在行地址关闭命令发出之前,一个rank中的多个行地址可能正在被读写,tRP对内存性能影响不如CL和tRCD。
    • 虽然tRP的影响会随着多个行地址激活与关闭信号频繁操作一个bank而加大,但是它的影响会被bank interleaving(bank交叉操作)和command scheduling(命令调配)所削弱。交叉读写会交替使用不同的bank进行读写,减少对一个bank的操作频率;
    • 命令调配则是由CPU多线程访问不同的内存地址,同样是减少对一个bank的频繁操作次数。例如SNB CPU的内存控制器可以对读写操作命令进行有效地重新分配,以使得行地址激活命中率最大化(如果重复激活一个已经处于激活状态的行地址,那就是RAS激活命令未命中),所以tRP在SNB平台对性能的影响不大,并且放宽它有可能可以帮助提升稳定性。下图显示的是一个即将被激活的行地址开始预充电,到它被激活间隔的时间,就是tRP。
      在这里插入图片描述
    • DRAM RAS Active Time(tRAS):行地址激活的时间。它其实就是从一个行地址预充电之后,从激活到寻址再到读取完成所经过的整个时间,也就是tRCD+tCL的意思。这个操作并不会频繁发生,只有在空闲的内存新建数据的时候才会使用它。太紧的tRAS值,有可能会导致数据丢失或不完整,太宽的值则会影响内存性能,尤其是在内存使用量增加的时候。所以一般为了稳定性,我们设置tRAS≥tRTP+tRCD+CL即可(tRTP不是tRP,将在第二时序中介绍),尤其是PCB不好或者跑高频的时候,多几个周期比较稳妥。
    • DRAM Command Mode(Command Rate,CR):首命令延迟,也就是我们平时说的1T/2T模式。是指从选定bank之后到可以发出行地址激活命令所经过的时间。
    • CR可能对性能的影响有比较大的变数:如果CPU所需要的数据都在内存的一个行地址上,就不需要进行重复多次的bank选择,CR的影响就很小;但是如果一个rank中同时多个bank要激活行地址,或者不同的rank中不同bank需要同时激活的时候,CR对性能的影响就会提升。但是随着内存频率的提升,CR=1T/2T的时间差越短,它的影响就会越来越小,这就是我们看到DDR1的时候1T/2T对性能影响挺大,但是到了DDR3影响就很小的其中一个原因。但是为了性能最大化,我们尽量把CR设为1T,但是如果bank数很多的时候,例如插满四条内存,就有32个bank,bank选择随机性增大,1T的首命令时间可能会不稳定。
    • 所以,内存的基本读取操作的时序角度流程就是把上面那三张图合起来:预充电-激活行地址并寻找列地址-发送读取命令-读出数据,这四步操作中间的三个延迟就分别是tRP、tRCD和CL。和我们常说的时序顺序刚好是反过来的。

    第二时序——XMP

    • DRAM CAS Write Latency(tWCL):列地址写入延迟,也就是DRAM的最小写入操作时间,与CL刚好是读写对应关系,一般跟CL值设为同一个值就是可以稳定的。由于内存读取之前必须先写入,所以这个值可以说与CL一样重要。但是在BIOS里一般没得设置,可能是与CL绑定了。
    • DRAM Row Cycle Time(tRC):行周期时间。定义了同一bank两次行激活命令所间隔的最小时间,或者说是一个bank中完成一次行操作周期(Row Cycle)的时间,即tRP+tRAS(预充电加上激活的整个过程),tRC设得太紧可能会直接点开不了机,一般只要能进系统再多加一两个周期都是可以稳定的。下图显示的就是tRC的时间。
      在这里插入图片描述
    • DRAM Row Refresh Cycle Time(tRFC):行地址刷新周期,定义了一个bank中行地址刷新所需要的时间。重提一下刷新的含义,由于cell中电容的电荷在MOSFET关闭之后一段时间就会失去,为了维持数据,每隔很短一段时间就需要重新充电。
    • 这里多提一句,Intel平台和AMD平台对tRFC的含义不一样,AMD平台的tRFC是DRAM刷新延迟时间,单位是ns,通常有90/110/160/300几个值可以调整,也就是说它的tRFC时钟周期会随着频率的提升而提升;而Intel平台的单位则直接是时钟周期,相反地延迟时间会随着频率的提升而降低。容量大的bank行地址和cell会更多,刷新时间也更长,因此tRFC也要更高。另外,tRFC如果太快会导致数据出错,太慢则影响性能,但可以增加稳定性。
    • DRAM Refresh Interval(tREFI):内存刷新时间间隔,也就是内存的刷新命令生效前要经过的时间。刷新的时间间隔一般取决于内存颗粒的容量(density),容量越大,就越需要频繁刷新,tREFI值就要越低。另外tREFI的时间也会受到内存工作温度与内存电压(Vdimm)影响,因为温度越高电容漏电越快。
    • 一般在AMD主板的BIOS里,这个值只有3.9us和7.8us可选,而在SNB平台,则是按时钟周期算,例如DDR3-1333下默认值为5199T,换算过来就是2000/1333x5199=7800ns,也就是7.8us。一般DRAM颗粒的spec中都是规定工作温度大于85度时采用3.9us。
    • DRAM RAS to RAS Delay(tRRD):行地址间延迟,定义的是同一rank不同bank间两个连续激活命令的最短延迟,在DDR3时代一般最小是4T。它的作用和CR有点像,不过比CR更多的时候对性能有较大的影响,所以这个时序可尽量缩小。
    • DRAM Write Recovery Time(tWR):内存写入恢复时间,它定义了内存从写入命令发出(从开始写入算起)到下一次预充电间隔的时间,也就是tRP的前一个操作。如果这个时间设得太短,可能会导致前一次写入未完成就开始下一次预充电,进行寻址,那么前一次写入的数据就会不完整,造成丢数据的情况。这个周期也是第二时序中比较长的,DDR3-2000一般需要10-14个周期,甚至更高。
    • DRAM Read to Precharge Time(tRTP):与tWR类似,定义了同一rank上内存从读取命令发出到tRP之前的间隔时间,但是它在读取完成并且行地址关闭之后才会生效。单颗128MB的内存颗粒可以在DDR3-2000下运行在4到6个时钟周期,如果bank容量增大时,这个时序有可能要放宽。
    • DRAM Four Active Window(tFAW):它定义了同一rank中允许同时发送大于四个行激活命令的间隔时间,因此最小值应该不小于tRRD的四倍。在DDR3上,tRRD的最小值是4T,因此tFAW的最小值就是16T。这个tFAW由于是在一个rank中大于四个bank同时激活之后才生效,因此在内存不是很繁忙的时候,它对性能的影响并不是很大。但是对一些频繁读写内存的操作(例如SuperPI 32M),tFAW对性能的影响可能会加大。
    • 由于现在内存用满的几率非常非常小,两根双面的内存更是有4个rank,配合上interleaving,一个rank中同时激活大于四个bank的几率应该不大,所以通常我们把它设为tRRD的四倍应该就不会出问题。
    • DRAM Write to Read Delay(tWTR):内存写-读延迟,它定义的是内存写入命令发出后到下一个读取命令之间的时间间隔,最小为4T,与tRTP类似,提升内存的频率或者容量提升时,这个值需要提高。

    总结

    看完以上内容,我们已经对时序有了个大致的了解,现在应该可以知道一些时序设置时要注意什么了。比如tFAW要设为tRRD的四倍,tRAS不能设太低等等。还是那句话,内存是辅助CPU超频的,时序设置只是为了放开内存更多的超频空间,时序本身对性能的影响很小,并且随着频率的提升,或者bank数的增加,这种影响可能会进一步减小。具体不同的内存颗粒也会有不同的设置情况,还请大家多关注本站的颗粒汇总以及最新内存颗粒测试报告!。

    展开全文
  • malloc内存分配原理

    千次阅读 2018-09-03 17:30:40
     它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。     调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另...
  • 内存屏障底层原理

    千次阅读 2019-05-23 08:44:16
    主题是什么? 我写这个系列的博客主要目的是解析Disruptor是...这篇文章提及到了内存屏障,我想弄清楚它们到底是什么,以及它们是如何应用于实践中的。 什么是内存屏障? 它是一个CPU指令。没错,又一次,我们在讨论...
  • 一、闭包的实现原理作用,可以列举几个开发中闭包的实际应用 1、闭包的概念:指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数。 2、闭包的作用:访问函数内部变量、保持函数在...
  • 内存工作原理

    千次阅读 2015-11-29 14:18:51
    现代的PC(包括NB)都是以存储器为核心的多总线结构,即CPU只通过存储总线与主存储器交换信息(先在Cache里找数据,如果找不到,再去主存找)。输入输出设备通过I/O总线直接与主存储器...内部存储器简称内存,也可称
  • ESXi 内存分配原理

    千次阅读 2019-11-05 10:28:02
    上一篇我们详细讲述了CPU的调度原理,本篇讲一下内存的分配过程。 运行在ESXi主机上的虚拟机分配内存之和可以超过物理机的实际内存大小,这个技术叫做超额分配(overcommitment),即使单个虚拟机的内存分配值都...
  • 计算机内存原理

    千次阅读 2018-06-22 20:36:23
    感觉内存不够用!!感觉电脑不够快!!
  • java内存屏障的原理与应用

    万次阅读 多人点赞 2019-07-01 10:37:28
    1.java内存屏障 2.java内存屏障的使用 一.java内存屏障 1.1 什么是内存屏障(Memory Barrier)? 内存屏障(memory barrier)是一个CPU指令。基本上,它是这样一条指令: a) 确保一些特定操作执行的顺序; b) ...
  • 单片机内存及运行原理

    万次阅读 多人点赞 2019-08-15 20:39:34
    二、CPU的作用 三、内存管理 首先单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义可得,flash里面的数据掉电可保存,sram中的...
  • 深入解析内存原理:RAM的基本原理

    千次阅读 2019-11-25 16:32:11
    1. 寻址原理概述 RAM 主要的作用就是存储代码和数据供CPU 在需要的时候调用。但是这些数据并不是像用袋子盛米那么简单,更像是图书馆中用有格子的书架存放书籍一样,不但要放进去还要能够在需要的时候准确的调用出来...
  • php的内存马的原理与查杀方法

    千次阅读 2021-08-11 12:17:25
    内存原理 PHP内存马即PHP不死马,简单来说就是会写进PHP进程里,无限在指定目录中生成木马文件 生成过程 不死马.php → 上传到server → server执行文件 → server本地循环不断生成一句话木马 不死马 初代 <?...
  • 内存基本存储原理: cpu先要从RAM中获取数据,需要首先给地址总线传递数据的定位地址,在若干个时钟周期之后,数据总线就会把数据传送给CPU.当地址解码器收到地址总线送来的地址数据后,它就会根据这个地址数据找到相...
  • Java文件读写原理和虚拟内存

    千次阅读 2019-04-10 08:50:57
      了解了用户空间和内核空间的概念和作用后我们来看下普通IO的执行原理。   根据上图,当进程请求一个I/O操作,它会执行一个系统(open() , read() , writer() , close())调用将控制权移交给内核。当内核以...
  • volatile 作用及其实现原理

    万次阅读 2020-10-31 23:34:28
    一、并发编程中的三个概念 ...二、volatile 的作用及其实现原理 我们先来列出几个结论: volatile 保证了可见性 volatile 在一定程度上保证了有序性 volatile 能保证读写操作的原子性,但无法保证复合操作的原子
  • volatile实现原理分析
  • 随着持久内存逐步走向商用,DAX这个概念的出现频率日益增加。那么DAX究竟起到什么作用,其背后的原理又是什么?本文将率先对其进行揭晓。
  • windows内存诊断工具有什么作用

    千次阅读 2021-05-26 05:23:15
    内存可以说是电脑的重灾区,很多电脑问题都跟内存有关。内存稍微有点问题都有可能导致系统运行不稳定,最常见的表现就是蓝屏,自动重启,甚至开不起机。如果是开不起机的话反倒好解决,一般把它拔出来清理下装回去就...
  • 深入学习JVM内存设置原理和调优

    千次阅读 2016-06-03 16:41:50
    你知道JVM内存设置原理吗,这里和大家分享一下,因为如果默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。 这里向大家描述一下JVM内存设置原理内存调优...
  • 背景众所周知,内存的高低是评判一款app的性能优劣的重要的指标之一。如何更简单的帮助开发者分析、暴露且解决内存泄漏问题,几乎是每一个平台或框架、开发者亟需的一个的"标配"...
  • 文章目录目录前文列表大页内存Linux 的大页内存大页的实现原理大页内存配置透明巨型页 THP大页面对内存的影响大页内存的性能问题 前文列表 大页内存 在页式虚拟存储器中,会在虚拟存储空间和物理主存空间都分割为一...
  • Spark内存管理之堆内/堆外内存原理详解

    千次阅读 多人点赞 2019-09-27 10:47:06
    文章目录概要1. 堆内内存(On-heap Memory)1.1 堆内内存分区2.... 内存分配示例5.1 只用了堆内内存5.2 堆内内存+堆外内存总结 概要 介绍Spark内存管理中,涉及到的**堆内内存(On-heap Memory)和堆外内...
  • 图像采集卡的概念及作用原理

    千次阅读 2022-04-21 14:21:43
    图像采集卡(Image Grabber)又称为图像卡,它将摄像机的图像视频信号,以帧为单位,送到计算机的内存和VGA帧存,供计算机处理、存储、显示和传输等使用;在机器视觉系统中,图像卡采集到的图像,供处理器作出工件...
  • 内存管理的概念及作用

    千次阅读 2018-05-25 13:34:26
    操作系统对内存的划分和动态分配,就是内存管理的概念。有效的内存管理在多道程序设计中非常重要,不仅方便用户使用存储器、提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器。内存管理的功能:1.内存空间的...
  • 几周前,我们新开了一系列文章,旨在深入 JavaScript,探寻其工作原理。我们认为通过了解 JavaScript 的构建方式和其运行规则,我们能写出更好的代码和应用。 第一篇文章重点介绍了引擎、运行时和调用栈的概述。...
  • 作用:是记住下一条jvm指令的执行地址 特点:  是线程私有的  不会存在內存溢出 二、虚拟机栈  每个线程运行时所需要的内存,称为虚拟机栈  每个栈由多个栈帧(Frame) 组成,对应着每次方法调用时所占用的...
  • nginx源码分析之内存池实现原理

    千次阅读 2017-02-21 19:47:47
    内存池实质上是接替OS进行内存管理,应用程序申请内存时不再与OS打交道,而是从内存池中申请内存或者释放内存内存池,因此,内存池在实现的过程中,必然有一部分操作时从OS中申请内存,或者释放内存到OS,如下图所...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 422,292
精华内容 168,916
关键字:

内存的作用原理