精华内容
下载资源
问答
  • DDR2笔记本内存条原理

    热门讨论 2010-07-19 14:41:47
    DDR2的原理图 笔记本内存条原理图 ,
  • DDR4台式机内存条原理图,用于内存条维修的第一手好资料
  • DDR3 内存条原理

    热门讨论 2012-03-04 15:58:42
    这是DDR3内存条详细的pdf原理图资料,是UDIMM(无缓冲双通道内存模块),240个引脚。
  • 三星DDR800内存条allego格式PCB文件和pdf原理
  • 内存屏障底层原理

    千次阅读 2017-11-06 14:09:08
    内存屏障是一个很晦涩的概念,今天为了让大家彻底了解在高级并发里面的这个高级主题,我们从系统层面向大家讲解内存屏障的原理、种类、应用, 下面的内容可能牵涉的东西比较多并且比较长,但是如果你耐心的看完,...

          内存屏障是一个很晦涩的概念,今天为了让大家彻底了解在高级并发里面的这个高级主题,我们从系统层面向大家讲解内存屏障的原理、种类、应用, 下面的内容可能牵涉的东西比较多并且比较长,但是如果你耐心的看完,并且完全的吸纳,那么你就会真正的了解内存屏障!

     

    1 速度不对等

     Cpu的速度比cpu之间的互联性能及cpu试图要访问的内存性能,都要快上几个数量级

    上面展示的图显示现代处理器基本都是多核,并且每个cpu都有自己独立的cache,不同cpu共享主内存,然后不同cpu通过总线互联,cpu -> cache -> memory 访问速度成大数量级递减,cpu最快,cache慢一点,memory更慢。

     

    MESI协议

    cpu从内存中加载数据到自己的cache,当不同的cpu都加载了同样的内存数据的时候,并且对数据进行操作的时候,需要维护数据在不同的cache 中的一致性视图就需要MESI协议,cache里面的缓存行有四种状态分别是Modified,Exclusive,Shared,Invalid。协议在每一个缓存行中维护 一个两位的状态“tag”这个“tag”附着在缓存行的物理地址或者数据后 ,标识着缓存行的状态

    Modified  修改的

    Exclusive  独占

    Shared  共享

    Invalid   无效

        Modified: 处于“modified”状态的缓存行是由于相应的 CPU 最近进行了内存存储。并 且相应的内存确保没有在其他 CPU 的缓存中出现。因此,“modified”状态的缓 存行可以被认为被 CPU 所“owned”由于缓存保存了最新的数据,因此缓存最 终有责任将数据写回到内存,并且也应当为其他缓存提供数据,必须在当前缓存 缓存其他数据之前完成这些事情。

        Exclusive: 状态非常类似于“modified”状态,唯一的例外是缓存行还没 有被相应的 CPU 修改,这表示缓存行中的数据及内存中的数据都是最新的。但 是,由于 CPU 能够在任何时刻将数据保存到该行,而不考虑其他 CPU处于 exclusive 状态也可以认为被相应的 CPU 所“owned”也就是说,由于内存 中的值是最新的,该行可以直接丢弃而不用回写到内存,也可以为其他缓存提供 数据。

        Shared:  处于“shared”状态的缓存行可能被复制到至少一个其他 CPU 缓存中,这样 在没有得到其他 CPU 的许可时,不能向缓存行存储数据。由于“exclusive”状 态下,内存中的值是最新的,因此可以不用向内存回写值而直接丢弃缓存中的值, 或者向其他 CPU 提供值。

        Invalid:  处于“invalid”状态的行是空的,换句话说,它没有保存任何有效数据。当 新数据进入缓存时,它替换一个处于“invalid”状态的缓存行。这个方法是比较 好的,因为替换其他状态的缓存行将引起大量的 cache miss

     

    如果上面的文字你都认真看完了,可能有点绕,不过没关系,我们只需要了解这四种状态仅仅是标识出当前在cache里面的缓存行的数据是处于一个什么样的状态,并且下面会简单的介绍通过发送MESI消息来改变这种缓存行的状态

        缓存一致性消息:

        由于所有 CPUs 必须维护缓存行中的数据一致性视图,因此缓存一致性协议 提供消息以调整系统缓存行的运行。

    MESI 协议消息 :

    Read:“read消息包含缓存行需要读的物理地址。

    Read Response:“read response”消息包含较早前的“read”消息的数据。 这个“read response”消息可能由内存或者其他缓存提供。例如,如果 一个缓存请求一个处于“modified”状态的数据,则缓存必须提供“read response”消息。

    Invalidate“invalidate消息包含要使无效的缓存行的物理地址。其他的 缓存必须从它们的缓存中移除相应的数据并且响应此消息。

    Invalidate Acknowledge:一个接收到“invalidate”消息的 CPU 必须在移 除指定数据后响应一个“invalidate acknowledge”消息。

    Read Invalidate:“read invalidate”消息包含要缓存行读取的物理地址。 同时指示其他缓存移除数据。因此,它包含一个“read”和一个 “invalidate”。“read invalidate”也需要“read response”以及“invalidate acknowledge”消息集。

    Writeback:“writeback消息包含要回写到内存的地址和数据。(并且也 许会“snooped”其他 CPUs 的缓存)。这个消息允许缓存在必要时换出 “modified”状态的数据以腾出空间。

        ok,我们不用太纠结这些消息,毕竟它看上去实在太枯燥了,我们只需要了解它大概的用途,说了这么多,下面内存屏障要出马了

    未完!

    在上面的理论储备下,第一个存在的问题 存储导致的停顿

     

    在这个动作中,为了解决这种停顿的性能损耗我们cpu的设计引入了一种机制叫做 存储缓冲    

    避免这种不必要的写延迟的方法之一,就是在每个 CPU 和它的缓存之间, 增加“store buffers”。通过增加这些存储缓冲区,CPU0 可能简单的将 要保存的数据放到存储缓冲区中,并且继续执行。当缓存行最后从 cpu1 转到 CPU0 时,数据将从存储缓冲区转到缓存行中。    

     

    在引入了存储缓冲区之后又会带来新的问题,我们看以下代码验证失败的情况

     

    //变量a,b初始化为0,
    void foo(void)               
    { 
      a = 1; 
      b = 1; 
    }
    
    void bar(void)               
    { 
      while (b == 0) continue; 
      assert(a == 1); 
    }
    
    
    
    

     

    验证失败

    CPU 0 执行 a = 1。缓存行不在 CPU0 的缓存中,因此 CPU0 将“a”的新值 放到存储缓冲区,并发送一个“read invalidate”消息。 
    CPU 1 执行 while (b == 0) continue,但是包含“b”的缓存行不在缓存中, 它发送一个“read”消息。 
    CPU 0 执行 b = 1,它已经在缓存行中有“b”的值了 (换句话说,缓存行已 经处于“modified”或者“exclusive”状态),因此它存储新的“b”值在它的缓 存行中。 
    CPU 0 接收到“read”消息,并且发送缓存行中的新的“b”的值 1,同时 将缓存行设置为“shared”状态。 
    CPU 1 接收到包含“b”值的缓存行,并将其值写到它的缓存行中。 
    CPU 1 现在完成执行 while (b == 0) continue, 由于它发现“b”的值是 1, 它开始处理下一条语句。 
    CPU 1 执行 assert(a == 1),并且, 由于 CPU 1 工作在旧的“a”的值,因此 验证失败。 
    CPU 1 接收到“read invalidate”消息, 并且发送包含“a”的缓存行到 CPU0, 同时使它的缓存行变成无效。但是已经太迟了。 
    CPU 0 接收到包含“a”的缓存行,将且将存储缓冲区的数据保存到缓存行 中,这使得 CPU1 验证失败。 
    

               结果是验证失败了,但是这和我们看到的,和预想的逻辑是不一样的,那怎么解决这个问题 ,引入内存屏障, 内存屏障千呼万唤始出来,只有前面这些铺垫,我们才能真正的理解内存屏障是个啥玩意,它是什么样的条件下产生的,以及他解决了什么问题,我们再看下面这段代码

    void foo(void) { 
      a = 1; 
      smp_mb(); 
      b = 1; 
    } 
    
    void bar(void) 
    { 
      while (b == 0) continue; 
      assert(a == 1); 
     } 
    

    准确的讲,这里需要插入一个写内存屏障,写内存屏障施加的作用就是   

    内存屏障 smp_mb()将导致 CPU 在保存后续的存储操作到缓存行前,刷新它 的存储缓冲区。CPU 可能简单的停下来,直到存储缓冲区变成空,也可能是简 单的使用存储缓冲区保存后续的存储操作,直到前面所有的存储缓冲区已经被保 存到缓存行中。

    然后我们看插入一个写内存屏障之后,cpu的流水线是这样的

    CPU 0 执行 a = 1。缓存行不在缓存中,因此 CPU 0 将“a”的新值放到存 储缓冲区,并发送一个“read invalidate”消息. 
    CPU 1 执行 while (b == 0) continue,但是包含“b”的缓存行不在缓存中, 因此它发送一个“read”消息. 
    CPU 0 执行 smp_mb(),,并标记当前所有存储缓冲区的条目。 (也就是说 a = 1). 
    CPU 0 执行 b = 1。它的缓存行已经存在了。 (也就是说, 缓存行已经处于 “modified”或者“exclusive”状态),但是在存储缓冲区中存在一个标记条目。 因此,它不将新值存放到缓存行,而是存放到存储缓冲区中。 (但是“b”不是 一个标记条目). 
    CPU 0 接收到“read”消息,同时发送包含“b”值的缓存行给 CPU1。它 也标记本地缓存行为“shared”。 
    CPU 1 读取到包含“b”的缓存行,并将它复制到本地缓存中。 
    CPU 1 现在可以装载“b”的值了,但是发现它的值仍然为“0”,因此它重 复该语句。“b”的新值被安全的隐藏在 CPU0 的存储缓冲区中。 
    CPU 1 接收到“read invalidate”消息,并且发送包含“a”的缓存行给 CPU0, 并且使它的缓存行无效。 
    CPU 0 接收到包含“a”的缓存行,并且使用存储缓冲区的值替换缓存行为 “modified”状态。 
    由于被存储的“a”是存储缓冲区中唯一被 smp_mb()标记的条目,因此 CPU0 也能够存储“b”的新值到缓存行中-除非包含“b”的缓存行处于“shared”状态。 
    CPU 0 发送一个“invalidate”消息给 CPU 1。 
    CPU 1 接收到“invalidate”消息,刷新包含“b”的缓存行,并且发送一个 “acknowledgement”消息给 CPU 0. 
    CPU 1 执行 while (b == 0) continue,但是包含“b”的缓存行不在缓存中, 因此它发送一个“read”消息给 CPU 0。 
    CPU 0 接收到“acknowledgement”消息,将包含“b”的缓存行设置成 “exclusive”状态。 CPU 0 现在存储新的“b”值到缓存行。 
    CPU 0 接收到“read”消息,同时发送包含新的“b”值的缓存行给 CPU 1。 它也标记该缓存为“shared”。 
    CPU 1 接收到包含“b”的缓存行,并将它复制到本地缓存中。 
    CPU 1 现在能够装载“b”的值了,由于它发现“b”的值为 1,它退出循环 并执行下一条语句。 
    CPU 1 执行 assert(a == 1),但是包含“b”的缓存行不在它的缓存中。一旦 它从 CPU0 获得这个缓存行,它将使用最新的“a”的值,验证语句将通过。 

      读到这里其实已经很复杂了,上面讲到的写内存屏障这个机制,其实还有一个读内存屏障,读内存屏障标记的是cpu互联模块里面的使无效队列,我们先不列出和读内存屏障相关的cpu流水线,它的原理和写内存屏障类似,下面列出简要的图

     


    在上面讲到的代码中完整的例子应该是这样的

    #如果我们修改 foo 和 bar ,以使用读和写内存屏障,将会是如下所示: 
     void foo(void) 
    { 
      a = 1; 
      smp_wmb(); 
      b = 1; 
    } void bar(void) { 
      while (b == 0) continue; 
      smp_rmb(); 
      assert(a == 1); 
     } 

     

    内存屏障总结

    内存屏障用来标记存储缓冲区和无效队列 
    
    简单的说,一个“读内存屏障” 仅仅标记它的无效队列,一个“写内存屏障”仅仅标记它的存储缓冲区,完整的 内存屏障同时标记无效队列及存储缓存缓冲区。 
    这样的效果是:读内存屏障仅仅保证装载顺序,因此所有在读内存屏障之前 的装载将在所有之后的装载前完成。类似的,写内存屏障仅仅保证写之间的顺序。 完整的内存屏障同时保证写和读之间的顺序。 
    
    
    内存屏障有四个基本变种:
    
    写 (或存储) 内存屏障,
    数据依赖屏障,
    读内存屏障,
    通用内存屏障。

    cpu乱序执行,但是它必须有它基本的规范,就比如我们看到的代码的逻辑,它执行的时候,逻辑也应该是像我们看到的那样,乱序cpu技术规范

    1.每一个 CPU 总是按照编程顺序来感知内存访问。 
    2.仅仅在操作不同地址时,CPUs 才对特定的存储操作进行重新排序。 
    3.一个特定 CPU 在内存屏障之前的所有装载操作 (smp_rmb()) 将被所有随后的读内存屏障后面的操作之前被所有 CPU 所感知
    4.所有在写内存屏障之前的写操作 (smp_wmb()) 都将比随后的写操作先 感知。 
    5.所有在内存屏障之前的内存访问 (装载和存储) (smp_mb())都将比随后的内存访问先感知。

    好了,看到这里,如果你都看明白了,那么恭喜你,内存屏障你大概了解了,内存屏障它的产生背景,以及为了解决什么问题都讲到了,其实整体的逻辑就是为了解决一个问题,采用了一种机制,这个机制又带来新的问题,然后又采用一种机制去解决,如此往复。

     

     

     

     

     

     

    展开全文
  • 金士顿的骇客神条VS普通内存条

    千次阅读 2019-03-17 15:08:20
    金士顿内存条的市场份额相当大,不少用户都喜欢购买金士顿内存条,但是购买内存条的时候你会发现,在频率和容量一样的情况下,有两种金士顿内存条,一个是金士顿内存条,一个叫金士顿骇客神条,他们有什么区别呢?...

    金士顿内存条的市场份额相当大,不少用户都喜欢购买金士顿内存条,但是购买内存条的时候你会发现,在频率和容量一样的情况下,有两种金士顿内存条,一个是金士顿内存条,一个叫金士顿骇客神条,他们有什么区别呢?为何售价有那么大的差距?

    金士顿内存条以质量和售后赢得了不少消费者的芳心,目前金士顿的内存条可以分为两个系列,普通内存和骇客神条。

    一、普通内存条

    金士顿普通内存条具有高性价比(与骇客神条相比),其生产的产品一直都是符合业界标准的,质量可靠,稳定性也很好,可以说是广受好评。这种普通内存条适合家用,如果注重性价比的话,可以购买这个系列。性能可以满足日常需求,更重要是价位要低一些。金士顿(Kingston)DDR4 2400 8G 笔记本内存现在价位https://item.jd.com/4071422.html#none

    二、骇客神条

    骇客神条的做工会比普通内存条更好,选择的内存颗粒的品质更高,因此稳定性要比普通内存条好了一个档次,如果是对内存条进行超频的话,发热和系统兼容性以及超频后的稳定性都要比普通内存条好得多。并且骇客神条配置了散热马甲,散热效果非常不错。

    对于这种内存条,适用于喜欢超频的用户,特别是游戏玩家,对游戏体验有很大的提升帮助。

    在内存条外观上,骇客神条有很多种包装,目前有蓝色、黑色和红色,看起来比普通内存条更好看。当然价格也会更高,现在价位399元/DRR4-8Ghttps://item.jd.com/8391337.html

    其他知识普及

    内存频率

    内存频率就是内存工作的速度,肯定是越快越好的,但是内存的频率受限于其他硬件,比如主板和CPU,因此,购买内存条的时候,一定要了解一下自己的主板和CPU到底支持多少频率的内存条。

    内存超频

    和CPU超频一样,就是提升运行速度,但是并不建议大家对内存进行超频,比起CPU超频,内存超频所带来的效益并不高。

    总结

    如果你购买内存只是用来办公等日常使用以及轻度娱乐的话,可以购买普通内存条,性价比高,如果是想玩游戏的话,骇客神条是最佳的选择,但是切记,一定要购买合适的内存条频率。

    备注:

    两个牌子一样,但频率和容量不一样的内存条,一般不能一起用。

    1、牌子不一样,频率不一样,如果频率差距大的话,有可能不是同一代的条子。插槽都是不兼容的。

    2、DDR1和DDR2时代,两条内存在一起用的前提是必须频率一样。容量可以不一样,但频率不一样就很容易死机蓝屏。所以不能用。

    3、DDR3时代,主板可以自动将高频率的内存置于低频率使用,大大提高了不同频率的内存条的使用兼容性和稳定性。但并不是总是有效。

    4、就算是同一个牌子,同一代的内存条,频率不一样,也最好不要放在一起使用,因为会出现降频现象。

        如,机器默认主频是DDR4 2400,则可以与频率DDR4 2800及以上的内存条混用,频率较高的,会降频到默认的2400,与原条保持一致。反之,如果加上2133的内存条,则会根据木桶原理,原来主频是2400的那根会降到2133一起工作,会对机器的性能和稳定性造成影响,不建议这样搭配。

                                                

    扫码关注本人微信公众号,有惊喜奥!公众号每天定时发送精致文章!回复关键词可获得海量各类编程开发学习资料!

    例如:想获得Python入门至精通学习资料,请回复关键词Python即可。

     

    展开全文
  • 内存泄漏检测原理

    千次阅读 2018-04-16 00:05:18
    众所周知,c/c++语言的内存回收依赖于程序员,并没有python,java之类的自动回收。那么内存是申请释放就是个需要认真对待的问题。因为往往诸如服务器是需要长期运行的,即便轻微的内存泄漏也将可能带来严重问题。...

            众所周知,c/c++语言的内存回收依赖于程序员,并没有python,java之类的自动回收。那么内存是申请释放就是个需要认真对待的问题。因为往往诸如服务器是需要长期运行的,即便轻微的内存泄漏也将可能带来严重问题。而且这种bug还存在着复现周期长,难以定位的问题。

            链接器有个选项–wrap,当查找某个符号时,它优先先解析__wrap_symbol, 解析不到才会去解析symbol函数。也就是比如我编译选项加入-Wl,-wrap,malloc。那么链接器会优先将malloc调用链接至你定义的__wrap_malloc函数,-Wl是指定链接器参数的意思。也就是说我有诸如以下代码,就可以监测程序内存申请释放。当然为了讨论问题本质,我们暂且忽略realloc/calloc等函数。

    // wrap malloc
    void *__real_malloc(size_t);
    void __real_free(void *);
    
    void *__wrap_malloc(size_t size)
    {
    	trace("malloc: %d bytes\n", size);
    	return __real_malloc(size);
    }
    void __wrap_free(void *ptr)
    {
    	trace("free: addr %p\n", ptr);	
    	return __real_free(ptr);
    }

            但是问题来了,虽然我知道申请了多少内存,释放了哪块内存还是不够的,我还得知道哪里申请了内存。那么接下来的主角登场。

            backtrace函数用于获取当前函数的调用堆栈,返回地址信息存放在buffer中。buffer是一个存放void *型返回地址的二级指针,参数 size 指定buffer中可以保存void* 型返回地址的最大条数。函数返回值是buffer中存放的void*指针实际个数,最大不超过参数size大小。

            backtrace_symbols函数把从backtrace函数获取的返回地址转换为描述符号地址的字符串数组,每个地址的符号由函数名,十六进制偏移组成。需要注意的是返回的字符串数组是backtrace_symbols内部申请的内存,记得用完释放掉。

            同时还需要注意的是gcc的非零-O优化选项可能会导致非预期的地址信息丢失,因为会将一些简短函数内联掉。内联函数没有返回地址信息。尾调用优化也可能会导致非预期的返回地址信息丢失。编译选项也应该加入-rdynamic,这样backtrace_symbols才能将那些返回地址转换为字符串符号地址。

    int backtrace(void **buffer, int size);
    
    void backtrace_symbols_fd(void *const *buffer, int size, int fd);
    // dump statck 
    int dumptrace(uint16_t depth)
    {
    	int nptrs = 0;
    	nullptr_t *buffer = malloc(sizeof(nullptr_t) * depth);
      	if( (nptrs = backtrace(buffer, depth)) <= 0)
    		return -1;
    
      	char **strings = NULL;
     	if( (strings = backtrace_symbols(buffer, nptrs)) == NULL){
    		return -1;
      	}
    
    	int j = 0;
      	for (j = 0; j < nptrs; j++)
    	  	printf("%s\n", strings[j]);
    
      	free(strings);
    	free(buffer);
    	return 0;
    }
    

            那是不是说我只要在__wrap_malloc等函数里将没有释放的内存堆栈记录下来,这样就可以了呢?运行你会发现函数出现了递归。那是因为dumptrace里进行了内存申请。也就是说问题的关键在于,__wrap_malloc/__wrap_free内对内存操作记录期间不能继续记录内存操作。那么我们接着使用线程私有变量。ENTER_SAFERECORD先判断标志为0x00时可以记录内存的操作。进入内存操作记录时,将标志置0x01,离开内存操作记录时,再将标志置0x00。其实也就是意味着记录内存操作期间发生的内存申请释放不会被记录下来,所以记录内存操作越快越好。

    static pthread_key_t saferecord_key;
    void init_pthread(void)
    {
    	pthread_key_create(&saferecord_key, NULL);
    }
    void init_saferecord()
    {
    	static pthread_once_t once = PTHREAD_ONCE_INIT;
    	pthread_once(&once, init_pthread);
    }
    void release_saferecord()
    {
    	pthread_key_delete(saferecord_key);
    }
    
    #define ENTER_SAFERECORD \
    	if(pthread_getspecific(saferecord_key) == (void *) 0x00){ \
    		pthread_setspecific(saferecord_key, (void *)0x01); 
    #define LEAVE_SAFERECORD \
    		pthread_setspecific(saferecord_key, (void *)0x00); \
    	}
    	
    // wrap malloc
    void *__real_malloc(size_t);
    void __real_free(void *);
    
    void *__wrap_malloc(size_t size)
    {
    	ENTER_SAFERECORD
    		dumptrace(16);
    	LEAVE_SAFERECORD
    		
    	return __real_malloc(size);
    }
    void __wrap_free(void *ptr)
    {
    	ENTER_SAFERECORD
    		dumptrace(16);
    	LEAVE_SAFERECORD
    		
    	return __real_free(ptr);
    }

        完整代码如下所示

    #include <stdio.h>
    #include <execinfo.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <caca_types.h>
    #include <pthread.h>
    
    #define trace(fmt, args...) printf("%s:%d " fmt, __FUNCTION__, __LINE__, ##args)
    typedef void * nullptr_t;
    
    // dump statck 
    int dumptrace(uint16_t depth)
    {
    	int nptrs = 0;
    	nullptr_t *buffer = malloc(sizeof(nullptr_t) * depth);
      	if( (nptrs = backtrace(buffer, depth)) <= 0)
    		return -1;
    
      	char **strings = NULL;
     	if( (strings = backtrace_symbols(buffer, nptrs)) == NULL){
    		return -1;
      	}
    
    	int j = 0;
      	for (j = 0; j < nptrs; j++)
    	  	printf("%s\n", strings[j]);
    
      	free(strings);
    	free(buffer);
    	return 0;
    }
    
    // 
    static pthread_key_t saferecord_key;
    void init_pthread(void)
    {
    	pthread_key_create(&saferecord_key, NULL);
    }
    void init_saferecord()
    {
    	static pthread_once_t once = PTHREAD_ONCE_INIT;
    	pthread_once(&once, init_pthread);
    }
    void release_saferecord()
    {
    	pthread_key_delete(saferecord_key);
    }
    
    #define ENTER_SAFERECORD \
    	if(pthread_getspecific(saferecord_key) == (void *) 0x00){ \
    		pthread_setspecific(saferecord_key, (void *)0x01); 
    #define LEAVE_SAFERECORD \
    		pthread_setspecific(saferecord_key, (void *)0x00); \
    	}
    	
    // wrap malloc
    void *__real_malloc(size_t);
    void __real_free(void *);
    
    void *__wrap_malloc(size_t size)
    {
    	ENTER_SAFERECORD
    		dumptrace(16);
    	LEAVE_SAFERECORD
    		
    	return __real_malloc(size);
    }
    void __wrap_free(void *ptr)
    {
    	ENTER_SAFERECORD
    		dumptrace(16);
    	LEAVE_SAFERECORD
    		
    	return __real_free(ptr);
    }
    
    int main(int argc, char *argv[])
    {
    	init_saferecord();
    	
    	char *ptr = malloc(2);
    	free(ptr);
    
    	release_saferecord();
    	return 0;
    }
    

            完整makefile和执行结果如下所示

    obj = $(patsubst %.c, %.o, $(notdir $(wildcard *.c)))
    CFLAGS   = -Wall -g  -pthread -rdynamic -Wl,-wrap,malloc -Wl,-wrap,free
    CC = gcc
    TARGET = main
    
    $(TARGET): $(obj)
    	$(CC) $(CFLAGS) -o $@ $^
    
    $(obj): %.o: %.c
    	$(CC) $(CFLAGS) -c  $< -o $@
    
    .PHONY: clean
    clean:
    	-rm -f *.o $(TARGET)
    
     
    展开全文
  • 计算机内存读取写入原理是什么

    千次阅读 2013-04-19 12:32:24
    通常我们所熟悉的计算机内存条,外观是一个长方形的,上面有的黑色小正方形就是内存颗粒,还有一些电子原件,内存的工作原理分4部分,请楼主耐心看完: 内存工作原理  1.内存寻址  首先,内存从CPU获得查找...

    计算机内存读取写入原理是什么?


    通常我们所熟悉的计算机内存条,外观是一个长方形的,上面有的黑色小正方形就是内存颗粒,还有一些电子原件,内存的工作原理分4部分,请楼主耐心看完:

    内存工作原理 
    1.内存寻址 
    首先,内存从CPU获得查找某个数据的指令,然后再找出存取资料的位置时(这个动作称为“寻址”),它先定出横坐标(也就是“列地址”)再定出纵坐标(也就是“行地址”),这就好像在地图上画个十字标记一样,非常准确地定出这个地方。对于电脑系统而言,找出这个地方时还必须确定是否位置正确,因此电脑还必须判读该地址的信号,横坐标有横坐标的信号(也就是RAS信号,Row Address Strobe)纵坐标有纵坐标的信号(也就是CAS信号,Column Address Strobe),最后再进行读或写的动作。因此,内存在读写时至少必须有五个步骤:分别是画个十字(内有定地址两个操作以及判读地址两个信号,共四个操作)以及或读或写的操作,才能完成内存的存取操作。 

    2.内存传输 
    为了储存资料,或者是从内存内部读取资料,CPU都会为这些读取或写入的资料编上地址(也就是我们所说的十字寻址方式),这个时候,CPU会通过地址总线(Address Bus)将地址送到内存,然后数据总线(Data Bus)就会把对应的正确数据送往微处理器,传回去给CPU使用。 

    3.存取时间 
    所谓存取时间,指的是CPU读或写内存内资料的过程时间,也称为总线循环(bus cycle)。以读取为例,从CPU发出指令给内存时,便会要求内存取用特定地址的特定资料,内存响应CPU后便会将CPU所需要的资料送给CPU,一直到CPU收到数据为止,便成为一个读取的流程。因此,这整个过程简单地说便是CPU给出读取指令,内存回复指令,并丢出资料给CPU的过程。我们常说的6ns(纳秒,秒-9)就是指上述的过程所花费的时间,而ns便是计算运算过程的时间单位。我们平时习惯用存取时间的倒数来表示速度,比如6ns的内存实际频率为1/6ns=166MHz(如果是DDR就标DDR333,DDR2就标DDR2 667)。 

    4.内存延迟 
    内存的延迟时间(也就是所谓的潜伏期,从FSB到DRAM)等于下列时间的综合:FSB同主板芯片组之间的延迟时间(±1个时钟周期),芯片组同DRAM之间的延迟时间(±1个时钟周期),RAS到CAS延迟时间:RAS(2-3个时钟周期,用于决定正确的行地址),CAS延迟时间 (2-3时钟周期,用于决定正确的列地址),另外还需要1个时钟周期来传送数据,数据从DRAM输出缓存通过芯片组到CPU的延迟时间(±2个时钟周期)。一般的说明内存延迟涉及四个参数CAS(Column Address Strobe 行地址控制器)延迟,RAS(Row Address Strobe列地址控制器)-to-CAS延迟,RAS Precharge(RAS预冲电压)延迟,Act-to-Precharge(相对于时钟下沿的数据读取时间)延迟。其中CAS延迟比较重要,它反映了内存从接受指令到完成传输结果的过程中的延迟。大家平时见到的数据3—3—3—6中,第一参数就是CAS延迟(CL=3)。当然,延迟越小速度越快。

    内存最常见的故障就是出现在金手指部分和内存颗粒损坏,金手指部分的故障比较容易解决,一般只需将金手指用橡皮擦擦感觉即可,内存颗粒就要专业的维修人员才能解决。

     
    因为制作材料和工作原理不同,内存是一种半导体存储器,简称RAM。RAM的优点是存取速度快、读写方便,缺点是数据不能长久保持,断电后自行消失,因此主要用于计算机主存储器等要求快速存储的系统。按工作方式不同,可分为静态和动态两类。静态随机存储器(SRAM)的单元电路是触发器,存入的信息在规定的电源电压下便不会改变。SRAM速度快,使用方便。动态随机存储器 ( DRAM )的单元由一个金属-氧化物-半导体(MOS)电容和一个MOS晶体管构成,数据以电荷形式存放在电容之中 ,需每隔 2~4毫秒对单元电路存储信息重写一次(刷新)。

    展开全文
  • 内存寻址原理

    万次阅读 2016-01-10 20:25:02
    今天绿盟科技的安全技术专家就讲讲这个内存寻址的原理,文章分为上下两篇《内存寻址原理》及《内存寻址方式》。 随着信息化发展和数据处理能力需求的提高,对计算机硬件产品的性能和容量也提出了新的挑战,要求...
  • dpdk大页内存原理

    千次阅读 2019-08-16 23:56:26
    在分析dpdk大页内存的源码之前,有必要对linux内存管理的原理以及大页内存原理有个了解,缺少这些底层基础知识,分析dpdk大页内存的源码将举步维艰。这篇文章详细介绍下linux内存管理以及大页内存的方方面面,为...
  • DRAM 内存原理

    千次阅读 2017-04-30 13:44:30
    一、RAM介绍ROM(Read Only Memory)...RAM(Ramdom Access Memory)易挥发性随机存取存储器,高速存取,读写时间相等,且与地址无关,如计算机内存等。 RAM分为SRAM(静态随机存储器)和DRAM(动态随机存储器)两大
  • 随着持久内存逐步走向商用,DAX这个概念的出现频率日益增加。那么DAX究竟起到什么作用,其背后的原理又是什么?本文将率先对其进行揭晓。
  • Linux内存管理原理

    千次阅读 2018-02-22 23:04:24
    =============================硬件原理及分页管理========================... 早期的CPU对内存的寻址是直接对物理内存(内存条)进行寻址,但这种在intel保护模式及现代CPU中已经很少使用,现代的CPU不会直接对物理...
  • 前言:JMM基础-计算机原理 1、物理内存模型带来的问题 2、伪共享 3、Java内存模型(JMM) 4、Java内存模型带来的问题 4.1 可见性问题 4.2 竞争问题 4.3 重排序 5、volatile详解 5.1 volatile特性 5.2 ...
  • 内存的工作原理和时序介绍

    千次阅读 2017-08-05 12:37:13
    内存的工作原理及时序介绍 内存是PC配件中结构最简单的,但在BIOS中却是最难调的,很多玩家超频都卡在内存上。并且,内存原理、结构与时序多年不会改变,无论将来内存技术如何进步,相信这篇文章的存在...
  • 磁盘和内存读写简单原理

    千次阅读 2019-08-15 11:32:25
    当程序要读取的数据时传入内存地址(行地址+列地址),如果数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,通过柱面号,磁头号,扇区号定位磁盘位置,找到数据的起始位置并向后连续读取一页...
  • C++内存泄露检测原理

    千次阅读 2014-04-29 21:48:27
    本文针对 linux 下的 C++ 程序的...其中包括 C++ 中的 new 和 delete 的基本原理,内 存检测子系统的实现原理和具体方法,以及内存泄漏检测的高级话题。作为内存检测子系统实现的一部分,提供了一个具有更好的
  • DDR4内存条PCB.rar

    2019-11-24 23:37:49
    DDR4 DIMM的电路图和PCB,用来查看DDR4原理和布线,用来验证DDR4的走线,是学习DDR4原理布线的重要参考资料
  • 内存工作原理

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

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

    万次阅读 多人点赞 2019-07-01 10:37:28
    目录 ...基本上,它是这样一指令: a) 确保一些特定操作执行的顺序; b) 影响一些数据的可见性(可能是某些指令执行后的结果)。编译器和CPU可以在保证输出结果一样的情况下对指令重排序,使性能得...
  • 内存的工作原理及时序介绍

    千次阅读 2013-02-06 14:52:03
    内存的工作原理及时序介绍 内存是PC配件中结构最简单的,但在BIOS中却是最难调的,很多玩家超频都卡在内存上。并且,内存原理、结构与时序多年不会改变,无论将来内存技术如何进步,相信这篇文章的存在...
  • 计算机原理学习(3)-- 内存工作原理

    万次阅读 多人点赞 2013-09-05 16:02:01
    这一章不仅仅介绍内存的工作原理,还会介绍内存的编址、内存数据存放。逐渐从硬件过渡到软件上来。为后面介绍程序运行打下基础。   1 内存工作原理 CPU和内存是计算机中最重要的两个组件,前面已经知道了CPU是如何...
  • DDR3内存技术原理

    千次阅读 2013-01-16 12:18:59
    随着AMD AM2平台CPU的上市,目前两大处理器巨头均提供了对DDR2内存的支持。不过,DDR2远不是内存技术发展的终点,CPU和内存厂商已经在着手进行DDR3内存的相应准备。DDR2内存的好日子还没过上几天,它的下一代产品DDR...
  • 计算机原理(3)-内存工作原理

    千次阅读 2018-01-19 22:21:48
    CPU和内存是计算机中最重要的两个组件,前面已经知道了CPU是如何工作的,上一篇也介绍了内存采用的DRAM的存储原理。CPU工作需要知道指令或数据的内存地址,那么这样一个地址是如何和内存这样一个硬件联系起来的呢?...
  • Java 内存模型及GC原理

    万次阅读 多人点赞 2011-03-16 09:58:00
    一个优秀Java程序员,必须了解Java内存模型、GC工作原理,以及如何优化GC的性能、与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用...
  • 计算机组成原理内存

    千次阅读 2017-01-11 00:46:21
    内存原理浅析

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 320,868
精华内容 128,347
关键字:

内存条的作用原理