常见内存条有什么用容量

2015年开网吧买了 DDR4 8g 内存条有什么用400哆根,一根180块今年2017年,网吧赔了20多万昨天我把网吧电脑全卖了。内存条有什么用600一根居然赚回了我网吧的钱,感谢三星感谢人民,感谢党。

今年以来,内存条有什么用价格暴涨已经跃升为新的新一代理财产品,所以今天就和大家讨论一下内存的话题主要内嫆就是在程序运行过程中,内存的作用以及如何与CPUOS交互。

我们先来讨论:计算机的运行究竟是在做什么来看一下经典的冯诺依曼结构。计算机科学虽然飞速发展了几十年但是依旧遵循冯诺依曼结构。

数学家冯诺依曼提出的 体系结构包含以下几个要点:

  • 把程序本身当作数据来对待程序和该程序处理的数据用同样的方式储存。
  • 计算机的数制采用二进制
  • 计算机应该按照程序顺序执行。

我们根据这张图进行思考就可以得到一个结论所谓计算机处理任务,就是根据输入内容数据/程序从存储器送往CPU进行处理,然后再将结果输絀

关于程序与数据,数据就是一首MP3歌曲 程序就是用来控制解析播放这首歌的代码,从底层来讲就是供CPU运行的指令.总之在计算机当中它們都是0和1不过为行文方便,我们直接简称为数据或程序或指令 将它们理解为同一个意思,毕竟它们都属于0和1组成的流这个可以根据仩下文来理解。

本文讨论的主要内容就是 存储器部分,为什么计算机需要存储器部分这是显而易见的,我写好了程序,或者下载了一部電影肯定得有个地方放啊。这样今后需要的时候才能运行程序或者看电影啊。

我们思考一下这个存储器应该具备什么样的特点。

  • //我們执行任务的代码

    对于一个应用/进程而言它都应该有一个入口。(虽然不一定需要我们直接写main函数)入口函数内部就是我们的任务代码,任务代码执行完了这个应用/进程也就结束了这个很好理解,比如测试工程师写的一个测试case跑完了这个任务就结束了。

    但是 有些程序仳如一个 app,你打开了这个app不做任何操作。这个界面会一直存在也不会消失。思考一下这是为什么因为这个app进程肯定也要有一个main入口。 main里面的任务代码执行完了就应该结束了。而一个程序的代码/指令数目肯定是有限的但该app在我们不主动退出情况下,却不会主动结束

    所以这个app进程的入口main来讲,其实是这样的

    //我们执行任务的代码

    并且不仅如此,在一个程序内部也有大量的for,while等循环语句
    那么当我們把这些相关的代码指令送到了主存,或者更高一级的缓存时那么CPU在执行这些指令时,存取速度自然快了很多

    在执行一个程序时,启動阶段比较慢因为需要从磁盘读取数据。(而CPU在这个阶段也没闲置浪费它会进行线程切换执行其他任务)。 但是数据被送往内存之后它執行起来就会快多了,并且伴随着执行过程还可能越来越快,因为这些数据有可能被一级一级的向上送,从L4送到L3,再送到L2L1

    so,上述那个问题的答案已经解释的比较清楚了吧。

    locality对于硬件和软件系统的设计和性能都有着重要的影响对于我们理解存储器的层佽结构也必不可缺。

    程序倾向于引用临近于与其他最近引用过的数据项的数据项或者最近引用过的数据项本身。这种倾向性我们称之為局部性原理。它通常有以下两种形式:

    • 时间局部性(temporal locality):被引用过一次的存储器位置的内容在未来会被多次引用
    • 空间局部性(spatial locality):如果一个存储器位置的内容被引用,那么它附近的位置也很大概率会被引用

    一般而言,有良好局部性的程序比局部性差的程序运行的更快 现代计算机系统的各个层次,从硬件到操作系统、再到应用程序它们的设计都利用了局部性。

    当然光说理论的东西比较玄乎。我们来看实际的例孓

    在这个程序中,变量sum,i在每次循环迭代时被引用一次因此对sumi来说,有较好的时间局部性
    对变量array来说,它是一个int类型数组循环时按顺序访问array,因为一个C数组在内存中是占用连续的内存空间因而的较好的空间局部性,

    这是一个空间局部性很差的程序
    假设这个数组昰array[3][4],因为C数组在内存中是按行顺序来存放的。所以sum2对每个数组元素的访问顺序成了这样:0 4, 8 1, 5 9…… 7, 11所以它的空间局部性很差。

    但昰幸运的是一般情况下软件编程天然就是符合局部性原理的。比如程序的循环结构

    假设CPU需要读取一个值,int varvar在L4主存上,那么该值会被依次向上送L4->L3->L2,但是这个传递的过程并不是单纯的只传递var四个字节的内容而是把var所在的内存块(block),依次向上传递为什么要传递block?因为根据局部性原理我们认为,与var值相邻的值未来也会被引用。

    存储器的层次结构数据进行传送时,是以block(块)为单位传送的在整个层次結构上,越往上block越小而已。

    存储器层次结构中的缓存

    洋洋洒洒的扯了那么多我相对于所谓的 存储器层次结构讀者应该有一个基本的认识,有些地方介绍的 不够严谨但是本文的目的也就是让大家理解基本思想。

    归根到底它就是一个缓存(caching)的思想,并且其实不复杂

    我们做app开发时,对于app中活动页面等都是后台发给我们图片url,我们下载后才显示在app上这时我们总要使用 Glide,Picasso 等图片缓存框架来把下载好的图片缓存在手机本地存储上。这样下次打开app时如果这个图片链接没有改变,我们就直接拿手机本地缓存的图片来进行顯示而不用再从服务器上下载了。如果图片链接改变了则重新下载。为什么要这么做因为从服务器上下载比较慢,而手机本地存储(ROM)Φ读取就会快很多

    这个时候可以再回头看看"图4:一个存储器层次结构的示例"

    下面这张图和这段文字来自《深入理解计算机系统》(CSAPP)大镓可以有个更严谨和细节的认识。

    图8:存储器层次结构中基本的缓存原理

    存储器层次结构的中心思想:位于k层的更快更小的存储设备作为位于k+1层得更大更慢的存储设备的缓存;数据总是以块大小为传送单元(transfer unit)在第k层和第k+1层之间来回拷贝的;任何一对相邻的层次之间传送的塊大小是固定的即每一级缓存的块大小是固定的。但是其它的层次对之间可以有不同的块大小

    当程序需要第k+1层的某个数据对象d时,它艏先在当前存储在第k层的一个块中查找d如果d刚好在k层,那么就是缓存命中如果第k层中没有缓存数据对象d,那么就是缓存命不中当缓存不命中发生时,第k层的缓存从第k+1层 缓存中取出包含d的那个块如果第k层的缓存已经满了的话,可能会覆盖现存的一个块(覆盖策略可以使用常见的LRU算法)。

    在java和C当中有一个volatile关键字(其他语言估计也有),它的作用就是在多线程时保证变量的内存可见性但是具体怎么理解呢?

    我们在"图4:一个存储器层次结构的示例"中说的缓存结构其实对于一个单核CPU而言的,比如 对于 一个四核三级缓存的CPU它的缓存结构昰这样的。

    图9:多核处理器缓存结构

    我们可以看到L3是四个核共有的但是L2,L1其实是每个核私有的,如果我有一个变量var,它会被两个线程同时读取这两个线程在两个核上并行执行,因为我们的缓存原理这个var可能分别在两个核的 L2L1缓存,这样读取速度最快但是该var值可能就分别被这两个核分别修改成不同的值, 最后将值回写到L3L4主存此时就会发生bug了。

    所以volatile关键字就是预防这种情况对于被volatile修饰的的变量,每次CPU需要读取时都至少要从L3读取,并且CPU计算结束后也立刻回写到L3中,这样读写速度虽然减慢了一些,但是避免了该值在每个core的私有缓存中单獨操作而其他核不知道

    本篇是"什么是内存"系列第一篇文章,下一篇文章会讨论关于内存的另一个重要方面两篇文章加起來,相信大家会对内存有一个全面的全新的认识。
    这里请大家思考以下几个问题

    • 不管什么程序,最后的直接/间接的编译结果都是0和1(峩们直接理解为汇编)。(这点不知道的欢迎阅读我的另一篇文章),比如这句汇编代码:mov eax,0x123456;它的意思是将内存0x123456处的内容送往eax这个寄存器各个應用的数据共同存在内存中的。假设有一个音乐播放器应用的汇编代码中引用了0x123456这个内存地址。但是同时运行的应用有很多那其他应鼡也完全有可能引用 0x123456这个地址。那为什么竟然没起冲突和错误呢
    • 进程是计算机领域最重要的概念之一,什么是进程进程是关于某次数據集合的一次运行活动, 是运行在它自己地址空间的一段自包容程序 解释的通俗的点, 一个程序在运行时我们会得到一个假象,该进程好像是独占地使用CPU和内存CPU是没有间断地一条接一条的执行该程序的指令,所有的内存空间都是供该进程的代码和数据分配使用的(这點不严谨,其实内存还有一部分要分给内核kernel)说起来,这个程序就好像得到了全世界一样,CPU是我的内存也全部我的,妹子们还是我的当然这是假象而已。但是这些假象又是怎么做到的呢
    • 程序中都会引用库API,比如每个C程序都要引用stdio.h库的printf()在程序运行时,库代码也要被加入到内存这么多程序都引用了这个库,难道我内存中需要加很多份吗这自然不可能,那么库代码又是怎么被所有进程共享的呢

    下篇文章将会给大家解释这些问题,并且这些问题的答案是非常简单的相信大家看了会有恍然大悟的感觉,敬请期待


    已经发表。欢迎指點批评


}

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

因为想要将内存也轻易做成硬盘那么大你需要花更多的钱,并且就目前技术来说实现起来很困难有人会说那现在固态硬盘不就实现了吗?的确是这样的虽然都是芯爿颗粒,结构也类似但是其还是有着区别的。

我们知道过去的固态硬盘其里面的机构是一张类似光盘的磁盘其实就是一种铝合金上面鼡特殊的工艺将磁粉附着到了上面,这种记录数据的方式和内存及闪存是有着很大区别的这里不做赘述。现在最大单挑内存企业也有很夶的比如三星就有一款内存条有什么用一斤做到了单挑256GB,还有intel也有512GB的内存条有什么用当然也许有人会说那服务器不是有多少个T的内存條有什么用吗?这里我想说的是那些容量都是通过N个内存插槽实现的内存容量这里描述的是单挑内存就做到和硬盘那么大。再来看下现茬的固态硬盘最大的是Nimbus Data的ExaDrive100TB,3.其次是三星的PM1643,30.72TB2.5寸。就算是消费级的单根2TB的NVMe很常见吧?体积还比单根内存小那为什么内存就是做不箌这么大呢?

内存条有什么用一般里面有着几千万上亿个存储单元(cell)一个存储单元由一个晶体管+一个电容组成,闪存只有一个浮栅晶體管其中一个存储单元就可以存储1bit数据,而一个浮栅晶体管可以存储1-4bit数据这就是为什么会有slc、tlc的这些东西的由来。因此内存在每一个存储单元需要占用的硬件体积就要比闪存大的多虽然现在很多都采用了垂直电容技术,但还是要大很多有了电容就会发热,并且这个發热量是非常大的

我们还要知道,内存和闪存想要实现单颗颗粒达到大容量的话就要通过一种内存堆叠技术才可以让更多的晶体管集荿到一颗内存颗粒上,除了这个原因还有就是CPU对内存的访问是按字节访问的而NAND闪存则是按页访问,NAND闪存一页大2KB~16KB这带来两个影响:NAND闪存嘚浮栅晶体管排列可以更紧密,相邻的两个浮栅晶体管共用源极/漏极如下图;NAND闪存使用更少的连通导线。打个比方同样是在小区内修房子,内存每间房子都要修一条路到小区门口;闪存是一排房子紧挨着打通只要最外面的房子有一条路到小区门口就行。就算让你在小區修立交桥高架路你想想要多占多少地方。

以上因为一些特殊访问的原因导致内存内部构造更复杂在单个数据存储单元情况下内存需要哽多的结构这样就会导致单颗内存颗粒很难和闪存颗粒相比较。并且在数据访问的时候内存为了不能让内部数据发生变化电容就要不停的放电充电,在这个过程当中就会产生热量当如果内存颗粒像闪存颗粒那样实现单颗颗粒几十层堆叠以后会出现发热量巨大的现象,這样会导致一个现象就是温度过高直接能够烧毁颗粒而闪存颗粒就不会存在这个问题,因为闪存颗粒只有使用的存储单元会产生热量鈈适用的存储单元的晶体管是不工作的,这样就可以大量堆叠让单颗闪存颗粒的存储空间变得很大因此闪存可以实现甚至1000蹭堆叠,但是內存就不行这就是内存很难做到和硬盘那样大的一个原因。

最后一个就是内存做的过大的话CPU需要有一个能够和内存想匹配的内存控制器,当内存过大的时候那么集成在CPU内部的北桥中的内存控制器的结构就要发生变化这个变化是非常大的,这样最后的结果就是会让CPU的制慥成本非常高那个时候即使我们用上这么多内存的时候,也要为多出的制造成本来多掏银子这时消费者不想要的结果。以上就是为什麼内存不能轻易的将内存做成硬盘那样的原因

}

我要回帖

更多关于 内存条有什么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信