今天小编来为大家解答内存小知识这个问题,内存的知识很多人还不知道,现在让我们一起来看看吧!
计算内存带宽
内存的带宽总量可能是决定一组内存的性能的重要标准之一了。这个是什么意思呢?其实真正理解起来不难,而且还非常容易计算。我们刚才所说的内存带宽总量其实就是在理想状态下这一组内存在一秒内所能传输的最大数据容量。公式也很简单:内存带宽总量(MBytes)=最大时钟速频率(MHz) x总线宽度(bits) x每时钟数据段数量/ 8
好了,我们还是来解释解释吧。“每始终数据段数量”这个是最好理解的了——你只需要记住,如果你的内存是SDR那么这里这个值就等于1,如果您使用的是DDR或者是RDRAM的话,那么这个值就是2。然后我们再将这个值除以8的意义就是将位这个单位换算成为字节。
所以说,对于一般的标准PC2100 DDR内存来说,他的最大时钟频率应该是133MHz,而它的内存总线宽度为64bit,每时钟数据段数为2。所以(133x64x2)/8= 2128MB/s。一秒种能够传输2128MB,现在你知道为什么叫做PC2100了吧?
再来一个例子。这次就拿PC800的RDRAM来计算吧。最大时钟频率为400MHz,内存总线宽度为16bit,每时钟数据段数为2,那么套用公式了之后就是(400x16x2)/8= 1600MB/s。
从这里的大家可以看的出来吧,PC2100的DDR内存能够提供高达2.1GB/s的带宽,而RDRAM内存的带宽只能达到1.6GB/s,但是需要大家注意的是,由于RDRAM是曾对使用,两条内存一共可以3.2GB/s的内存带宽,而新一代的RIMM内存(总线为32位的RDRAM内存)将会使用两个数据通道进行工作,所以,他们的带宽几一下增加了一倍——这样就成为了3.2GB/s,并且单独一条内存即可使用。
内存时钟
首先要我要理性的给大家说,内存的性能并不单单只是由它传送数据的快慢决定的。内存从接受到请求到对这个请求作出反应也是决定内存的性能一个非常重要的因素。而现在大多数的内存性能都被这个重要的因素所制约着,它就是——持续反应时间(潜伏期)。
由于当前RDRAM的持续反应时间比较高,所以,在很大程度上影响了RDRAM内存的性能,并且RDRAM的价格比较高昂,导致现在很多人已经不在向往RDRAM,而投向了DDR内存的怀抱。
内存设置参数
行地址控制器(CAS)
行地址控制器(CAS)可能是最能决定内存模块对数据请求进行响应的因素之一了。通常我们把这个叫做CAS延迟,一般来说,在SDR SDRAM中,我们可以设定为2或者3(当然是根据自己内存的具体情况而定)。对于DDR内存来说,我们一般常用的设定为2或者2.5。
内存中最基本的存储单元就是柱面,而这些柱面通过行和列的排列组成了一个矩阵。而每个行和列的坐标集就代表了一个唯一的地址。所以内存在存取数据的时候是根据行和列的地址集来进行数据搜索的。
寻址到可用(Trp)/CAS到RAS(CMD)
相对而言,Trp以及CMD时间并没有CAS时间那么重要,但是也是足以影响内存的性能的了。一般这个地方设置的值为3(时钟循环),如果把这个这个值改小为2,就可以提升一点内存性能。
列地址控制器(RAS)/其他延迟
内存本身就是一个非常复杂的零部件,可以这么说,计算机内部工作过程最复杂的就是存储器了。但是幸好这些烦琐的工作对于我们这些最终用户来说是透明的,而我们平时用来判断内存性能、质量好坏的这些参数也只是其中的一些部分而已。有两个是不得不提到的,那就是RAS延迟和另外两个延迟。RAS通常为6个始终循环,但是实际上在超频中可以将它修改为5。
Command rate(指令比率)是另外一个比较普遍的延迟。允许进行的设置为1T或者是2T,而通常2T是默认的设置,1T就要比2T稍微快一点点。另外一个需要注意的地方就是Row Cycle Time(Trc,列循环时间),这个参数一般为3或者2。
其他一些和内存紧密相关的参数:
Bank激活时间
Bank循环时间
已装载数据到充电前时间
已装载数据到激活时间
Bank到Bank延迟
大多数的这些参数都是在内存出厂的时候由厂商根据内存的型号种类设定好了的,比如说PC2100 DDR, PC800 RAMBUS, PC133 SDR等等,他们不同的内存会给他们设置不同的参数。而我们不能够自己随意的改动它。
校验内存和缓冲内存和以上我们介绍的内存又有不一样的地方。为了同步内存的时钟频率(这在一些特殊的情况下要求特别严格),数据在输出前是要首先被放到一个叫做“校验区”的存储模块中,这样很多人都把这种内存叫做“校验内存”。这样就可以保证所有从内存中读出的数据都是“同步”的,这样就可以避免很多的数据读写错误了。这样的一个校验过程将会消耗掉一个时钟循环,所以理论上CAS 2的校验内存将会和CAS 3的非缓冲内存性能相当——不要嫌弃,这一切都是为了数据的稳定。
也许有一些朋友会注意到,当他们把内存设置到CAS 2工作模式下的时候,反而系统的性能还没有默认的CAS 2.5/3好了,这是什么原因呢?我的理解是这样的:内存根本就不能稳定的工作在那种模式下,而用户强行的将内存设置为那种工作模式,这样的话就会在存取数据的时候不时的造成数据“丢失”,这样数据不能取得,当然就只能重新读取,这样就浪费掉了很多的时间,当然系统效率就变低了哦。举个例子方便理解吧。内存试着去搜索所有的行和列,但是如果它在这个时钟循环中并没有能够完成这次数据读取,那么就只有等待下一个循环,本来用一个时钟循环就能够解决的问题而现在需要用两个时钟循环甚至三个去完成,这就明显的降低了系统效率。这个时候,越是高的频率越容易导致错误。
内存交错模式
由于在这些延迟的时间间隔内,内存是不能进行读写工作的,所以这个等待时间也造成了内存暂时工作停止。为了避免这种情况发生,内存就可以使用交错模式,但是一般来说,内存默认这项功能是关闭的。如果要提高性能的话,那么就把这个模式设置为2-way甚至4way。
我们再来复习一遍内存的循环过程“CAS-> CMD-> RAS->输出数据”。想像一下,如果你的一半内存正在进行行寻址(CAS阶段),而另外一半的内存已经完成了列的寻址(RAS阶段)。如果是这种情况的话,那么一个输出过程就将会执行两个时钟周期才能完成。大家仔细想想也就知道了,内存交错模式并不能使你的显存的存取速度增倍,但是实际上它利用了显存的等待时间,从而提高了显存的工作效率。
最开始的时候交错模式是应用在独立的两根内存条上的,但是现在已经改变了这种情况,现在单独的一根内存条也可以采用交错模式进行工作。在现在的内存(SDR/DDR SDRAM这些)中,你可以在只有一根内存的情况下就使用2路或者4路交错模式。实际上,交错模式并不是内存条和内存条之间进行的一种“交错”,而是内存的bank和bank之间进行的一种提高效率的工作方式。现在绝大多数的内存都被设计为了4个bank,所以,实际上你可以在2-way和4-way之间做一个选择。
内存技术参数:
我们平常所说的“内存”大都是指“内存条”。那么什么是“内存条”呢?常见的“内存条”又有哪些类型呢?
1.内存条的诞生
当CPU在工作时,需要从硬盘等外部存储器上读取数据,但由于硬盘这个“仓库”太大,加上离CPU也很“远”,运输“原料”数据的速度就比较慢,导致CPU的生产效率大打折扣!为了解决这个问题,人们便在CPU与外部存储器之间,建了一个“小仓库”—内存。
内存虽然容量不大,一般只有几十MB到几百MB,但中转速度非常快,如此一来,当CPU需要数据时,事先可以将部分数据存放在内存中,以解CPU的燃眉之急。由于内存只是一个“中转仓库”,因此它并不能用来长时间存储数据。内存又叫随机存储器断电之后数据全部丢失。而硬盘则不会2.常见的内存条,
目前PC中所用的内存主要有SDRAM、DDR SDRAM、RDRAM等三种类型。曾经主流—SDRAMB SDRAM(Synchronous DRAM)即“同步动态随机存储器”。SDRAM内存条的两面都有金手指,是直接插在内存条插槽中的,因此这种结构也叫“双列直插式”,英文名叫“DIMM”。目前绝大部分内存条都采用这种“DIMM”结构。
随着处理器前端总线的不断提高,SDRAM已经无法满足新型处理器的需要了,早已退出了主流市场。
今日主流—DDR SDRAM
DDR SDRAM(简称DDR)是采用了DDR(Double Data Rate SDRAM,双倍数据速度)技术的SDRAM,与普通SDRAM相比,在同一时钟周期内,DDR SDRAM能传输两次数据,而SDRAM只能传输一次数据。
从外形上看DDR内存条与SDRAM相比差别并不大,它们具有同样的长度与同样的引脚距离。只不过DDR内存条有184个引脚,金手指中也只有一个缺口,而SDRAM内存条是168个引脚,并且有两个缺口。
根据DDR内存条的工作频率,它又分为DDR200、DDR266、DDR333、DDR400等多种类型:与SDRAM一样,DDR也是与系统总线频率同步的,不过因为双倍数据传输,因此工作在133MHz频率下的DDR相当于266MHz的SDRAM,于是便用DDR266来表示。
小提示:工作频率表示内存所能稳定运行的最大频率,例如PC133标准的SDRAM的工作频率为133MHz,而DDR266 DDR的工作频率为266MHz。对于内存而言,频率越高,其带宽越大。
除了用工作频率来标示DDR内存条之外,有时也用带宽值来标示,例如DDR 266的内存带宽为2100MB/s,所以又用PC2100来标示它,于是DDR333就是PC2700,DDR400就是PC3200了。
小提示:内存带宽也叫“数据传输率”,是指单位时间内通过内存的数据量,通常以GB/s表示。我们用一个简短的公式来说明内存带宽的计算方法:内存带宽=工作频率×位宽/8×n(时钟脉冲上下沿传输系数,DDR的系数为2)。
由于DDR内存条价格低廉,性能出色,因此成为今日主流的内存产品。过时的贵族—RDRAM
RDRAM(存储器总线式动态随机存储器)是Rambus公司开发的一种新型DRAM。RDRAM虽然位宽比SDRAM及DDR的64bit窄,但其时钟频率要高得多。从外观上来看,RDRAM内存条与SDRAM、DDR SDRAM内存条有点相似。从技术上来看,RDRAM是一种比较先进的内存,但由于价格高,在市场上普及不是很实际。如今的RDRAM已经退出了普通台式机市场。
3.内存的封装xS{
目前内存的封装方式主要有TSOP、BGA、CSP等三种,封装方式也影响着内存条的性能优劣。
TSOP封装:TOSP(Thin Small Outline Package,薄型小尺寸封装)的一个典型特点就是在封装芯片的周围做出很多引脚。TSOP封装操作方便,可靠性比较高,是目前的主流封装方式。
©电大岳阳县分校论坛--广播电视大学岳阳县分校论坛
BGA封装:BGA叫做“球栅阵列封装”,其最大的特点就是芯片的引脚数目增多了,组装成品率提高了。采用BGA封装可以使内存在体积不变的情况下将内存容量提高两到三倍,与TSOP相比,它具有更小的体积、更好的散热性能和电性能。
CSP封装:CSP(Chip Scale Package,芯片级封装)作为新一代封装方式,其性能又有了很大的提高。CSP封装不但体积小,同时也更薄,更能提高内存芯片长时间运行的可靠性,芯片速度也随之得到大幅度的提高。目前该封装方式主要用于高频DDR内存。
1.时钟周期(TCK)
TCK是“Clock Cycle Time”的缩写,即内存时钟周期。它代表了内存可以运行的最大工作频率,数字越小说明内存所能运行的频率就越高。时钟周期与内存的工作频率是成倒数的,即TCK=1/F。比如一块标有“-10”字样的内存芯片,“-10”表示它的运行时钟周期为10ns,即可以在100MHz的频率下正常工作。
2.存取时间(TAC)/h+L
TAC(Access Time From CLK)表示“存取时间”。与时钟周期不同,TAC仅仅代表访问数据所需要的时间。如一块标有“-7J”字样的内存芯片说明该内存条的存取时间是7ns。存取时间越短,则该内存条的性能越好,比如说两根内存条都工作在133MHz下,其中一根的存取时间为6ns,另外一根是7ns,则前者的速度要好于后者。
3.CAS延迟时间(CL)
CL(CAS Latency)是内存性能的一个重要指标,它是内存纵向地址脉冲的反应时间。当电脑需要向内存读取数据时,在实际读取之前一般都有一个“缓冲期”,而“缓冲期”的时间长度,就是这个CL了。内存的CL值越低越好,因此,缩短CAS的周期有助于加快内存在同一频率下的工作速度。
4.奇偶校验(ECC)
内存是一种数据中转“仓库”,而在频繁的中转过程中,一旦搞错了数据怎么办?而ECC就是一种数据检验机制。ECC不仅能够判断数据的正确性,还能纠正大多数错误。普通PC中一般不用这种内存,它们一般应用在高端的服务器电脑中。
目前市场上主流的内存有SDRAM和DDR SDRAM,内存条品牌主要有胜创,金士顿、三星、宇瞻、富豪、现代等等。
内存在电脑中起着举足轻重的作用。内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。只不过因为RAM是其中最重要的存储器。
通常所说的内存即指电脑系统中的RAM。RAM要求每时每刻都不断地供电,否则数据会丢失。
如果在关闭电源以后RAM中的数据也不丢失就好了,这样就可以在每一次开机时都保证电脑处于上一次关机的状态,而不必每次都重新启动电脑,重新打开应用程序了。但是RAM要求不断的电源供应,那有没有办法解决这个问题呢?随着技术的进步,人们想到了一个办法,即给RAM供应少量的电源保持RAM的数据不丢失,这就是电脑的休眠功能,特别在Win2000里这个功能得到了很好的应用,休眠时电源处于连接状态,但是耗费少量的电能。
按内存条的接口形式,常见内存条有两种:单列直插内存条(SIMM),和双列直插内存条(DIMM)。SIMM内存条分为30线,72线两种。DIMM内存条与SIMM内存条相比引脚增加到168线。DIMM可单条使用,不同容量可混合使用,SIMM必须成对使用。
按内存的工作方式,内存又有FPA EDO DRAM和SDRAM(同步动态RAM)等形式。
FPA(FAST PAGE MODE)RAM快速页面模式随机存取存储器:这是较早的电脑系统普通使用的内存,它每个三个时钟脉冲周期传送一次数据。
EDO(EXTENDED DATA OUT)RAM扩展数据输出随机存取存储器:EDO内存取消了主板与内存两个存储周期之间的时间间隔,他每个两个时钟脉冲周期输出一次数据,大大地缩短了存取时间,是存储速度提高30%。EDO一般是72脚,EDO内存已经被SDRAM所取代。
S(SYSNECRONOUS)DRAM同步动态随机存取存储器:SDRAM为168脚,这是目前PENTIUM及以上机型使用的内存。SDRAM将CPU与RAM通过一个相同的时钟锁在一起,使CPU和RAM能够共享一个时钟周期,以相同的速度同步工作,每一个时钟脉冲的上升沿便开始传递数据,速度比EDO内存提高50%。
DDR(DOUBLE DATA RAGE)RAM:SDRAM的更新换代产品,他允许在时钟脉冲的上升沿和下降沿传输数据,这样不需要提高时钟的频率就能加倍提高SDRAM的速度。
RDRAM(RAMBUS DRAM)存储器总线式动态随机存取存储器;RDRAM是RAMBUS公司开发的具有系统带宽,芯片到芯片接口设计的新型DRAM,他能在很高的频率范围内通过一个简单的总线传输数据。他同时使用低电压信号,在高速同步时钟脉冲的两边沿传输数据。INTEL将在其820芯片组产品中加入对RDRAM的支持。
内存的参数主要有两个:存储容量和存取时间。存储容量越大,电脑能记忆的信息越多。存取时间则以纳秒(NS)为单位来计算。一纳秒等于10^9秒。数字越小,表明内存的存取速度越快。
接口类型,是根据内存条金手指上导电触片的数量来划分的。金手指上的导电触片,也习惯称为针脚数(Pin)。因为不同的内存采用的接口类型各不相同,而每种接口类型所采用的针脚数各不相同。下面就让我带你去看看关于内存条的基础知识吧,希望能帮助到大家!
内存知识详解:接口类型
1、金手指
金手指(connecting finger)是内存条上与内存插槽之间的连接部件,所有的信号都是通过金手指进行传送的。金手指由众多金黄色的导电触片组成,因其表面镀金而且导电触片排列如手指状,所以称为“金手指”。金手指实际上是在覆铜板上通过特殊工艺再覆上一层金,因为金的抗氧化性极强,而且传导性也很强。不过,因为金昂贵的价格,目前较多的内存都采用镀锡来代替。从上个世纪 90年代开始,锡材料就开始普及,目前主板、内存和显卡等设备的“金手指”,几乎都是采用的锡材料,只有部分高性能服务器/工作站的配件接触点,才会继续采用镀金的做法,价格自然不菲。
内存的金手指
内存处理单元的所有数据流、电子流,正是通过金手指与内存插槽的接触与 PC系统进行交换,是内存的输出输入端口。因此,其制作工艺,对于内存连接显得相当重要。
2、内存插槽
最初的计算机系统,通过单独的芯片安装内存,那时内存芯片都采用 DIP(Dual ln-line Package,双列直插式封装)封装,DIP芯片是通过安装在插在总线插槽里的内存卡与系统连接,此时还没有正式的内存插槽。DIP芯片有个最大的问题,就在于安装起来很麻烦,而且随着时间的增加,由于系统温度的反复变化,它会逐渐从插槽里偏移出来。随着每日频繁的计算机启动和关闭,芯片不断被加热和冷却,慢慢地芯片会偏离出插槽。最终导致接触不好,产生内存错误。
内存插槽
早期还有另外一种方法,是把内存芯片直接焊接在主板或扩展卡里,这样有效避免了 DIP芯片偏离的问题,但无法再对内存容量进行扩展,而且如果一个芯片发生损坏,整个系统都将不能使用,只能重新焊接一个芯片或更换包含坏芯片的主板。此种方法付出的代价较大,也极为不便。
对于内存存储器,大多数现代的系统,都已采用单列直插内存模块(Single Inline Memory Module,SIMM)或双列直插内存模块(Dual Inline Memory Module,DIMM)来替代单个内存芯片。这些小板卡插入到主板或内存卡上的特殊连接器里。
3、内存模块
1) SIMM
SIMM(Single Inline Memory Module,单列直插内存模块)。内存条通过金手指与主板连接,内存条正反两面都带有金手指。金手指可以在两面提供不同的信号,也可以提供相同的信号。SIMM就是一种两侧金手指都提供相同信号的内存结构,它多用于早期的 FPM和 EDD DRAM,最初一次只能传输 8bif数据,后来逐渐发展出 16bit、32bit的 SIMM模组。其中,8bit和 16bit SIMM使用 30pin接口,32bit的则使用72pin接口。在内存发展进入 SDRAM时代后,SIMM逐渐被 DIMM技术取代。
2) DIMM
DIMM(Dual Inline Memory Module,双列直插内存模块)。与 SIMM相当类似,不同的只是 DIMM的金手指两端,不像 SIMM那样是互通的,它们各自独立传输信号。因此,可以满足更多数据信号的传送需要。同样采用 DIMM,SDRAM的接口与 DDR内存的接口也略有不同,SDRAMDIMM为 168Pin DIMM结构,金手指每面为 84Pin,金手指上有两个卡口,用来避免插入插槽时,错误将内存反向插入而导致烧毁;
DDR DIMM则采用 184Pin DIMM结构,金手指每面有 92Pin,金手指上只有一个卡口。卡口数量的不同,是二者最为明显的区别。DDR2 DIMM为240pinDIMM结构,金手指每面有 120Pin,与 DDR DIMM一样金手指一样,也只有一个卡口,但是卡口的位置与 DDR DIMM稍微有一些不同。因此,DDR内存是插不进 DDR2 DIMM的,同理 DDR2内存也是插不进 DDR DIMM的。因此,在一些同时具有 DDR DIMM和 DDR2 DIMM的主板上,不会出现将内存插错插槽的问题。
不同针脚 DIMM接口对比。为了满足笔记本电脑对内存尺寸的要求,SO-DIMM(Small Outline DIMM Module)也开发了出来,它的尺寸比标准的 DIMM要小很多,而且引脚数也不相同。同样 SO-DIMM也根据 SDRAM和 DDR内存规格不同而不同。SDRAM的 SO-DIMM只有 144pin引脚,而DDR的 SO-DIMM拥有 200pin引脚。此外,笔记本内存还有 MicroDIMM和 Mini Registered DIMM两种接口。MicroDIMM接口的DDR为 172pin,DDR2为 214pin;Mini Registered DIMM接口为 244pin,主要用于 DDR2内存。
3) RIMM
RIMM(Rambus Inline Memory Module)是 Rambus公司生产的 RDRAM内存所采用的接口类型。RIMM内存与 DIMM的外型尺寸差不多,金手指同样也是双面的。RIMM有也 184 Pin的针脚,在金手指的中间部分有两个靠的很近的卡口。RIMM非 ECC版有 16位数据宽度,ECC版则都是 18位宽。由于 RDRAM内存较高的价格,此类内存在 DIY市场很少见到,RIMM接口也就难得一见了。
基础知识(入门篇)
关于01
我们初学编程时,只知道编写代码,运行程序,却不知道程序是在什么的基础上运行的。只知道声明变量,给变量赋值,数据存储在变量中,却不知道变量是以什么形式存在。
《内存》可以参考《计算机组成原理》和《微机原理》书籍,而作为信息学奥赛的同学们,只需了解《内存》的一些基础知识即可,不必深究。
关于《计算机组成原理》,可参考文章:
【计算机组成原理】(入门篇)
目录02
1、内存的内部结构
2、数据是如何存储在内存中
3、数据在内存中的表现形式
4、存储单元的大小
5、如何从内存中寻找指定的数据(内存地址)
概要03
本篇主要讲解有关《内存》的基础知识,有助于自己在编程上的进一步提升。
为什么学习《内存》的知识可以提升自己对编程进一步的认识呢?
其实,我们学习信奥(C/C++)时,一般只是学习C/C++的相关语法。当我们练习多了,可以熟练地运用各种语法。我们也知道如何将1+1赋给一个int类型变量,也知道不能把整数1赋给string类型变量(对象)。但是1+1赋值操作在内存中是如何实现的呢?为什么浮点型存在误差?为什么int类型与string类型不能直接赋值操作?
我们只知道编写的程序在内存中运行,却不知道数据在内存中是如何存储的。就好比只看到书籍的封面,但不知道书中的内容。
要求04
在学习《内存》之前,我们只需掌握C/C++一些基础知识,可以独立解决一些简单的问题即可。
内存的内部结构
对于信息学奥赛的同学们来说,《内存》这一概念比较抽象。不过,经过阅读文章《【计算机组成原理】(入门篇)》后,相信同学们对内存的概念清晰了不少,至少知道内存是用来存储程序运行的相关数据。
常用数据一般存储在硬盘中,如果对这些数据进行处理(例如使用Word写一篇文章),并不是CPU直接对硬盘的文件进行操作,而是从硬盘相对应的位置把该文件的数据读取到内存中,CPU再对内存中的数据进行处理。简单地说,《内存》是CPU与硬盘进行沟通的“桥梁”。当然,并不一定是硬盘,平时存储数据的设备还有U盘等,统称为外存。
《内存》内部由数以亿计的纳米级电子元件构成。
如上图,内存条由存储芯片、金手指、电路组成。
存储芯片:黑色的方块。每个方块由很多的晶体管组成,可以理解为数据就存储在晶体管中。
金手指:底部的金色金属片。内存条插在主板的内存条插槽中,实际上与插槽接触的部位就是金手指。如此一来,CPU就可以通过主板与内存进行通信。
电路:绿色面板。面板中有许多细微的线路和电阻等电子元件,用于数据的传输。
数据是如何存储在内存中
家里控制电灯的开关,电脑的开关。存储芯片中的晶体管也是如此。程序运行的数据存储在晶体管中。
如上图,每个方格代表一个晶体管。
如下图,每个晶体管都有独立的开关,通电时开,断电时关。此处用白色表示开,黑色表示关。
一个数值并不是只存储在一个晶体管中,是多个晶体管。而多个晶体管构成一个存储单元。
存储单元的大小
存储单元有大小,而一个存储单元的大小是8位(bit)。
内存中常用的存储单位是:位(bit)、字节(Byte)。
1字节=8位
那么一个存储单元也是1字节。
关于《存储单位》的相关知识,会以一篇独立的文章详细讲解。
数据在内存中的表现形式
数据在内存中是以二进制的形式存储。
十进制是由0~9组成,而二进制是由0和1组成。
如上图,这是一个存储单元(8bit),有8个格子,一个格子表示1bit。而每一个格子的值要么0,要么为1。其中,白色表示开,黑色表示关,一般用1和0分别表示开和关。那么用二进制表示是01101001,转换为十进制的值是105,所以该存储单元存储的值就是105。
关于《进制》的相关知识,会以一篇独立的文章详细讲解。
此处只讲解数字数据,其他数据的表现形式很复杂。
如何从内存中寻找指定的数据(内存地址)
先举个例子:
如上图,有几栋楼房,我们都知道,每一栋楼都有一个具体的地址,而一栋楼的每家每户都有各自的房号,从而组成一个完整的地址。而我们的个人居民身份证就有一个详细地址。
居民身份证除了有地址外,还有身份证号码,每一个号码都是唯一。
如何从内存中寻找指定的数据?
内存中的存储单元就像人一样,都有着独一无二的“身份证号码”,就是地址。比如警察叔叔根据身份证号码就能查到对应的个人信息。
再举个例子:
如上图,这是一个书柜,又分成若干个小柜子,现对每个小柜子进行分类放置书籍并设置标签。我们要寻找某一本书时,根据标签就可以轻松找到。程序运行时也是一样,知道要在什么地址进行数据的读写操作。
其他疑问
为什么要分十进制而二进制?
简单说,十进制是给人用的,而二进制是给机器用的。
数据有数字、字母、符号、声音、图像等等。数据是以二进制的形式存储在内存中。
内存数据输出到显示器时,为什么可以显示我们人类能看懂的信息?
内存中的数据是经过转换处理后,我们才能看懂。我们所看到的数据(例如一篇文章、一张照片、一部电影),它们的本质还是二进制。
你不知道的内存知识
一、CPU与内存
先铺垫几个概念,以免后面混乱:
Socket或Processor:指一个物理CPU芯片,盒装还是散装的。上面有很多针脚,直接安装在主板上。
Core:指在Processor里封装一个CPU核心,每个Core都是完全独立的计算单元,我们平时说的4核心CPU,指的就是Processor里面封装了4个Core。
HT超线程:目前Intel与AMD的Processor大多支持在一个Core里并行执行两个线程,此时从操作系统看就相当于两个逻辑CPU(Logical Processor)。大多数情况下,我们程序里提到的CPU概念就是指的这个Logical Processor。
咱们先来看几个问题:
1、CPU可以直接操作内存吗?
可能一大部分老铁肯定会说:肯定的啊,不能操作内存怎么读取数据呢。
其实如果我们用这聪明的大脑想一想,咱们的台式主机大家肯定都玩过。上面CPU和内存条是两个完全独立的硬件啊,而且CPU也没有任何直接插槽用于挂载内存条的。
也就是说,CPU和内存条是物理隔离的,CPU并不能直接的访问内存条,而是需要借助主板上的其他硬件间接的来实现访问。
2、CPU的运算速度和内存条的访问速度差距有多大?
呵呵呵,这么说吧,就是一个鸿沟啊,CPU的运算速度与内存访问速度之间的差距是100倍。
而由于CPU与内存之间的速度差存在N个数量级的巨大鸿沟,于是CPU最亲密的小伙伴Cache闪亮登场了。与DRAM家族的内存(Memory)不同,Cache来自SRAM家族。
而DRAM与SRAM的最简单区别就是后者特别快,容量特别小,电路结构非常复杂,造价特别高。
而Cache与主内存之间的巨大性能差距主要还是工作原理与结构不同:
DRAM存储一位数据只需要一个电容加一个晶体管,SRAM则需要6个晶体管。
由于DRAM的数据其实是被保存在电容里的,所以每次读写过程中的充放电环节也导致了DRAM读写数据有一个延时的问题,这个延时通常为十几到几十ns。
内存可以被看作一个二维数组,每个存储单元都有其行地址和列地址。
由于SRAM的容量很小,所以存储单元的地址(行与列)比较短,可以被一次性传输到SRAM中。DRAM则需要分别传送行与列的地址。
SRAM的频率基本与CPU的频率保持一致,而DRAM的频率直到DDR4以后才开始接近CPU的频率。
3、Cache是怎么使用的?
其实Cache是被集成到CPU内部的一个存储单元(平时也被我们称为高速缓存),由于其造价昂贵,并且存储容量远远不能满足CPU大量、高速存取的需求。
所以出于对成本的控制,在现实中往往采用金字塔形的多级Cache体系来实现最佳缓存效果。
于是出现了,一级Cache(L1 Cache)、二级Cache(L2 Cache)及三级Cache(L3 Cache)。每一级都牺牲了部分性能指标来换取更大的容量,目的也是存储更多的热点数据。
以Intel家族Intel SandyBridge架构的CPU为例:
L1 Cache容量为64KB,访问速度为1ns左右
L2Cache容量扩大4倍,达到256KB,访问速度则降低到3ns左右
L3 Cache的容量则扩大512倍,达到32MB,访问速度也下降到12ns左右(也比访问主存的105ns(40ns+65ns)快一个数量级)
L3 Cache是被一个Socket上的所有CPU Core共享的,其实最早的L3 Cache被应用在AMD发布的K6-III处理器上,当时的L3 Cache受限于制造工艺,并没有被集成到CPU内部,而是被集成在主板上,如图:
从上图我们也能看出来,CPU如果要访问内存中的数据,则需要经过L1、L2、L3三道关卡,就是这三个Cache中都没有需要的数据,才会从主内存中直接进行读取。
最后我们来看下Intel Sandy Bridge CPU的架构图:
二、多核CPU与内存共享的问题
问题:Cache一致性问题
多核CPU共享内存的问题也被称为Cache一致性问题。
其实就是多个CPU核心看到的Cache数据应该是一致的,在某个数据被某个CPU写入自己的Cache(L1 Cache)以后,其他CPU都应该能看到相同的Cache数据。
如果在自己的Cache中有旧数据,则抛弃旧数据。
考虑到每个CPU都有自己内部独占的Cache,所以这个问题与分布式Cache保持同步的问题是同一类问题
目前业界公认的解决一致性问题的最佳方案就是Intel的MESI协议了,大多数SMP架构都采用了这一方案。
解决方案:MESI
不知道大家还记得Cache Line吗,就是我们常说的高速缓存中缓存条目里面的那个缓存行。
其实仔细想想,在进行I/O操作从来不以字节为单位,而是以块为单位,有两个原因:
I/O操作比较慢,所以读一个字节与读连续N个字节的花费时间基本相同
数据访问一般都具有空间连续的特征
所以CPU针对Memory的读写也采用了类似于I/O块的方式
实际上,CPU Cache(高速缓存)里最小的存储单元就是Cache line(缓存行),Intel CPU的一个Cache Line存储64个字节。
每一级Cache都被划分为很多组Cache Line,典型的情况就是4条Cache Line为一组。
当Cache从Memory中加载数据时,一次加载一条Cache Line的数据
如图我们可以看到,每个Cache Line头部都有两个Bit来标识自身状态,总共四种:
M(Modified):修改状态,在其他CPU上没有数据的副本,并且在本CPU上被修改过,与存储器中的数据不一致,最终必然会引发系统总线的写指令,将Cache Line中的数据写回Memory中。
E(E__clusive):独占状态,表示当前Cache Line中的数据与Memory中的数据一致,此外,在其他CPU上没有数据的副本。
S(Shared):共享状态,表示Cache Line中的数据与Memory中的数据一致,而且当前CPU至少在其他某个CPU中有副本。
I(Invalid):无效状态,在当前Cache Line中没有有效数据或者该Cache Line数据已经失效,不能再用;当Cache要加载新数据时,优先选择此状态的Cache Line,此外,Cache Line的初始状态也是I状态
在对Cache(高速缓存)的读写操作引发了Cache Line(缓存行)的状态变化,因而可以将其理解为一种状态机模型。
但MESI的复杂和独特之处在于状态有两种视角:
一种是当前读写操作(Local Read/Write)所在CPU看到的自身的Cache Line状态及其他CPU上对应的Cache Line状态
另一种是一个CPU上的Cache Line状态的变迁会导致其他CPU上对应的Cache Line状态变迁。
如下所示为MESI协议的状态转换图:
具体MESI的实现过程可以看我另一篇文章:看懂这篇,才能说了解并发底层技术
深入理解不一致性内存
MESI协议解决了多核CPU下的Cache一致性问题,因而成为SMP架构的唯一选择,而SMP架构近几年迅速在PC领域(__86)发展。
SMP架构是一种平行的架构,所有CPU Core都被连接到一个内存总线上,它们平等访问内存,同时整个内存是统一结构、统一寻址的。
如下所示给出了SMP架构的示意图:
随着CPU核心数量的不断增加,SMP架构也暴露出天生的短板,其根本瓶颈是共享内存总线的带宽无法满足CPU数量的增加,同时,在一条“马路”上通行的“车”多了,难免会陷入“拥堵模式”。
不知道你是否听说过总线风暴,可以看下:总线风暴
在这种情况下,分布式解决方案应运而生,系统的内存与CPU进行分割并捆绑在一起,形成多个独立的子系统,这些子系统之间高速互联,这就是NUMA(None Uniform Memory Architecture)架构,如下图所示。
可以看出,NUMA架构中的内存被分割为独立的几块,被不同CPU私有化了。
因此在CPU访问自家内存的时候会非常快,在访问其他CPU控制的内存数据时,则需要通过内部互联通道访问。
NUMA架构的优点就是其伸缩性,就算扩展到几百个CPU也不会导致性严重的下降。
NUMA技术的特点
在NUMA架构中引入了一个重要的新名词——Node
一个Node由一个或者多个Socket Socket组成,即物理上的一个或多个CPU芯片组成一个逻辑上的Node
我们来看一个Dell PowerEdge系列服务器的NUMA的架构图:
从上图可以看出其特点:
4个处理器形成4个独立的NUMA Node由于每个Node都为8 Core,支持双线程
每个Node里的Logic CPU数量都为16个,占每个Node分配系统总内存的1/4
每个Node之间都通过Intel QPI(QuickPath Interconnect)技术形成了点到点的全互联处理器系统
NUMA这种基于点到点的全互联处理器系统与传统的基于共享总线的处理器系统的SMP还是有巨大差异的。
在这种情况下无法通过嗅探总线的方式来实现Cache一致性,因此为了实现NUMA架构下的Cache一致性,Intel引入了MESI协议的一个扩展协议——MESIF
针对NUMA的支持
NUMA架构打破了传统的“全局内存”概念,目前还没有任意一种编程语言从内存模型上支持它,当前也很难开发适应NUMA的软件。
Java在支持NUMA的系统里,可以开启基于NUMA的内存分配方案,使得当前线程所需的内存从对应的Node上分配,从而大大加快对象的创建过程
在大数据领域,NUMA系统正发挥着越来越强大的作用,SAP的高端大数据系统HANA被SGI在其UV NUMA Systems上实现了良好的水平扩展
在云计算与虚拟化方面,OpenStack与VMware已经支持基于NUMA技术的虚机分配能力,使得不同的虚机运行在不同的Core上,同时虚机的内存不会跨越多个NUMA Node
关于本次内存小知识和内存的知识的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。