明白时钟频率与数据频率之间的关联
最编程
2024-07-31 07:21:19
...
1.内存和CPU的有关数据
在正式讨论问题之前,我们首先要把内存的核心频率、时钟频率和数据频率之间的关系搞清楚,而且应该特别熟悉。这是讨论这个问题的基础。见下表:表1内存名称及各种频率列表
由表1可见,核心频率、时钟频率和数据频率之间有固定的关系。它们之间的比例关系见表2。表2.内存的核心频率、时钟频率和数据频率之间的比例关系
其中的核心频率又称颗粒频率或基本频率;时钟频率又称工作频率、内存频率、I/O频率、DRAM、DRAMFrequency、时脉或内存速度;数据频率又称等效频率或传输通道频率。本文只采用“核心频率”、“时钟频率”和“数据频率”三个名称。对这些名称一定要弄清楚。另外,有关CPU的名称也是五花八门的。例如,主频又称CoreSpeed;外频的名称就更多了,如BusSpeed、汇流排频率、FSB(和前端总线混用)等。
2.内存和CPU搭配的基本原则
我认为:无论你采用的CPU是Intel的,还是AMD的,当选配内存时都必须遵守三条基本原则。第一条是频率要同步:即内存的核心频率要等于或稍大于CPU的外频。不要给内存加上它不能承受的高频率,否则是频率“过载”。频率“过载”后,内存将拒绝工作。这样,电脑是要蓝屏的。当然,你给它加上低于核心频率的频率时,它会是胜任愉快的。第二条是带宽要匹配:应该设法使内存的数据带宽跟CPU前端总线的带宽相等,否则,数据的传输能力将受制于带宽较低的那端;第三条是主板要调控:因为以上两个条件有时是不可能同时能满足的。这就要靠主板来调控,调控的主要方法是异步设臵。因为第一条是有关生或死的问题,所以,这一条必须满足。第二条就可以灵活处理了。另外,当讨论内存跟CPU如何搭配时,必须明确以下事项:①内存的核心频率小于外频时,内存会拒绝工作。表现是蓝屏。但是,在任何情况下,内存的核心频率大于CPU的外频时,内存都能正常
工作。但是,系统也不会承认它的高频率。只承认它的核心频率等于外频。例如,你将DDR2-1066插入外频是200MHz的板子上时,系统将认为这个内存是DDR2-800。②Intel处理器的前端总线频率(FSB)是外频频率的4倍。但是,在历史上前端总线的频率和外频是同一个,所以,人们还是经常用FSB来表示外频(例如软件CPU-Z就是这样,它表示的“FSB:DRAM”实际上是指“CPU的外频:内存的时钟频率”)。AMD的内存,在K8以前,也有前端总线,不过,那时的前端总线频率是外频频率的两倍。K8以后AMD的CPU就没有前端总线了。③当讨论内存跟Intel平台的CPU的匹配时,必须知道CPU的外频或前端总线频率。知道一个就行,因为它们之间是四倍关系,此时,不必关心CPU的主频是多少。不过,自从有了Intel的i3/i5/i7后,参照的CPU频率已经不是外频和前端总线FSB,而是基本频率BF了。但是,在检测软件CPU-Z中,还是把BF频率称为外频的。在这种情况下,怎样配内存,请参看本文之6。④当讨论内存跟AMD平台的CPU匹配时,首先必须明确这个CPU是K8的?K10的?还是K8以前的?因为这三种CPU陪内存的方法是截然不同的。讨论K8以前的CPU时,只需知道外频或FSB;讨论给K8的CPU配内存时,只需知道CPU的主频,不要提HT总线,因为配内存跟HT总线无关;同样的原因,当为K10配内存时,如果你不超频,只需知道CPU
或主板支持什么内存就可以了。因为K10架构的CPU配内存时是跟外频挂钩的,而AMDCPU的外频是固定在200MHz的。⑤当讨论内存跟CPU的搭配关系时,是根据内存和CPU的参数计算的,不必考虑主板。但是,当你对搭配方案作出选择后,还必须考虑主板是否支持。在一般情况下,主板的频率是应该高于FSB的频率的。⑥内存的异步就是使加给内存的频率是它能正常工作的频率。一般是指降频。但是,频率降下来的后果就是速度变慢和带宽变窄。所有主板都支持内存异步运行的。但是,支持的程度不同。⑦从内存跟CPU是否搭配的角度看,配内存时,不必考虑内存的容量是多少。但是,容量超过一定大小时,有时是要考虑主板是否支持的。⑧内存跟CPU是否匹配,跟CPU是几个核没有什么关系。以上就是我认为内存匹配的三大原则和八项注意。
3.在Intel平台实现频率同步的方法
在Intel平台,内存频率跟CPU同步的条件就是:内存的核心频率必须等于或稍大于CPU的外频。否则,就是“频率过载”,内存将停止工作,主要的表现形式是蓝屏。虽然对我这个说法经常听到不同的声音。但是,我坚信我的这个归纳方法是完全能站得住脚的。因为内存能够耐受多大的频率,完全是由核心频率决定的。时钟频率和数据频率都是在核心频率的基础上,通过技术手段放大出来的。当核心频率相等时,不同类型的内存会有不同的时钟频率和数据频率。
例如,在Intel平台,当外频是200MHz时,为了实现频率同步,应该选DDR-400、DDR2-800或DDR3-1600。因为这几种内存的核心频率都是200MHz。这是十分重要的一条规律。但是,过去,人们都是把内存的同步条件说成“内存的时钟频率(而不是说“内存的核心频率”)等于或稍大于外频频率就是同步”。更多的是模棱两可的说法,比如说“内存的频率等于或稍大于外频,就是同步”。至今在网上的许多文章还是这样说的。相当混乱。我认为,在SD和DDR时代,说“时钟频率和核心频率相等就是同步”,是完全正确的。但是,在DDR2和DDR3出现以后,再这样说就是完全错误的,因为不同类型的内存。其核心频率跟时钟频率是不同的。因此,两种判别方法存在巨大差异。不过,囿于习惯,人们还是愿意用时钟频率来跟CPU的外频对比。我认为,按时钟频率跟CPU频率对比的方法来判断内存是否同步也不是不可以的。但是,必须把这个比作适当改动。比如说:“对于SDRAM和DDR,当内存的时钟频率跟CPU的外频相等时,就是内存同步。例如,当外频是200MHz时,应该配DDR-400的内存”;对于DDR2,就应该说:“当内存的时钟频率是外频的两倍时,就是内存同步。例如,当外频是200MHz时,应该配DDR2-800内存”;对于DDR3,就应该说:“当内存的时钟频率是外频的4倍时,就是内存同步。例如当外频是200MHz时,就应该配DDR3-1600内存”。这样说不是太啰嗦了吗!
可是,在检测软件CPU-Z中,就是用CPU的外频(此处称其为FSB)跟时钟频率(此处称为DRAM)的比值关系表示内存是否同步的的。其关系见下表:表3内存同步时,CPU的外频跟内存的时钟频率的频率关系
内存的类型FSB:DRAM(即CPU的外频跟内存时钟频率之比)DDR1:1DDR21:2DDR31:4
注:在检测软件CPU-Z中,就是用“FSB”表示CPU的外频的,这是历史形成的误用。上表中的“DRAM”是指时钟频率。
知道了以上原则,我们应该选什么样的内存跟CPU来匹配的问题也就迎刃而解了。我认为:对Intel的CPU在i3/i5/i7架构出现以前,只要能知道外频或前端总线频率(FSB=4倍外频)中的一个参数,就可以选择合适的内存了。不同型号的内存有不同的计算方法。具体计算方法是:
①当在Intel平台选择DDR内存时有:
DDR-×××后的三个“×”=FSB值÷2(1)例如,当Intel平台的FSB是533MHz时,如果选择DDR内存时,×××=533÷2=266,所以,应该选DDR-266型的内存。这样选也符合“内存的核心频率(133MHz)等于CPU外频(133MHz)”的原则。②当在Intel平台选择DDR2内存时有:DDR2-×××后的三个“×”=FSB值(2)
例如,当Intel平台的FSB是800MHz时,如果选择DDR2内存时,×××=FSB值=800,所以,应该选DDR2-800型的内存。这样选也符合“内存的核心频率(200MHz)等于CPU外频(200MHz)”的原则。
③当在Intel平台选择DDR3内存时有:DDR3-××××后的四个“×”=FSB值×2(3)
例如,当Intel平台的FSB是800MHz时,如果选择DDR3内存,就应该选四个“×”等于800×2=1600的内存,即应该选DDR3-1600型的
内存。这样选也符合“内存的核心频率(200MHz)等于CPU外频(200MHz)”的原则。下表就是我根据上述原则计算出来的、根据CPU的参数来选择内存的计算结果。这是根据频率同步的条件计算出来的最高频率。都存在向较低频率异步的空间。(i3/i5/i7架构的CPU如何选内存,见本文的6)表4.内存同步时外频频率跟内存型号的关系
注①:表中的“频率比”是指同步的情况下,外频跟时钟频率的比,即在CPU-Z中的“FSB:DRAM”值。如果CPU-Z显示的不是这个值,那就是内存频率异步了。
根据CPU-Z中的“FSB:DRAM”比还可以很容易反求出来在电脑中安装的,(或设臵的)是什么型号的内存。例如,当你的CPU的外频是200MHz、而且安装的内存是DDR2时,如果CPU-Z的显示是“FSB:DRAM=1:1.66”的话,那就肯定你安装的内存不是在同步状态。因为DDR2内存同步时,其比是1:2。那么安装的是什么内存呢?可以有下述方法计算出来:因为200:X=1:1.66,所以,X=333。这个333就是实装内存的时钟频率值333MHz,由此可以断定,这个内存是DDR2-667。
注②:DDR、DDR2和DDR3内存的针脚和插座都是不相同的,不能用错。所以,当选择主板时,要搞清楚主板支持哪类内存。目前,为了用户方便,有的主板同时具有DDR2和DDR3内存插槽。
4.在Intel平台实现带宽相等的计算方法
什么是带宽呢?在计算机领域,带宽又叫频宽,是指在固定的时间内可以传输的数据量,亦即在传输通道中可以传递数据的能力。带宽通常以比特每秒(bps)表示,即每秒可传输的位数。但是,为了简化,通常都是以MB/s或GB/s表示的。带宽的计算方法是:带宽=频率×总线位数/8(4)
因为电脑内存总线的传输位数是64比特所以对于频率是800MHz,,的通道来说,带宽=800MHz×64b÷8b/B=6.4GB/s。还有一个简捷计算方法,就是带宽=频率数×8B(5)
例如,当频率等于800MHz时,带宽就是800MHz×8B=6400MB/s=6.4GB/s。在表1中已经给出了不同频率和带宽关系的计算结果。这里说的带宽匹配,实际上就是频率的匹配。对于我们普通使用者,还是按频率来论述比较直观,因为带宽相等,就是频率相等。带宽匹配的原则是:内存的数据带宽应该跟CPU前端总线FSB的带宽相等,或者说:“内存的数据频率等于CPU的FSB频率,就是带宽匹配”。只有这样才能保证数据的顺利传输。如果有一方的带宽小于另一方,小带宽的一方就构成了“瓶颈”。但是,如果CPU已经选定了,内存的带宽大一些,并没有坏处。
在满足同步的条件下,对DDR2来说,就会自动满足带宽相等的要求,即可以做到内存的传输带宽等于前端总线的带宽;但是,对DDR来说如果满足了同步的要求内存的带宽仅是FSB带宽的1/2对于DDR3,,;来说,如果满足了同步的要求,内存的带宽就是FSB带宽的两倍。这种关系见下表。表5内存同步时,FSB的带宽跟内存数据通道的带宽的关系内存的类型DDRDDR2DDR3
1:2
FSB的带宽:内存数据通道的带宽2:11:1
对内存的同步要求是生或死的问题,所以,必须满足,如果不能满足,必须采取异步运行。但是,对于带宽的要求则比较灵活一些。如果不能满足,也可以用双通道或异步的方法来解决。在DDR时代就是利用双通道的方法解决内存带宽是“瓶颈”的问题的。但是,如果不组成双通道,只用一个内存条,只要频率是同步的,也可以正常工作。在AMD平台,其内存控制器臵入CPU内部了。即CPU直接跟内存打交道了。带宽的问题,已经没有那么重要了。
5.在Intel平台用主板调控内存运行参数的方法
①主板的自动调控作用:其实,根据内存的同步要求选择出来的内存(见表4)就可以正常使用了。但是,也有例外的情况。比如:有的时候,按计算结果,应该用DDR2-800内存才能同步,但是,你手头没有DDR2-800,只有DDR2-667内存,并安装上去了。怎么办呢?要靠主板的调控。只要你没有在BIOS中的“MemClockMode”中选“Manual”,也没有在“SystemMemoryMultiplier”项更改默认设臵“Auto”,主板就会自动根据内存条上SPD资料把加于内存的时钟频率降到
333MHz,以使DDR2-667内存的频率不过载。这时CPU-Z的“FSB:DRAM”就是“1:1.66”,而不是“1:2”。这样调整过后,速度降低了,内存的带宽也变小了一些,但是,可以正常运行。还有,如果满足内存同步需要的内存是DDR2-800,而你却安装或设臵了DDR2-1066内存,主板也会把加给内存的频率按DDR2-800对待,CPU-Z对“FSB:DRAM”的显示还是“1:2”,不会显示“1:2.66”但。是,如果你是把内存超频到1066MHz的,CPU-Z则会显示“1:2.66”。②主板的手动调控方法:如果你要自己用手动设臵内存也是可以的。方法是:在BIOS的“SetMemoryClock”项选“Manual”(手动);或在“SystemMemoryMultiplier”项不选择“Auto”,而是选择你实际安装在内存插槽上的内存,设臵就会成功的。当然,还是需要主板支持的,也就是说,如果主板上有种这种设臵项目才行。手动设臵的选项有多种方法。有的直接用内存芯片名称表示(如华硕的P5E3WS主板,直接用诸如DDR3-1333表示);有的用数字表示(如技嘉GA-P31-S3G主板就用3.33或4.0表示。3.33就表示DDR2-667内存);当然,有的主板则是用FSB:DRAM的比值表示。6.在Intel平台没有FSB了,怎么配内存?Intel酷睿i3/i5/i7CPU是把内存控制器置于CPU内部了。内存控制器控制的QPI(QuickPathInterconnect,快速通道互联)总线频率远高于传统的FSB(一般是外频的18倍),因此,为它选配内存的空间范围也大多了。例如,在过去,当外频是133MHz时,FSB=4×133mHz=533MHz,这种关系是固定的。如果选DDR内存,最高是DDR-266;
如果选DDR2内存,最高是DDR2-533;如果DDR3内存,最高是DDR3-1066。如果你选择更高频率的内存,系统是不承认的,它只能把它们作降格处理。实际上FSB成了“瓶颈”。自从有了QPI总线以后,选择内存的条件就宽松多了。这时CPU-Z上显示的“外频”133MHz,已经不是传统意义上的外频了。它被称为基频(BF)。因此,它跟内存频率之间的同步关系也就改变了。例如,当“外频”(基频)133MHz时,甚至可以选用DDE3-1600内存了。是不过,也不是无限制的。限制到什么程度?这就看CPU或主板的规定了。不过,有个大概估算办法,就是内存的数据频率大致是QPI频率的1/2。具体是多少,要看内存控制器和主板支持到什么程度,不是用户能左右的。7
.内存的双通道的设臵问题
首先应该明确,双通道只是为了增大内存的带宽而设计的,因为,在DDR时代,CPU的FSB已经达到800MHz了,但是,从频率同步的角度看,只能配DDR-400的内存。显然,内存的带宽只是FSB带宽的1/2,内存成了带宽匹配的“瓶颈”,因为CPU有一半的时间要等内存把数据传过来。因此,人们提出了双通道的概念。即在北桥再增加一个内存控制器另外再增加一个DDR-400内存使两个DDR-400的内存并联使用,,,带宽的匹配问题得以解决。
但是,因为双通道中的两个内存是分别受两个内存控制器控制的,组成双通道后,只对内存的带宽有改善,对每个内存的性能指标(如核心频率)并没有任何改善。因此,用两个DDR-400组成双通道时,其性能并不是DDR-800。网上广泛流传的“用两个DDR2-533组成双通道,用在FSB=1066MHz平台,就是绝配”的说法是错误的。因为DDR2-533的核心频率是533MHz÷
4=166MHz,而FSB=1066MHz时的外频是1066MHz÷4=266MHz。两个频率并不相等。也就是说,这样配,并不能满足同步条件。硬要这样配电脑是要蓝屏的。因为内存组成双通道后,他们的核心频率并不会提高。
双通道的作用可以这样比喻:马路很宽,可以容得下两辆汽车,可是,只有一辆车来回跑,这不是浪费吗?再买一辆汽车吧,让它们在一条路上并行跑,货运量不就增加一倍了吗!由此可见,双通道只是解决货运量(带宽)的问题。并不是把汽车的速度加倍的问题。也就是说:两个DDR2-533组成双通道,只能提高带宽,并不能提高内存的频率,两个DDR2-533组成双通道后,其效果并不等于一个DDR2-1066。
当然,如果你一定把DDR2-533用于FSB=1066MHz的平台,也不是不可能,方法就是异步,使加给DDR2-533的频率降下来。但是,主板支持吗?如果是支持的,那么,需要异步运行才可以,这算是“绝配”吗?
8.在AMDCPUK8以前内存的配置方法
在K8以前,AMD内存也有前端总线(FSB),但是,跟Intel内存有一点点差别,就是前端总线频率是外频的两倍(Intel是4倍)。因为内存的同步与否是考虑外频的,所以,当外频跟内存的核心频率相等时就是同步。因此,外频是133MHz时,应该配DDR-266内存;外频是166MHz时,应该配DDR-333内存;外频是200MHz时,应该配DDR-400内存。这些都跟Intel平台是一致的。不同的是:在AMD平台,频率同步了的话,带宽也平衡了。所以,在当时的AMD平台就不存在双通道的问题。9.AMDCPUK8时代内存的选配方法
在AMD的K8以后的CPU中,内存控制器被整合到CPU内部了(见下图),内存直接跟CPU打交道了。前端总线不存在了,跟北桥相连的总线改称HT总线了,这个总线除了不再跟内存联系外,其它的作用跟原前端总线的任务是
相同的。
正是由于有了上述改变,所以,在AMD平台配内存时,内存跟CPU的搭配的计算方法也有了很大的变化。因为这时我们关心的只是CPU的主频。无需再考虑FSB和外频了。现在介绍内存跟AMD的CPU的搭配方法如下:①首先计算出内存控制器的分频倍数DIV(这种计算是由电脑自动进行的,当然我们也应该掌握):DIV=CPU的标称主频÷你在BIOS中设臵的内存的时钟频率(6)这个设臵的时钟频率最好跟你实际安装的内存一致。如果不一致,电脑还是根据你的设臵值进行计算的。如果DIV的计算结果不是整数,则进为整数,例如,将7.4进为8。如果计算出来的分频系数小于5,则取为5。上述这些方法都是AMD的设计规定。②知道了内存分频倍数DIV以后,通过内存的实际时钟频率用下式计算:内存的实际时钟频率=CPU的实际主频÷内存的分频倍数(7)知道了内存的时钟频率,就可以知道怎样配内存了。比如,你计算出来的时钟频率是是200MHz,而且是选择DDR内存,就应该配DDR-400;你计算出来的时钟频率是是400MHz,如果想配DDR2,则应该选DDR2-800;如果你计算出来的时钟频率是400MHz,想配DDR3内存,还是应该配DDR3-800。因为不管是什么型号的内存,数据频率总是时钟频率的两倍。例1:CPU是AMD速龙(Athlon)643200+,主频是2.0GHz,如果打算选用DDR-400的内存并在BIOS做这样的设臵时问①分频倍数是多少?②通,:过内存的实际频率是多少?解:①因为CPU的主频等于2000MHz;DDR-400的时钟频率等于400MHz/2=200MHz,所以,内存的分频倍数DIV=2000MHz÷200MHz=10;②因为没有对CPU进行超频,所以,它的主频还是2000MHz,所以,
通过内存的实际总线频率=2000MHz÷10=200MHz,即相当是DDR-400。因此,选择DDR-400内存是可以的。当然,如果主板允许,也可
以用两个DDR400组成双通道。以增大数据传输量。
例2:CPU是闪龙3200+,主频是1.8GHz,如果选用DDR2-800的内存时,问:①分频倍数数是多少?②通过内存的实际时钟频率是多少?(3)如果把主频超到2400MHz时,应该怎样选择内存?解:①分频系数DIV=1800MHz÷400MHz=4.5,应向上取为5;②通过内存的实际时钟频率=1800MHz÷5=360MHz。内存降格使用为DDR2-720。因为内存的频率是向下兼容的,主板都会支持这样的内存。所以,这样配臵也是可以的。(3)如果把主频超到2400MHz了,则通过内存的时钟频率就是2400MHz÷5=480MHz,即需要选择DDR2-960内存。选DDR2-1066吧。(但是,因为主频太低,还要看内存控制器或主板是否支持)下图就是我根据以上原则把计算结果表格化了,为了简化,在表中没有把分频系数列出来。表中有灰色底纹的数字表示计算出来的分频系数小5。因此,求这些时钟频率时,分频倍数是按分频系数等于5计算的。我相信,有这个表作参考,内存怎样跟CPU配合就是十分清楚的了。
现在,我们用上面的两个例题为例,研究一下怎么从下表中直接得出配内存的结果:(注:字体时大时小,不是作者的设臵,是日志编辑功能的毛病。刚改
版,还不完善。气煞人也!)
在第一个例题中的CPU频率是2GHz,在BIOS中设臵的内存是DDR-400,因此从这个表就可以查得通过内存的时钟频率是200MHz,即该内存运行在DDR-400。这样选频率正好匹配。第二个例题:CPU主频是1.8GHz,选得是DDR2-800内存,从表中可以查得内存的运行频率是360MHz,相当是DDR2-720内存。从表中还可以看出:如果你想使这个内存运行在DDR2-800,只有选2.0GHZ或以上的CPU。如果CPU的主频依旧是1.8GHz的话,即使你选用DDR2-1066也于事无补,它只会把内存降格为DDR2-720。有许多网友问:我安装的内存频率频率很高,但是,在CPU-Z中检测出来的频率又很低呢?主要原因是你安装的CPU的频率太低,主板并不支持频率过高的内存的缘故。表6AMD的CPU跟内存配合方法一览表
在本表中没有列出相应的分频系数,因而不利于超频时使用。其实,如果做超频操作时,只需把表中的数据乘以“超频后的CPU主频/超频前的CPU主频”就可以得到超频后加于内存的时钟频率了。从这个表我们就可以清楚地看出来应该怎样选择内存了。比如,当CPU的主频是1600MHz时配DDR-400就可以了当CPU的主频是2000MHz时配DDR2-800,;,是正合适的;当CPU的主频是3200MHz时,配DDR3-1066正合适。我猜想:主板的设计者就是按这个思路来设定主板默认的内存频率的。这个表是在K8的条件下根据CPU和内存的参数做出的,目前已经发展到K10(似乎没有K9),因此,情况稍有变化。还有一个重要因素也不容忽视,那就是除了主板支持外,内存控制器是否支持这个频率。如果控制器不支持,只有主板支持也是不行的。如此说来,上表仅是一个原则设定,如果你用CPU-Z进行检测时,其结果跟上表不符,就要从多方面找原因了。
10.AMDK10类CPU内存的匹配方法
AMD的K10类CPU内存匹配的方法和计算方法较之K8有了很大的变化。其计算顺序是:第一步:了解你选定的CPU支持什么样的内存。比如,可以是DDR2-800、DDR3-1333等;并且在BIOS的“DRAMFrequency”项中设臵这个内存。当然也可以设臵其他型号的内存。系统并不理会你插的是什么内存,而是根据你的设臵的内存进行计算的;第二步:根据在BIOS中设定的内存计算出分频系数内存的分频系数=在BIOS中设定的内存的数据频率÷外频(8)内存的数据频率值是多大,可以从内存的型号中知道。例如,DDR2-800的数据频率就是800MHz;DDR3-1333的数据频率就是1333MHz。依此类推。由式(8)可知,当在BIOS中设定的内存是DDR2-800时,800MHz÷200MHz=4,即分频系数=4;当在BIOS中设臵的外频是DDR3-1333时,1333MHz÷200MHz=6.67,即分频系数等于6.67。
第二步:根据下式计算出通过内存的实际数据频率内存中的实际数据频率=实际外频×分频系数(9)例1:在BIOS中把内存设定为DDR2-800时,如果把外频超到230MHz后,通过内存的数据频率是多少?答:因为DDR2-800的数据频率是800MHz,而AMD的CPU的标称外频是200MHz,因此,分频系数等于800MHz÷200MHz=4。根据式(9)可以计算出通过内存的数据频率是230MHz×4=920MHz。即相当是超到了DDR2-920。体质不好的DDR2-800内存是承受不了的。最好是安装DDR2-1066内存。下表就是在BIOS中设臵的内存的数据频率跟分频系数的计算结果。在表中给出的内存都是实有其型号的。但是,在主板的列表中,可能有DDR2-1111、DDR2-1200之类的设臵。本表没有列入它们,如果遇到有这样的设臵时,读者可自行计算。表7.AMDK10CPU的分频系数
注:表中的FSB:DRAM是检测软件CPU-Z的相应检测结果。
例2.使用的是AMD的K10CPU,在BIOS中设臵的内存是DDR3-1333,主板也支持,没有超频。请问:在内存中的数据频率是多少?答:由上表可以查出,在这种情况下,内存系数是6.67,因此,内存中的实际数据频率是200MHz×6.67=1333MHz。由这个例题可以看出来:如果不考虑超频时,实际外频和标称外频是相等的,都等于200MHz。因此,由式(8)可知:内存的实际数据频率就等于你在BIOS中设臵的内存的数据频率。所以,在K10中如何选配内存的问题就变得十分简单了。简单到可以这样说:当给AMD的K10类CPU配内存时,你在BIOS中设臵什么样的内存,在内存中的频率就是你设臵的频率。但是,大前题是CPU的内存控制器和主板支持。你把CPU支持内存条插入后,系统怎样运行这个内存,你不必管它,只管让它“Aout”或“BySPD”。但是,如果你想对它进行手工设臵,可以把BIOS的“MemoryClockMode”项设臵为“Manual”(手动模式),然后用上述方法进行设臵即可。
11.内存选配方法实例问答
问1:在Intel平台,如果外频是200MHz,假如我选择DDR内存,应该是什么型号的?如果选DDR2内存,应该选什么型号的?
答根据内存核心频率等于或不小于外频的原则选DDR时应该选DDR-400;:,,选DDR2时,应该选DDR2-800。问2:在Intel平台的FSB=800MHz时,如果安装DDR2-1066内存,将会是什么情况?答:因为系统向内存提供的时钟频率最大仅为400MHz,而DDR2-1066需要533MHz。因此,系统将会把DDR2-1066当作是体质好的DDR2-800对待。问3:在Intel平台的FSB=1066MHz时,如果安装DDR2-800内存,将会是什么情况?答:因为系统向内存提供的时钟频率最大为533MHz,而DDR2-800所能耐受的时钟频率是400MHz。因此,内存需异步运行,即把加给内存的时钟频率降下来。这项降频工作就是我们所说的异步。异步是由主板自动进行的。当然也可以由人工操作。问4:我的CPU是AMD的K8,主频是2600MHz。主板也支持DDR2-800,可是,我安装上去以后,CPU-Z的检测结果是:频率只有371.4MHz。这为什么?答:让我们计算一下:2600MHz/400MHz=6.5,进为7。2600MHz/7=371.4MHz,相当DDR2-743。所以,你说的情况是正常的。在AMD平台,内存的实际频率是经常被压低的。问5:我的CPU是AMD的k8,主频是2200MHz,安装的是DDR2-667。为什么在CPU-Z上面看到的DRAM(内存时钟频率)是314左右?而不是667/2=333?答:让我们计算一下:因为你设臵的是DDR2-667内存,所以有2200MHz/333MHz=6.6,应取为7。2200MHz/7=314MHz。由此可知,你的电脑是正常的。在AMD平台,不是你设臵了什么频率,通过内存频率就是你设臵的频率的。问6:在AMD平台,用CPU-Z检测时,“前端总线:内存”是“CPU/9”是什么意思?答:在AMD平台用CPU-Z检测电脑的频率时,如在“前端总线:DRAM频率”项表示为“CPU/9”,其中的”CPU”表示你的CPU的主频,“9”表示的是分频系数。如果你的CPU的主频是1.8GHz,那么,1800MHz/9=200MHz。这就是说,你的内存的时钟频率是200MHz。问7:当用CPU-Z检测电脑时,在“前端总线:内存”项出现“3:8”是什么意思?答因为AMD的CPU其外频都是200MHz因此有“3:8=200:X”由此得X=200:,,×8÷3=533,即你在电脑中的内存的时钟频率为533MHz。所以,这个内存可能是DDR2-1066也可能是DDR3-1066。问8:我的AMD的CPU主频为3000MHz,我选用DDR3-1333内存。可是,用CPU-Z检测时,“FSB:DRAM=3:8”。这是什么意思?答:在AMD平台,其比是“3:8”,就是说其时针频率是533MHz,相当DDR3-1066。你的DDR3-1333是被降格使用了。为什么要降格?这就要看主板的设臵了,也可能主板的默认设臵就是DDR3-1066,也可能CPU的内存控制器最大支持到1066MHz。如果不是内存控制器不支持,只要是主板支持,你把它的频率设臵成667MHz也是可以的。问9:我用的是AMDK8的CPU,主频是2800MHz。应该选什么样的内存?答:从表6可以看出,在你的这种情况下,选择DDR2-800就可以了。选DDR2-1066似乎高了一些。因为你的CPU主频比较低,选择DDR3不一定合适。但是,还要看主板和内存控制器是否支持。
问10.我的AMD8650CPU匹配的是DDR2-800内存条。我把外频超到240MHz后,为什么CPU-Z显示的内存频率是480MHz?答:分频系数是800MHz/200MHz=4。所以,你的内存的数据频率是240MHzX4=960MHz,即相当是DDR2-960。它的时针频率恰好是960MHz/2=480MHz。所以,CPU-Z的显示是完全正确的。当为AMD的CPU选配内存时,一定要搞清楚这个CPU是K8、K10?或是K8以前的。因为三种类型的CPU有不同的匹配内存的方法。问11:HT的频率跟内存的频率有什么关系?答:因为AMD的内存控制器在CPU内部,直接受CPU控制。内存总线跟HT总线虽然都源于CPU,但是,各走各的路;各有各的任务(见本文的附图),彼此没有什么关系。因此,当选配内存时,不必考虑HT总线的频率。但是,当采用需要共享内存作为显存的集成显卡时,二者是有一些关联的。但是,当考虑匹配内存时,无需考虑这些。问12:为AMD平台配内存时,还需要考虑内存的带宽跟CPU带宽的匹配吗?答:因为在AMD平台,内存直接跟CPU打交道了,CPU的带宽就是内存的带宽。因此,当选配内存时,CPU的带宽跟内存的带宽匹配问题可以不再单独考虑。按本文所介绍的方法选配内存就可以了。但是,在K8时代,如果是DDR2-800的内存,CPU的主频必须提高到2.8Ghz时,才能把它当DDR2-800使用,实际上这也是带宽的匹配问题。问13:什么是MCT?什么是DCT?
答:MCT(MemoryController)是内存控制器,它控制内存的读取等操作,决定了K8/K10的内存性能。它的控制功能适用于任何类型的内存。而DCT(DRAMController)是“内存界面控制器”,也称DRAM控制器。它决定了可以使用的内存类型。它可以升级换代,以适应不同类型的内存。也就是说,内存控制器支持什么类型的内存是由它决定的。问14:在支持AMDK10主板的BIOS中的DCTsMode是什么意思?答:DCTsMode(DRAM控制器模式)是指K10中所安装的两个独立的64bit单元内存控制器的两种运行模式。有GangedMode和UngangedMode。后者是默认模式。前一种模式就跟K8双通道模式相同,两通道的内存会逻辑上连为一体,构成128bit,这个模式称为「GangedMode」。如果两个控制器同时启动,总合起来每个时脉周期一样有128bit的资料传输。这不是双通道,也不是单通道,而是两个单通道同时运行,称为「UngangedMode」模式。这种模式的好处是对两个内存的一致性要求不高。
答hmhding网友:因为下述文字“超过”1000字了。加不上。所以放到这里来回答你:
第一个问题调控的目的和效果就是让加于内存的频率不过载即当外频为200MHz时用DDR2-667:。,时,加给内存的频率是166MHz而不是200MHz。当然也就不存在蓝屏的问题了。第二个问题:当外频是200MHz时,用两个DDR400组成双通道,就是为解决带宽的瓶颈的。其实,用一个DDR400也可以。第三个问题:你的外频是100MHz,FSB:DRAM=3:4。由此可以推算出你采用的DDR400已经降频到DDR266使用了。至于为什么不是降到DDR200,我也说不清。是不是主板不支持?请看看你的主板说明书把。谢谢。
对你第二次来信的回复(就这么几个字,人家总说超过1000字了,贴不上):从你这段话就完全清楚了为什么内存频率只降级到DDR266,而不是降级到DDR200的原因了。因为“host/dramclockratio选项”的含义实际上是内存的数据频率/外频。主板默认它为2.66,所以,内存的数据频率就等于100MHz×2.66=266MHz。这个判断是我根据GA-81的说明书作出来的,你也可以仔细看看你的说明书。
在正式讨论问题之前,我们首先要把内存的核心频率、时钟频率和数据频率之间的关系搞清楚,而且应该特别熟悉。这是讨论这个问题的基础。见下表:表1内存名称及各种频率列表
由表1可见,核心频率、时钟频率和数据频率之间有固定的关系。它们之间的比例关系见表2。表2.内存的核心频率、时钟频率和数据频率之间的比例关系
其中的核心频率又称颗粒频率或基本频率;时钟频率又称工作频率、内存频率、I/O频率、DRAM、DRAMFrequency、时脉或内存速度;数据频率又称等效频率或传输通道频率。本文只采用“核心频率”、“时钟频率”和“数据频率”三个名称。对这些名称一定要弄清楚。另外,有关CPU的名称也是五花八门的。例如,主频又称CoreSpeed;外频的名称就更多了,如BusSpeed、汇流排频率、FSB(和前端总线混用)等。
2.内存和CPU搭配的基本原则
我认为:无论你采用的CPU是Intel的,还是AMD的,当选配内存时都必须遵守三条基本原则。第一条是频率要同步:即内存的核心频率要等于或稍大于CPU的外频。不要给内存加上它不能承受的高频率,否则是频率“过载”。频率“过载”后,内存将拒绝工作。这样,电脑是要蓝屏的。当然,你给它加上低于核心频率的频率时,它会是胜任愉快的。第二条是带宽要匹配:应该设法使内存的数据带宽跟CPU前端总线的带宽相等,否则,数据的传输能力将受制于带宽较低的那端;第三条是主板要调控:因为以上两个条件有时是不可能同时能满足的。这就要靠主板来调控,调控的主要方法是异步设臵。因为第一条是有关生或死的问题,所以,这一条必须满足。第二条就可以灵活处理了。另外,当讨论内存跟CPU如何搭配时,必须明确以下事项:①内存的核心频率小于外频时,内存会拒绝工作。表现是蓝屏。但是,在任何情况下,内存的核心频率大于CPU的外频时,内存都能正常
工作。但是,系统也不会承认它的高频率。只承认它的核心频率等于外频。例如,你将DDR2-1066插入外频是200MHz的板子上时,系统将认为这个内存是DDR2-800。②Intel处理器的前端总线频率(FSB)是外频频率的4倍。但是,在历史上前端总线的频率和外频是同一个,所以,人们还是经常用FSB来表示外频(例如软件CPU-Z就是这样,它表示的“FSB:DRAM”实际上是指“CPU的外频:内存的时钟频率”)。AMD的内存,在K8以前,也有前端总线,不过,那时的前端总线频率是外频频率的两倍。K8以后AMD的CPU就没有前端总线了。③当讨论内存跟Intel平台的CPU的匹配时,必须知道CPU的外频或前端总线频率。知道一个就行,因为它们之间是四倍关系,此时,不必关心CPU的主频是多少。不过,自从有了Intel的i3/i5/i7后,参照的CPU频率已经不是外频和前端总线FSB,而是基本频率BF了。但是,在检测软件CPU-Z中,还是把BF频率称为外频的。在这种情况下,怎样配内存,请参看本文之6。④当讨论内存跟AMD平台的CPU匹配时,首先必须明确这个CPU是K8的?K10的?还是K8以前的?因为这三种CPU陪内存的方法是截然不同的。讨论K8以前的CPU时,只需知道外频或FSB;讨论给K8的CPU配内存时,只需知道CPU的主频,不要提HT总线,因为配内存跟HT总线无关;同样的原因,当为K10配内存时,如果你不超频,只需知道CPU
或主板支持什么内存就可以了。因为K10架构的CPU配内存时是跟外频挂钩的,而AMDCPU的外频是固定在200MHz的。⑤当讨论内存跟CPU的搭配关系时,是根据内存和CPU的参数计算的,不必考虑主板。但是,当你对搭配方案作出选择后,还必须考虑主板是否支持。在一般情况下,主板的频率是应该高于FSB的频率的。⑥内存的异步就是使加给内存的频率是它能正常工作的频率。一般是指降频。但是,频率降下来的后果就是速度变慢和带宽变窄。所有主板都支持内存异步运行的。但是,支持的程度不同。⑦从内存跟CPU是否搭配的角度看,配内存时,不必考虑内存的容量是多少。但是,容量超过一定大小时,有时是要考虑主板是否支持的。⑧内存跟CPU是否匹配,跟CPU是几个核没有什么关系。以上就是我认为内存匹配的三大原则和八项注意。
3.在Intel平台实现频率同步的方法
在Intel平台,内存频率跟CPU同步的条件就是:内存的核心频率必须等于或稍大于CPU的外频。否则,就是“频率过载”,内存将停止工作,主要的表现形式是蓝屏。虽然对我这个说法经常听到不同的声音。但是,我坚信我的这个归纳方法是完全能站得住脚的。因为内存能够耐受多大的频率,完全是由核心频率决定的。时钟频率和数据频率都是在核心频率的基础上,通过技术手段放大出来的。当核心频率相等时,不同类型的内存会有不同的时钟频率和数据频率。
例如,在Intel平台,当外频是200MHz时,为了实现频率同步,应该选DDR-400、DDR2-800或DDR3-1600。因为这几种内存的核心频率都是200MHz。这是十分重要的一条规律。但是,过去,人们都是把内存的同步条件说成“内存的时钟频率(而不是说“内存的核心频率”)等于或稍大于外频频率就是同步”。更多的是模棱两可的说法,比如说“内存的频率等于或稍大于外频,就是同步”。至今在网上的许多文章还是这样说的。相当混乱。我认为,在SD和DDR时代,说“时钟频率和核心频率相等就是同步”,是完全正确的。但是,在DDR2和DDR3出现以后,再这样说就是完全错误的,因为不同类型的内存。其核心频率跟时钟频率是不同的。因此,两种判别方法存在巨大差异。不过,囿于习惯,人们还是愿意用时钟频率来跟CPU的外频对比。我认为,按时钟频率跟CPU频率对比的方法来判断内存是否同步也不是不可以的。但是,必须把这个比作适当改动。比如说:“对于SDRAM和DDR,当内存的时钟频率跟CPU的外频相等时,就是内存同步。例如,当外频是200MHz时,应该配DDR-400的内存”;对于DDR2,就应该说:“当内存的时钟频率是外频的两倍时,就是内存同步。例如,当外频是200MHz时,应该配DDR2-800内存”;对于DDR3,就应该说:“当内存的时钟频率是外频的4倍时,就是内存同步。例如当外频是200MHz时,就应该配DDR3-1600内存”。这样说不是太啰嗦了吗!
可是,在检测软件CPU-Z中,就是用CPU的外频(此处称其为FSB)跟时钟频率(此处称为DRAM)的比值关系表示内存是否同步的的。其关系见下表:表3内存同步时,CPU的外频跟内存的时钟频率的频率关系
内存的类型FSB:DRAM(即CPU的外频跟内存时钟频率之比)DDR1:1DDR21:2DDR31:4
注:在检测软件CPU-Z中,就是用“FSB”表示CPU的外频的,这是历史形成的误用。上表中的“DRAM”是指时钟频率。
知道了以上原则,我们应该选什么样的内存跟CPU来匹配的问题也就迎刃而解了。我认为:对Intel的CPU在i3/i5/i7架构出现以前,只要能知道外频或前端总线频率(FSB=4倍外频)中的一个参数,就可以选择合适的内存了。不同型号的内存有不同的计算方法。具体计算方法是:
①当在Intel平台选择DDR内存时有:
DDR-×××后的三个“×”=FSB值÷2(1)例如,当Intel平台的FSB是533MHz时,如果选择DDR内存时,×××=533÷2=266,所以,应该选DDR-266型的内存。这样选也符合“内存的核心频率(133MHz)等于CPU外频(133MHz)”的原则。②当在Intel平台选择DDR2内存时有:DDR2-×××后的三个“×”=FSB值(2)
例如,当Intel平台的FSB是800MHz时,如果选择DDR2内存时,×××=FSB值=800,所以,应该选DDR2-800型的内存。这样选也符合“内存的核心频率(200MHz)等于CPU外频(200MHz)”的原则。
③当在Intel平台选择DDR3内存时有:DDR3-××××后的四个“×”=FSB值×2(3)
例如,当Intel平台的FSB是800MHz时,如果选择DDR3内存,就应该选四个“×”等于800×2=1600的内存,即应该选DDR3-1600型的
内存。这样选也符合“内存的核心频率(200MHz)等于CPU外频(200MHz)”的原则。下表就是我根据上述原则计算出来的、根据CPU的参数来选择内存的计算结果。这是根据频率同步的条件计算出来的最高频率。都存在向较低频率异步的空间。(i3/i5/i7架构的CPU如何选内存,见本文的6)表4.内存同步时外频频率跟内存型号的关系
注①:表中的“频率比”是指同步的情况下,外频跟时钟频率的比,即在CPU-Z中的“FSB:DRAM”值。如果CPU-Z显示的不是这个值,那就是内存频率异步了。
根据CPU-Z中的“FSB:DRAM”比还可以很容易反求出来在电脑中安装的,(或设臵的)是什么型号的内存。例如,当你的CPU的外频是200MHz、而且安装的内存是DDR2时,如果CPU-Z的显示是“FSB:DRAM=1:1.66”的话,那就肯定你安装的内存不是在同步状态。因为DDR2内存同步时,其比是1:2。那么安装的是什么内存呢?可以有下述方法计算出来:因为200:X=1:1.66,所以,X=333。这个333就是实装内存的时钟频率值333MHz,由此可以断定,这个内存是DDR2-667。
注②:DDR、DDR2和DDR3内存的针脚和插座都是不相同的,不能用错。所以,当选择主板时,要搞清楚主板支持哪类内存。目前,为了用户方便,有的主板同时具有DDR2和DDR3内存插槽。
4.在Intel平台实现带宽相等的计算方法
什么是带宽呢?在计算机领域,带宽又叫频宽,是指在固定的时间内可以传输的数据量,亦即在传输通道中可以传递数据的能力。带宽通常以比特每秒(bps)表示,即每秒可传输的位数。但是,为了简化,通常都是以MB/s或GB/s表示的。带宽的计算方法是:带宽=频率×总线位数/8(4)
因为电脑内存总线的传输位数是64比特所以对于频率是800MHz,,的通道来说,带宽=800MHz×64b÷8b/B=6.4GB/s。还有一个简捷计算方法,就是带宽=频率数×8B(5)
例如,当频率等于800MHz时,带宽就是800MHz×8B=6400MB/s=6.4GB/s。在表1中已经给出了不同频率和带宽关系的计算结果。这里说的带宽匹配,实际上就是频率的匹配。对于我们普通使用者,还是按频率来论述比较直观,因为带宽相等,就是频率相等。带宽匹配的原则是:内存的数据带宽应该跟CPU前端总线FSB的带宽相等,或者说:“内存的数据频率等于CPU的FSB频率,就是带宽匹配”。只有这样才能保证数据的顺利传输。如果有一方的带宽小于另一方,小带宽的一方就构成了“瓶颈”。但是,如果CPU已经选定了,内存的带宽大一些,并没有坏处。
在满足同步的条件下,对DDR2来说,就会自动满足带宽相等的要求,即可以做到内存的传输带宽等于前端总线的带宽;但是,对DDR来说如果满足了同步的要求内存的带宽仅是FSB带宽的1/2对于DDR3,,;来说,如果满足了同步的要求,内存的带宽就是FSB带宽的两倍。这种关系见下表。表5内存同步时,FSB的带宽跟内存数据通道的带宽的关系内存的类型DDRDDR2DDR3
1:2
FSB的带宽:内存数据通道的带宽2:11:1
对内存的同步要求是生或死的问题,所以,必须满足,如果不能满足,必须采取异步运行。但是,对于带宽的要求则比较灵活一些。如果不能满足,也可以用双通道或异步的方法来解决。在DDR时代就是利用双通道的方法解决内存带宽是“瓶颈”的问题的。但是,如果不组成双通道,只用一个内存条,只要频率是同步的,也可以正常工作。在AMD平台,其内存控制器臵入CPU内部了。即CPU直接跟内存打交道了。带宽的问题,已经没有那么重要了。
5.在Intel平台用主板调控内存运行参数的方法
①主板的自动调控作用:其实,根据内存的同步要求选择出来的内存(见表4)就可以正常使用了。但是,也有例外的情况。比如:有的时候,按计算结果,应该用DDR2-800内存才能同步,但是,你手头没有DDR2-800,只有DDR2-667内存,并安装上去了。怎么办呢?要靠主板的调控。只要你没有在BIOS中的“MemClockMode”中选“Manual”,也没有在“SystemMemoryMultiplier”项更改默认设臵“Auto”,主板就会自动根据内存条上SPD资料把加于内存的时钟频率降到
333MHz,以使DDR2-667内存的频率不过载。这时CPU-Z的“FSB:DRAM”就是“1:1.66”,而不是“1:2”。这样调整过后,速度降低了,内存的带宽也变小了一些,但是,可以正常运行。还有,如果满足内存同步需要的内存是DDR2-800,而你却安装或设臵了DDR2-1066内存,主板也会把加给内存的频率按DDR2-800对待,CPU-Z对“FSB:DRAM”的显示还是“1:2”,不会显示“1:2.66”但。是,如果你是把内存超频到1066MHz的,CPU-Z则会显示“1:2.66”。②主板的手动调控方法:如果你要自己用手动设臵内存也是可以的。方法是:在BIOS的“SetMemoryClock”项选“Manual”(手动);或在“SystemMemoryMultiplier”项不选择“Auto”,而是选择你实际安装在内存插槽上的内存,设臵就会成功的。当然,还是需要主板支持的,也就是说,如果主板上有种这种设臵项目才行。手动设臵的选项有多种方法。有的直接用内存芯片名称表示(如华硕的P5E3WS主板,直接用诸如DDR3-1333表示);有的用数字表示(如技嘉GA-P31-S3G主板就用3.33或4.0表示。3.33就表示DDR2-667内存);当然,有的主板则是用FSB:DRAM的比值表示。6.在Intel平台没有FSB了,怎么配内存?Intel酷睿i3/i5/i7CPU是把内存控制器置于CPU内部了。内存控制器控制的QPI(QuickPathInterconnect,快速通道互联)总线频率远高于传统的FSB(一般是外频的18倍),因此,为它选配内存的空间范围也大多了。例如,在过去,当外频是133MHz时,FSB=4×133mHz=533MHz,这种关系是固定的。如果选DDR内存,最高是DDR-266;
如果选DDR2内存,最高是DDR2-533;如果DDR3内存,最高是DDR3-1066。如果你选择更高频率的内存,系统是不承认的,它只能把它们作降格处理。实际上FSB成了“瓶颈”。自从有了QPI总线以后,选择内存的条件就宽松多了。这时CPU-Z上显示的“外频”133MHz,已经不是传统意义上的外频了。它被称为基频(BF)。因此,它跟内存频率之间的同步关系也就改变了。例如,当“外频”(基频)133MHz时,甚至可以选用DDE3-1600内存了。是不过,也不是无限制的。限制到什么程度?这就看CPU或主板的规定了。不过,有个大概估算办法,就是内存的数据频率大致是QPI频率的1/2。具体是多少,要看内存控制器和主板支持到什么程度,不是用户能左右的。7
.内存的双通道的设臵问题
首先应该明确,双通道只是为了增大内存的带宽而设计的,因为,在DDR时代,CPU的FSB已经达到800MHz了,但是,从频率同步的角度看,只能配DDR-400的内存。显然,内存的带宽只是FSB带宽的1/2,内存成了带宽匹配的“瓶颈”,因为CPU有一半的时间要等内存把数据传过来。因此,人们提出了双通道的概念。即在北桥再增加一个内存控制器另外再增加一个DDR-400内存使两个DDR-400的内存并联使用,,,带宽的匹配问题得以解决。
但是,因为双通道中的两个内存是分别受两个内存控制器控制的,组成双通道后,只对内存的带宽有改善,对每个内存的性能指标(如核心频率)并没有任何改善。因此,用两个DDR-400组成双通道时,其性能并不是DDR-800。网上广泛流传的“用两个DDR2-533组成双通道,用在FSB=1066MHz平台,就是绝配”的说法是错误的。因为DDR2-533的核心频率是533MHz÷
4=166MHz,而FSB=1066MHz时的外频是1066MHz÷4=266MHz。两个频率并不相等。也就是说,这样配,并不能满足同步条件。硬要这样配电脑是要蓝屏的。因为内存组成双通道后,他们的核心频率并不会提高。
双通道的作用可以这样比喻:马路很宽,可以容得下两辆汽车,可是,只有一辆车来回跑,这不是浪费吗?再买一辆汽车吧,让它们在一条路上并行跑,货运量不就增加一倍了吗!由此可见,双通道只是解决货运量(带宽)的问题。并不是把汽车的速度加倍的问题。也就是说:两个DDR2-533组成双通道,只能提高带宽,并不能提高内存的频率,两个DDR2-533组成双通道后,其效果并不等于一个DDR2-1066。
当然,如果你一定把DDR2-533用于FSB=1066MHz的平台,也不是不可能,方法就是异步,使加给DDR2-533的频率降下来。但是,主板支持吗?如果是支持的,那么,需要异步运行才可以,这算是“绝配”吗?
8.在AMDCPUK8以前内存的配置方法
在K8以前,AMD内存也有前端总线(FSB),但是,跟Intel内存有一点点差别,就是前端总线频率是外频的两倍(Intel是4倍)。因为内存的同步与否是考虑外频的,所以,当外频跟内存的核心频率相等时就是同步。因此,外频是133MHz时,应该配DDR-266内存;外频是166MHz时,应该配DDR-333内存;外频是200MHz时,应该配DDR-400内存。这些都跟Intel平台是一致的。不同的是:在AMD平台,频率同步了的话,带宽也平衡了。所以,在当时的AMD平台就不存在双通道的问题。9.AMDCPUK8时代内存的选配方法
在AMD的K8以后的CPU中,内存控制器被整合到CPU内部了(见下图),内存直接跟CPU打交道了。前端总线不存在了,跟北桥相连的总线改称HT总线了,这个总线除了不再跟内存联系外,其它的作用跟原前端总线的任务是
相同的。
正是由于有了上述改变,所以,在AMD平台配内存时,内存跟CPU的搭配的计算方法也有了很大的变化。因为这时我们关心的只是CPU的主频。无需再考虑FSB和外频了。现在介绍内存跟AMD的CPU的搭配方法如下:①首先计算出内存控制器的分频倍数DIV(这种计算是由电脑自动进行的,当然我们也应该掌握):DIV=CPU的标称主频÷你在BIOS中设臵的内存的时钟频率(6)这个设臵的时钟频率最好跟你实际安装的内存一致。如果不一致,电脑还是根据你的设臵值进行计算的。如果DIV的计算结果不是整数,则进为整数,例如,将7.4进为8。如果计算出来的分频系数小于5,则取为5。上述这些方法都是AMD的设计规定。②知道了内存分频倍数DIV以后,通过内存的实际时钟频率用下式计算:内存的实际时钟频率=CPU的实际主频÷内存的分频倍数(7)知道了内存的时钟频率,就可以知道怎样配内存了。比如,你计算出来的时钟频率是是200MHz,而且是选择DDR内存,就应该配DDR-400;你计算出来的时钟频率是是400MHz,如果想配DDR2,则应该选DDR2-800;如果你计算出来的时钟频率是400MHz,想配DDR3内存,还是应该配DDR3-800。因为不管是什么型号的内存,数据频率总是时钟频率的两倍。例1:CPU是AMD速龙(Athlon)643200+,主频是2.0GHz,如果打算选用DDR-400的内存并在BIOS做这样的设臵时问①分频倍数是多少?②通,:过内存的实际频率是多少?解:①因为CPU的主频等于2000MHz;DDR-400的时钟频率等于400MHz/2=200MHz,所以,内存的分频倍数DIV=2000MHz÷200MHz=10;②因为没有对CPU进行超频,所以,它的主频还是2000MHz,所以,
通过内存的实际总线频率=2000MHz÷10=200MHz,即相当是DDR-400。因此,选择DDR-400内存是可以的。当然,如果主板允许,也可
以用两个DDR400组成双通道。以增大数据传输量。
例2:CPU是闪龙3200+,主频是1.8GHz,如果选用DDR2-800的内存时,问:①分频倍数数是多少?②通过内存的实际时钟频率是多少?(3)如果把主频超到2400MHz时,应该怎样选择内存?解:①分频系数DIV=1800MHz÷400MHz=4.5,应向上取为5;②通过内存的实际时钟频率=1800MHz÷5=360MHz。内存降格使用为DDR2-720。因为内存的频率是向下兼容的,主板都会支持这样的内存。所以,这样配臵也是可以的。(3)如果把主频超到2400MHz了,则通过内存的时钟频率就是2400MHz÷5=480MHz,即需要选择DDR2-960内存。选DDR2-1066吧。(但是,因为主频太低,还要看内存控制器或主板是否支持)下图就是我根据以上原则把计算结果表格化了,为了简化,在表中没有把分频系数列出来。表中有灰色底纹的数字表示计算出来的分频系数小5。因此,求这些时钟频率时,分频倍数是按分频系数等于5计算的。我相信,有这个表作参考,内存怎样跟CPU配合就是十分清楚的了。
现在,我们用上面的两个例题为例,研究一下怎么从下表中直接得出配内存的结果:(注:字体时大时小,不是作者的设臵,是日志编辑功能的毛病。刚改
版,还不完善。气煞人也!)
在第一个例题中的CPU频率是2GHz,在BIOS中设臵的内存是DDR-400,因此从这个表就可以查得通过内存的时钟频率是200MHz,即该内存运行在DDR-400。这样选频率正好匹配。第二个例题:CPU主频是1.8GHz,选得是DDR2-800内存,从表中可以查得内存的运行频率是360MHz,相当是DDR2-720内存。从表中还可以看出:如果你想使这个内存运行在DDR2-800,只有选2.0GHZ或以上的CPU。如果CPU的主频依旧是1.8GHz的话,即使你选用DDR2-1066也于事无补,它只会把内存降格为DDR2-720。有许多网友问:我安装的内存频率频率很高,但是,在CPU-Z中检测出来的频率又很低呢?主要原因是你安装的CPU的频率太低,主板并不支持频率过高的内存的缘故。表6AMD的CPU跟内存配合方法一览表
在本表中没有列出相应的分频系数,因而不利于超频时使用。其实,如果做超频操作时,只需把表中的数据乘以“超频后的CPU主频/超频前的CPU主频”就可以得到超频后加于内存的时钟频率了。从这个表我们就可以清楚地看出来应该怎样选择内存了。比如,当CPU的主频是1600MHz时配DDR-400就可以了当CPU的主频是2000MHz时配DDR2-800,;,是正合适的;当CPU的主频是3200MHz时,配DDR3-1066正合适。我猜想:主板的设计者就是按这个思路来设定主板默认的内存频率的。这个表是在K8的条件下根据CPU和内存的参数做出的,目前已经发展到K10(似乎没有K9),因此,情况稍有变化。还有一个重要因素也不容忽视,那就是除了主板支持外,内存控制器是否支持这个频率。如果控制器不支持,只有主板支持也是不行的。如此说来,上表仅是一个原则设定,如果你用CPU-Z进行检测时,其结果跟上表不符,就要从多方面找原因了。
10.AMDK10类CPU内存的匹配方法
AMD的K10类CPU内存匹配的方法和计算方法较之K8有了很大的变化。其计算顺序是:第一步:了解你选定的CPU支持什么样的内存。比如,可以是DDR2-800、DDR3-1333等;并且在BIOS的“DRAMFrequency”项中设臵这个内存。当然也可以设臵其他型号的内存。系统并不理会你插的是什么内存,而是根据你的设臵的内存进行计算的;第二步:根据在BIOS中设定的内存计算出分频系数内存的分频系数=在BIOS中设定的内存的数据频率÷外频(8)内存的数据频率值是多大,可以从内存的型号中知道。例如,DDR2-800的数据频率就是800MHz;DDR3-1333的数据频率就是1333MHz。依此类推。由式(8)可知,当在BIOS中设定的内存是DDR2-800时,800MHz÷200MHz=4,即分频系数=4;当在BIOS中设臵的外频是DDR3-1333时,1333MHz÷200MHz=6.67,即分频系数等于6.67。
第二步:根据下式计算出通过内存的实际数据频率内存中的实际数据频率=实际外频×分频系数(9)例1:在BIOS中把内存设定为DDR2-800时,如果把外频超到230MHz后,通过内存的数据频率是多少?答:因为DDR2-800的数据频率是800MHz,而AMD的CPU的标称外频是200MHz,因此,分频系数等于800MHz÷200MHz=4。根据式(9)可以计算出通过内存的数据频率是230MHz×4=920MHz。即相当是超到了DDR2-920。体质不好的DDR2-800内存是承受不了的。最好是安装DDR2-1066内存。下表就是在BIOS中设臵的内存的数据频率跟分频系数的计算结果。在表中给出的内存都是实有其型号的。但是,在主板的列表中,可能有DDR2-1111、DDR2-1200之类的设臵。本表没有列入它们,如果遇到有这样的设臵时,读者可自行计算。表7.AMDK10CPU的分频系数
注:表中的FSB:DRAM是检测软件CPU-Z的相应检测结果。
例2.使用的是AMD的K10CPU,在BIOS中设臵的内存是DDR3-1333,主板也支持,没有超频。请问:在内存中的数据频率是多少?答:由上表可以查出,在这种情况下,内存系数是6.67,因此,内存中的实际数据频率是200MHz×6.67=1333MHz。由这个例题可以看出来:如果不考虑超频时,实际外频和标称外频是相等的,都等于200MHz。因此,由式(8)可知:内存的实际数据频率就等于你在BIOS中设臵的内存的数据频率。所以,在K10中如何选配内存的问题就变得十分简单了。简单到可以这样说:当给AMD的K10类CPU配内存时,你在BIOS中设臵什么样的内存,在内存中的频率就是你设臵的频率。但是,大前题是CPU的内存控制器和主板支持。你把CPU支持内存条插入后,系统怎样运行这个内存,你不必管它,只管让它“Aout”或“BySPD”。但是,如果你想对它进行手工设臵,可以把BIOS的“MemoryClockMode”项设臵为“Manual”(手动模式),然后用上述方法进行设臵即可。
11.内存选配方法实例问答
问1:在Intel平台,如果外频是200MHz,假如我选择DDR内存,应该是什么型号的?如果选DDR2内存,应该选什么型号的?
答根据内存核心频率等于或不小于外频的原则选DDR时应该选DDR-400;:,,选DDR2时,应该选DDR2-800。问2:在Intel平台的FSB=800MHz时,如果安装DDR2-1066内存,将会是什么情况?答:因为系统向内存提供的时钟频率最大仅为400MHz,而DDR2-1066需要533MHz。因此,系统将会把DDR2-1066当作是体质好的DDR2-800对待。问3:在Intel平台的FSB=1066MHz时,如果安装DDR2-800内存,将会是什么情况?答:因为系统向内存提供的时钟频率最大为533MHz,而DDR2-800所能耐受的时钟频率是400MHz。因此,内存需异步运行,即把加给内存的时钟频率降下来。这项降频工作就是我们所说的异步。异步是由主板自动进行的。当然也可以由人工操作。问4:我的CPU是AMD的K8,主频是2600MHz。主板也支持DDR2-800,可是,我安装上去以后,CPU-Z的检测结果是:频率只有371.4MHz。这为什么?答:让我们计算一下:2600MHz/400MHz=6.5,进为7。2600MHz/7=371.4MHz,相当DDR2-743。所以,你说的情况是正常的。在AMD平台,内存的实际频率是经常被压低的。问5:我的CPU是AMD的k8,主频是2200MHz,安装的是DDR2-667。为什么在CPU-Z上面看到的DRAM(内存时钟频率)是314左右?而不是667/2=333?答:让我们计算一下:因为你设臵的是DDR2-667内存,所以有2200MHz/333MHz=6.6,应取为7。2200MHz/7=314MHz。由此可知,你的电脑是正常的。在AMD平台,不是你设臵了什么频率,通过内存频率就是你设臵的频率的。问6:在AMD平台,用CPU-Z检测时,“前端总线:内存”是“CPU/9”是什么意思?答:在AMD平台用CPU-Z检测电脑的频率时,如在“前端总线:DRAM频率”项表示为“CPU/9”,其中的”CPU”表示你的CPU的主频,“9”表示的是分频系数。如果你的CPU的主频是1.8GHz,那么,1800MHz/9=200MHz。这就是说,你的内存的时钟频率是200MHz。问7:当用CPU-Z检测电脑时,在“前端总线:内存”项出现“3:8”是什么意思?答因为AMD的CPU其外频都是200MHz因此有“3:8=200:X”由此得X=200:,,×8÷3=533,即你在电脑中的内存的时钟频率为533MHz。所以,这个内存可能是DDR2-1066也可能是DDR3-1066。问8:我的AMD的CPU主频为3000MHz,我选用DDR3-1333内存。可是,用CPU-Z检测时,“FSB:DRAM=3:8”。这是什么意思?答:在AMD平台,其比是“3:8”,就是说其时针频率是533MHz,相当DDR3-1066。你的DDR3-1333是被降格使用了。为什么要降格?这就要看主板的设臵了,也可能主板的默认设臵就是DDR3-1066,也可能CPU的内存控制器最大支持到1066MHz。如果不是内存控制器不支持,只要是主板支持,你把它的频率设臵成667MHz也是可以的。问9:我用的是AMDK8的CPU,主频是2800MHz。应该选什么样的内存?答:从表6可以看出,在你的这种情况下,选择DDR2-800就可以了。选DDR2-1066似乎高了一些。因为你的CPU主频比较低,选择DDR3不一定合适。但是,还要看主板和内存控制器是否支持。
问10.我的AMD8650CPU匹配的是DDR2-800内存条。我把外频超到240MHz后,为什么CPU-Z显示的内存频率是480MHz?答:分频系数是800MHz/200MHz=4。所以,你的内存的数据频率是240MHzX4=960MHz,即相当是DDR2-960。它的时针频率恰好是960MHz/2=480MHz。所以,CPU-Z的显示是完全正确的。当为AMD的CPU选配内存时,一定要搞清楚这个CPU是K8、K10?或是K8以前的。因为三种类型的CPU有不同的匹配内存的方法。问11:HT的频率跟内存的频率有什么关系?答:因为AMD的内存控制器在CPU内部,直接受CPU控制。内存总线跟HT总线虽然都源于CPU,但是,各走各的路;各有各的任务(见本文的附图),彼此没有什么关系。因此,当选配内存时,不必考虑HT总线的频率。但是,当采用需要共享内存作为显存的集成显卡时,二者是有一些关联的。但是,当考虑匹配内存时,无需考虑这些。问12:为AMD平台配内存时,还需要考虑内存的带宽跟CPU带宽的匹配吗?答:因为在AMD平台,内存直接跟CPU打交道了,CPU的带宽就是内存的带宽。因此,当选配内存时,CPU的带宽跟内存的带宽匹配问题可以不再单独考虑。按本文所介绍的方法选配内存就可以了。但是,在K8时代,如果是DDR2-800的内存,CPU的主频必须提高到2.8Ghz时,才能把它当DDR2-800使用,实际上这也是带宽的匹配问题。问13:什么是MCT?什么是DCT?
答:MCT(MemoryController)是内存控制器,它控制内存的读取等操作,决定了K8/K10的内存性能。它的控制功能适用于任何类型的内存。而DCT(DRAMController)是“内存界面控制器”,也称DRAM控制器。它决定了可以使用的内存类型。它可以升级换代,以适应不同类型的内存。也就是说,内存控制器支持什么类型的内存是由它决定的。问14:在支持AMDK10主板的BIOS中的DCTsMode是什么意思?答:DCTsMode(DRAM控制器模式)是指K10中所安装的两个独立的64bit单元内存控制器的两种运行模式。有GangedMode和UngangedMode。后者是默认模式。前一种模式就跟K8双通道模式相同,两通道的内存会逻辑上连为一体,构成128bit,这个模式称为「GangedMode」。如果两个控制器同时启动,总合起来每个时脉周期一样有128bit的资料传输。这不是双通道,也不是单通道,而是两个单通道同时运行,称为「UngangedMode」模式。这种模式的好处是对两个内存的一致性要求不高。
答hmhding网友:因为下述文字“超过”1000字了。加不上。所以放到这里来回答你:
第一个问题调控的目的和效果就是让加于内存的频率不过载即当外频为200MHz时用DDR2-667:。,时,加给内存的频率是166MHz而不是200MHz。当然也就不存在蓝屏的问题了。第二个问题:当外频是200MHz时,用两个DDR400组成双通道,就是为解决带宽的瓶颈的。其实,用一个DDR400也可以。第三个问题:你的外频是100MHz,FSB:DRAM=3:4。由此可以推算出你采用的DDR400已经降频到DDR266使用了。至于为什么不是降到DDR200,我也说不清。是不是主板不支持?请看看你的主板说明书把。谢谢。
对你第二次来信的回复(就这么几个字,人家总说超过1000字了,贴不上):从你这段话就完全清楚了为什么内存频率只降级到DDR266,而不是降级到DDR200的原因了。因为“host/dramclockratio选项”的含义实际上是内存的数据频率/外频。主板默认它为2.66,所以,内存的数据频率就等于100MHz×2.66=266MHz。这个判断是我根据GA-81的说明书作出来的,你也可以仔细看看你的说明书。
推荐阅读
-
时钟与频率的关系
-
明白时钟频率与数据频率之间的关联
-
理解基础数据单位:位、字节、字长、频率、时钟周期与带宽
-
时间和频率分辨率之间的关联探析
-
理解电脑运行速度:CPU时钟周期与时钟频率的关系
-
SSM三大框架基础面试题-一、Spring篇 什么是Spring框架? Spring是一种轻量级框架,提高开发人员的开发效率以及系统的可维护性。 我们一般说的Spring框架就是Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。比如Core Container中的Core组件是Spring所有组件的核心,Beans组件和Context组件是实现IOC和DI的基础,AOP组件用来实现面向切面编程。 Spring的6个特征: 核心技术:依赖注入(DI),AOP,事件(Events),资源,i18n,验证,数据绑定,类型转换,SpEL。 测试:模拟对象,TestContext框架,Spring MVC测试,WebTestClient。 数据访问:事务,DAO支持,JDBC,ORM,编组XML。 Web支持:Spring MVC和Spring WebFlux Web框架。 集成:远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。 语言:Kotlin,Groovy,动态语言。 列举一些重要的Spring模块? Spring Core:核心,可以说Spring其他所有的功能都依赖于该类库。主要提供IOC和DI功能。 Spring Aspects:该模块为与AspectJ的集成提供支持。 Spring AOP:提供面向切面的编程实现。 Spring JDBC:Java数据库连接。 Spring JMS:Java消息服务。 Spring ORM:用于支持Hibernate等ORM工具。 Spring Web:为创建Web应用程序提供支持。 Spring Test:提供了对JUnit和TestNG测试的支持。 谈谈自己对于Spring IOC和AOP的理解 IOC(Inversion Of Controll,控制反转)是一种设计思想: 在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC在其他语言中也有应用,并非Spring特有。IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象。 将对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。在实际项目中一个Service类可能由几百甚至上千个类作为它的底层,假如我们需要实例化这个Service,可能要每次都搞清楚这个Service所有底层类的构造函数,这可能会把人逼疯。如果利用IOC的话,你只需要配置好,然后在需要的地方引用就行了,大大增加了项目的可维护性且降低了开发难度。 Spring中的bean的作用域有哪些? 1.singleton:该bean实例为单例 2.prototype:每次请求都会创建一个新的bean实例(多例)。 3.request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。 4.session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。 5.global-session:全局session作用域,仅仅在基于Portlet的Web应用中才有意义,Spring5中已经没有了。Portlet是能够生成语义代码(例如HTML)片段的小型Java Web插件。它们基于Portlet容器,可以像Servlet一样处理HTTP请求。但是与Servlet不同,每个Portlet都有不同的会话。 Spring中的单例bean的线程安全问题了解吗? 概念用于理解:大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。 有两种常见的解决方案(用于回答的点): 1.在bean对象中尽量避免定义可变的成员变量(不太现实)。 2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal(线程本地化对象)中(推荐的一种方式)。 ThreadLocal解决多线程变量共享问题(参考博客):https://segmentfault.com/a/1190000009236777 Spring中Bean的生命周期: 1.Bean容器找到配置文件中Spring Bean的定义。 2.Bean容器利用Java Reflection API创建一个Bean的实例。 3.如果涉及到一些属性值,利用set方法设置一些属性值。 4.如果Bean实现了BeanNameAware接口,调用setBeanName方法,传入Bean的名字。 5.如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader方法,传入ClassLoader对象的实例。 6.如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory方法,传入ClassLoader对象的实例。 7.与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。 8.如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执postProcessBeforeInitialization方法。 9.如果Bean实现了InitializingBean接口,执行afeterPropertiesSet方法。 10.如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。 11.如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization方法。 12.当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy方法。 13.当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。 Spring框架中用到了哪些设计模式? 1.工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。 2.代理设计模式:Spring AOP功能的实现。 3.单例设计模式:Spring中的bean默认都是单例的。 4.模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就使用到了模板模式。 5.包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。 6.观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用。 7.适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式、Spring MVC中也是用到了适配器模式适配Controller。 还有很多。。。。。。。 @Component和@Bean的区别是什么 1.作用对象不同。@Component注解作用于类,而@Bean注解作用于方法。 2.@Component注解通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用@ComponentScan注解定义要扫描的路径)。@Bean注解通常是在标有该注解的方法中定义产生这个bean,告诉Spring这是某个类的实例,当我需要用它的时候还给我。 3.@Bean注解比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。比如当引用第三方库的类需要装配到Spring容器的时候,就只能通过@Bean注解来实现。 @Configuration public class AppConfig { @Bean public TransferService transferService { return new TransferServiceImpl; } } <beans> <bean id="transferService" class="com.kk.TransferServiceImpl"/> </beans> @Bean public OneService getService(status) { case (status) { when 1: return new serviceImpl1; when 2: return new serviceImpl2; when 3: return new serviceImpl3; } } 将一个类声明为Spring的bean的注解有哪些? 声明bean的注解: @Component 组件,没有明确的角色 @Service 在业务逻辑层使用(service层) @Repository 在数据访问层使用(dao层) @Controller 在展现层使用,控制器的声明 注入bean的注解: @Autowired:由Spring提供 @Inject:由JSR-330提供 @Resource:由JSR-250提供 *扩:JSR 是 java 规范标准 Spring事务管理的方式有几种? 1.编程式事务:在代码中硬编码(不推荐使用)。 2.声明式事务:在配置文件中配置(推荐使用),分为基于XML的声明式事务和基于注解的声明式事务。 Spring事务中的隔离级别有哪几种? 在TransactionDefinition接口中定义了五个表示隔离级别的常量:ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 Spring事务中有哪几种事务传播行为? 在TransactionDefinition接口中定义了八个表示事务传播行为的常量。 支持当前事务的情况:PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。 不支持当前事务的情况:PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。 其他情况:PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。 二、SpringMVC篇 什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。 Spring MVC的工作原理了解嘛? image.png Springmvc的优点: (1)可以支持各种视图技术,而不仅仅局限于JSP; (2)与Spring框架集成(如IoC容器、AOP等); (3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。 (4) 支持各种请求资源的映射策略。 Spring MVC的主要组件? (1)前端控制器 DispatcherServlet(不需要程序员开发) 作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。 (2)处理器映射器HandlerMapping(不需要程序员开发) 作用:根据请求的URL来查找Handler (3)处理器适配器HandlerAdapter 注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。 (4)处理器Handler(需要程序员开发) (5)视图解析器 ViewResolver(不需要程序员开发) 作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view) (6)视图View(需要程序员开发jsp) View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等) springMVC和struts2的区别有哪些? (1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。 (2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。 (3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。 SpringMVC怎么样设定重定向和转发的? (1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4" (2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com" SpringMvc怎么和AJAX相互调用的? 通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 : (1)加入Jackson.jar (2)在配置文件中配置json的映射 (3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。 如何解决POST请求中文乱码问题,GET的又如何处理呢? (1)解决post请求乱码问题: 在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8; <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> (2)get请求中文参数出现乱码解决方法有两个: ①修改tomcat配置文件添加编码与工程编码一致,如下: <ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> ②另外一种方法对参数进行重新编码: String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8") ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。 Spring MVC的异常处理 ? 统一异常处理: Spring MVC处理异常有3种方式: (1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; (2)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器; (3)使用@ExceptionHandler注解实现异常处理; 统一异常处理的博客:https://blog.csdn.net/ctwy291314/article/details/81983103 SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决? 是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写成员变量。(此题目类似于上面Spring 中 第5题 有两种解决方案) SpringMVC常用的注解有哪些? @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。 @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。 @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。 SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代? 一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置? 可以在@RequestMapping注解里面加上method=RequestMethod.GET。 怎样在方法里面得到Request,或者Session? 直接在方法的形参中声明request,SpringMVC就自动把request对象传入。 如果想在拦截的方法里面得到从前台传入的参数,怎么得到? 直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象? 直接在方法中声明这个对象,SpringMVC就自动会把属性赋值到这个对象里面。 SpringMVC中函数的返回值是什么? 返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的。 SpringMVC用什么对象从后台向前台传递数据的? 通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以拿到数据。 怎么样把ModelMap里面的数据放入Session里面? 可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。 SpringMvc里面拦截器是怎么写的: 有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可: <!-- 配置SpringMvc的拦截器 --> <mvc:interceptors> <!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 --> <bean id="myInterceptor" class="com.zwp.action.MyHandlerInterceptor"></bean> <!-- 只针对部分请求拦截 --> <mvc:interceptor> <mvc:mapping path="/modelMap.do" /> <bean class="com.zwp.action.MyHandlerInterceptorAdapter" /> </mvc:interceptor> </mvc:interceptors> 注解原理: 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池 三、Mybatis篇 什么是MyBatis? MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。 讲下MyBatis的缓存 MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有, 二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现Serializable序列化接口, 可在它的映射文件中配置<cache/> Mybatis是如何进行分页的?分页插件的原理是什么? 1)Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件。 2)分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。 举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10 简述Mybatis的插件运行原理,以及如何编写一个插件? 1)Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、 Executor这4种接口的插件,Mybatis通过动态代理, 为需要拦截的接口生成代理对象以实现接口方法拦截功能, 每当执行这4种接口对象的方法时,就会进入拦截方法, 具体就是InvocationHandler的invoke方法,当然, 只会拦截那些你指定需要拦截的方法。 2)实现Mybatis的Interceptor接口并复写intercept方法, 然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可, 记住,别忘了在配置文件中配置你编写的插件。 Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不? 1)Mybatis动态sql可以让我们在Xml映射文件内, 以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。 2)Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。 3)其执行原理为,使用OGNL从sql参数对象中计算表达式的值, 根据表达式的值动态拼接sql,以此来完成动态sql的功能。 #{}和${}的区别是什么? 1)#{}是预编译处理,${}是字符串替换。 2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值(有效的防止SQL注入); 3)Mybatis在处理${}时,就是把${}替换成变量的值。 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里? Hibernate属于全自动ORM映射工具, 使用Hibernate查询关联对象或者关联集合对象时, 可以根据对象关系模型直接获取,所以它是全自动的。 而Mybatis在查询关联对象或关联集合对象时, 需要手动编写sql来完成,所以,称之为半自动ORM映射工具。 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么? 1)Mybatis仅支持association关联对象和collection关联集合对象的延迟加载, association指的就是一对一,collection指的就是一对多查询。 在Mybatis配置文件中, 可以配置是否启用延迟加载lazyLoadingEnabled=true|false。 2)它的原理是,使用CGLIB创建目标对象的代理对象, 当调用目标方法时,进入拦截器方法, 比如调用a.getB.getName, 拦截器invoke方法发现a.getB是null值, 那么就会单独发送事先保存好的查询关联B对象的sql, 把B查询上来,然后调用a.setB(b), 于是a的对象b属性就有值了, 接着完成a.getB.getName方法的调用。 这就是延迟加载的基本原理。 MyBatis与Hibernate有哪些不同? 1)Mybatis和hibernate不同,它不完全是一个ORM框架, 因为MyBatis需要程序员自己编写Sql语句, 不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句, 并将java对象和sql语句映射生成最终执行的sql, 最后将sql执行的结果再映射生成java对象。 2)Mybatis学习门槛低,简单易学,程序员直接编写原生态sql, 可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发, 例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁, 一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性, 如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。 3)Hibernate对象/关系映射能力强,数据库无关性好, 对于关系模型要求高的软件(例如需求固定的定制化软件) 如果用hibernate开发可以节省很多代码,提高效率。 但是Hibernate的缺点是学习门槛高,要精通门槛更高, 而且怎么设计O/R映射,在性能和对象模型之间如何权衡, 以及怎样用好Hibernate需要具有很强的经验和能力才行。 总之,按照用户的需求在有限的资源环境下只要能做出维护性、 扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。 MyBatis的好处是什么? 1)MyBatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写, 给程序的维护带来了很大便利。 2)MyBatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象, 大大简化了Java数据库编程的重复工作。 3)因为MyBatis需要程序员自己去编写sql语句, 程序员可以结合数据库自身的特点灵活控制sql语句, 因此能够实现比Hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系? Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。 在Xml映射文件中,<parameterMap>标签会被解析为ParameterMap对象, 其每个子元素会被解析为ParameterMapping对象。 <resultMap>标签会被解析为ResultMap对象, 其每个子元素会被解析为ResultMapping对象。 每一个<select>、<insert>、<update>、<delete> 标签均会被解析为MappedStatement对象, 标签内的sql会被解析为BoundSql对象。 什么是MyBatis的接口绑定,有什么好处? 接口映射就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置. 接口绑定有几种实现方式,分别是怎么实现的? 接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加 上@Select@Update等注解里面包含Sql语句来绑定, 另外一种就是通过xml里面写SQL来绑定,在这种情况下, 要指定xml映射文件里面的namespace必须为接口的全路径名. 什么情况下用注解绑定,什么情况下用xml绑定? 当Sql语句比较简单时候,用注解绑定;当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多 MyBatis实现一对一有几种方式?具体怎么操作的? 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成; 嵌套查询是先查一个表,根据这个表里面的结果的外键id, 去再另外一个表里面查询数据,也是通过association配置, 但另外一个表的查询通过select属性配置。 Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别? 能,Mybatis不仅可以执行一对一、一对多的关联查询, 还可以执行多对一,多对多的关联查询,多对一查询, 其实就是一对一查询,只需要把selectOne修改为selectList即可; 多对多查询,其实就是一对多查询,只需要把selectOne修改为selectList即可。 关联对象查询,有两种实现方式,一种是单独发送一个sql去查询关联对象, 赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询, 一部分列是A对象的属性值,另外一部分列是关联对象B的属性值, 好处是只发一个sql查询,就可以把主对象和其关联对象查出来。 MyBatis里面的动态Sql是怎么设定的?用什么语法? MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现, 但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有 内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or 开始,那么会自动把这个and或者or取掉。 Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式? 第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。 第二种是使用sql列的别名功能,将列别名书写为对象属性名, 比如T_NAME AS NAME,对象属性名一般是name,小写, 但是列名不区分大小写,Mybatis会忽略列名大小写,
-
复旦微核心板:基于复旦微 FMQL45T900 全国产化核心板--处理器架构:FMQL45T900 包含一个四核 ARM Cortex-A7 处理器,每个内核的运行频率高达 800MHz。 内存配置:PS(处理系统)端配备 1GB DDR3 内存,数据传输速率高达 1066Mbps,总线宽度为 32 位。PL(可编程逻辑)侧也配备了 1GB DDR3 内存,但数据传输速率更高,达到 1600Mbps,总线宽度为 32 位。 输入/输出能力:芯片支持高速 GTX 收发器,提供 16 个通道,速度等级与进口同类产品相当。 应用领域:FMQL45T900 适用于多个领域,包括但不限于航空航天、高速轨道交通、5G 通信、医疗安全和消费电子。 核心板的基本特性:
-
采样点数量与采样频率之间的关系
-
采样率与频率之间的关系
-
取样间隔与取样频率之间的关系