1. cpu 如何使用内存
一、 指令系统
要讲CPU,就必须先讲一下指令系统。指令系统指的是一个CPU所能够处理的全部指
令的集合,是一个CPU的根本属性。比如我们现在所用的CPU都是采用x86指令集的,他们都是同一类型的CPU,不管是PIII、Athlon或Joshua。我们也知道,世界上还有比PIII和Athlon快得多的CPU,比如Alpha,但它们不是用x86指令集,不能使用数量庞大的基于x86指令集的程序,如Windows98。之所以说指令系统是一个CPU的根本属性,是因为指令系统决定了一个CPU能够运行什么样的程序。
所有采用高级语言编出的程序,都需要翻译(编译或解释)成为机器语言后才能运行,这些机器语言中所包含的就是一条条的指令。
1、 指令的格式
一条指令一般包括两个部分:操作码和地址码。操作码其实就是指令序列号,用来告诉CPU需要执行的是那一条指令。地址码则复杂一些,主要包括源操作数地址、目的地址和下一条指令的地址。在某些指令中,地址码可以部分或全部省略,比如一条空指令就只有操作码而没有地址码。
举个例子吧,某个指令系统的指令长度为32位,操作码长度为8位,地址长度也为8位,且第一条指令是加,第二条指令是减。当它收到一个“”的指令时,先取出它的前8位操作码,即00000010,分析得出这是一个减法操作,有3个地址,分别是两个源操作数地址和一个目的地址。于是,CPU就到内存地址00000100处取出被减数,到00000001处取出减数,送到ALU中进行减法运算,然后把结果送到00000110处。
这只是一个相当简单化的例子,实际情况要复杂的多。
2、 指令的分类与寻址方式
一般说来,现在的指令系统有以下几种类型的指令:
(1)算术逻辑运算指令
算术逻辑运算指令包括加减乘除等算术运算指令,以及与或非异或等逻辑运算指令。现在的指令系统还加入了一些十进制运算指令以及字符串运算指令等。
(2)浮点运算指令
用于对浮点数进行运算。浮点运算要大大复杂于整数运算,所以CPU中一般还会有专门负责浮点运算的浮点运算单元。现在的浮点指令中一般还加入了向量指令,用于直接对矩阵进行运算,对于现在的多媒体和3D处理很有用。
(3)位操作指令
学过C的人应该都知道C语言中有一组位操作语句,相对应的,指令系统中也有一组位操作指令,如左移一位右移一位等。对于计算机内部以二进制不码表示的数据来说,这种操作是非常简单快捷的。
(4)其他指令
上面三种都是运算型指令,除此之外还有许多非运算的其他指令。这些指令包括:数据传送指令、堆栈操作指令、转移类指令、输入输出指令和一些比较特殊的指令,如特权指令、多处理器控制指令和等待、停机、空操作等指令。
对于指令中的地址码,也会有许多不同的寻址(编址)方式,主要有直接寻址,间接寻址,寄存器寻址,基址寻址,变址寻址等,某些复杂的指令系统会有几十种甚至更多的寻址方式。
3、 CISC与RISC
CISC,Complex Instruction Set Computer,复杂指令系统计算机。RISC,Reced Instruction Set Computer,精简指令系统计算机。虽然这两个名词是针对计算机的,但下文我们仍然只对指令集进行研究。
(1)CISC的产生、发展和现状
一开始,计算机的指令系统只有很少一些基本指令,而其他的复杂指令全靠软件编译时通过简单指令的组合来实现。举个最简单的例子,一个a乘以b的操作就可以转换为a个b相加来做,这样就用不着乘法指令了。当然,最早的指令系统就已经有乘法指令了,这是为什么呢?因为用硬件实现乘法比加法组合来得快得多。
由于那时的计算机部件相当昂贵,而且速度很慢,为了提高速度,越来越多的复杂指令被加入了指令系统中。但是,很快又有一个问题:一个指令系统的指令数是受指令操作码的位数所限制的,如果操作码为8位,那么指令数最多为256条(2的8次方)。
那么怎么办呢?指令的宽度是很难增加的,聪明的设计师们又想出了一种方案:操作码扩展。前面说过,操作码的后面跟的是地址码,而有些指令是用不着地址码或只用少量的地址码的。那么,就可以把操作码扩展到这些位置。
举个简单的例子,如果一个指令系统的操作码为2位,那么可以有00、01、10、11四条不同的指令。现在把11作为保留,把操作码扩展到4位,那么就可以有00、01、10、1100、1101、1110、1111七条指令。其中1100、1101、1110、1111这四条指令的地址码必须少两位。
然后,为了达到操作码扩展的先决条件:减少地址码,设计师们又动足了脑筋,发明了各种各样的寻址方式,如基址寻址、相对寻址等,用以最大限度的压缩地址码长度,为操作码留出空间。
就这样,慢慢地,CISC指令系统就形成了,大量的复杂指令、可变的指令长度、多种的寻址方式是CISC的特点,也是CISC的缺点:因为这些都大大增加了解码的难度,而在现在的高速硬件发展下,复杂指令所带来的速度提升早已不及在解码上浪费点的时间。除了个人PC市场还在用x86指令集外,服务器以及更大的系统都早已不用CISC了。x86仍然存在的唯一理由就是为了兼容大量的x86平台上的软件。
(2)RISC的产生、发展和现状
1975年,IBM的设计师John Cocke研究了当时的IBM370CISC系统,发现其中占总指令数仅20%的简单指令却在程序调用中占了80%,而占指令数80%的复杂指令却只有20%的机会用到。由此,他提出了RISC的概念。
事实证明,RISC是成功的。80年代末,各公司的RISC CPU如雨后春笋般大量出现,占据了大量的市场。到了90年代,x86的CPU如pentium和k5也开始使用先进的RISC核心。
RISC的最大特点是指令长度固定,指令格式种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计超标量与流水线,寄存器数量多,大量操作在寄存器之间进行。由于下文所讲的CPU核心大部分是讲RISC核心,所以这里就不多介绍了,对于RISC核心的设计下面会详细谈到。
RISC目前正如日中天,Intel的Itanium也将最终抛弃x86而转向RISC结构。
二、CPU内核结构
好吧,下面来看看CPU。CPU内核主要分为两部分:运算器和控制器。
(一) 运算器
1、 算术逻辑运算单元ALU(Arithmetic and Logic Unit)
ALU主要完成对二进制数据的定点算术运算(加减乘除)、逻辑运算(与或非异或)以及移位操作。在某些CPU中还有专门用于处理移位操作的移位器。
通常ALU由两个输入端和一个输出端。整数单元有时也称为IEU(Integer Execution Unit)。我们通常所说的“CPU是XX位的”就是指ALU所能处理的数据的位数。
2、 浮点运算单元FPU(Floating Point Unit)
FPU主要负责浮点运算和高精度整数运算。有些FPU还具有向量运算的功能,另外一些则有专门的向量处理单元。
3、通用寄存器组
通用寄存器组是一组最快的存储器,用来保存参加运算的操作数和中间结果。
在通用寄存器的设计上,RISC与CISC有着很大的不同。CISC的寄存器通常很少,主要是受了当时硬件成本所限。比如x86指令集只有8个通用寄存器。所以,CISC的CPU执行是大多数时间是在访问存储器中的数据,而不是寄存器中的。这就拖慢了整个系统的速度。而RISC系统往往具有非常多的通用寄存器,并采用了重叠寄存器窗口和寄存器堆等技术使寄存器资源得到充分的利用。
对于x86指令集只支持8个通用寄存器的缺点,Intel和AMD的最新CPU都采用了一种叫做“寄存器重命名”的技术,这种技术使x86CPU的寄存器可以突破8个的限制,达到32个甚至更多。不过,相对于RISC来说,这种技术的寄存器操作要多出一个时钟周期,用来对寄存器进行重命名。
4、 专用寄存器
专用寄存器通常是一些状态寄存器,不能通过程序改变,由CPU自己控制,表明某种状态。
(二) 控制器
运算器只能完成运算,而控制器用于控制着整个CPU的工作。
1、 指令控制器
指令控制器是控制器中相当重要的部分,它要完成取指令、分析指令等操作,然后交给执行单元(ALU或FPU)来执行,同时还要形成下一条指令的地址。
2、 时序控制器
时序控制器的作用是为每条指令按时间顺序提供控制信号。时序控制器包括时钟发生器和倍频定义单元,其中时钟发生器由石英晶体振荡器发出非常稳定的脉冲信号,就是CPU的主频;而倍频定义单元则定义了CPU主频是存储器频率(总线频率)的几倍。
3、 总线控制器
总线控制器主要用于控制CPU的内外部总线,包括地址总线、数据总线、控制总线等等。
4、中断控制器
中断控制器用于控制各种各样的中断请求,并根据优先级的高低对中断请求进行排队,逐个交给CPU处理。
(三) CPU核心的设计
CPU的性能是由什么决定的呢?单纯的一个ALU速度在一个CPU中并不起决定性作用,因为ALU的速度都差不多。而一个CPU的性能表现的决定性因素就在于CPU内核的设计。
1、超标量(Superscalar)
既然无法大幅提高ALU的速度,有什么替代的方法呢?并行处理的方法又一次产生了强大的作用。所谓的超标量CPU,就是只集成了多个ALU、多个FPU、多个译码器和多条流水线的CPU,以并行处理的方式来提高性能。
超标量技术应该是很容易理解的,不过有一点需要注意,就是不要去管“超标量”之前的那个数字,比如“9路超标量”,不同的厂商对于这个数字有着不同的定义,更多的这只是一种商业上的宣传手段。
2、流水线(Pipeline)
流水线是现代RISC核心的一个重要设计,它极大地提高了性能。
对于一条具体的指令执行过程,通常可以分为五个部分:取指令,指令译码,取操作数,运算(ALU),写结果。其中前三步一般由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有指令顺序执行,那么先是指令控制器工作,完成第一条指令的前三步,然后运算器工作,完成后两步,在指令控制器工作,完成第二条指令的前三步,在是运算器,完成第二条指令的后两部……很明显,当指令控制器工作是运算器基本上在休息,而当运算器在工作时指令控制器却在休息,造成了相当大的资源浪费。解决方法很容易想到,当指令控制器完成了第一条指令的前三步后,直接开始第二条指令的操作,运算单元也是。这样就形成了流水线系统,这是一条2级流水线。
如果是一个超标量系统,假设有三个指令控制单元和两个运算单元,那么就可以在完成了第一条指令的取址工作后直接开始第二条指令的取址,这时第一条指令在进行译码,然后第三条指令取址,第二条指令译码,第一条指令取操作数……这样就是一个5级流水线。很显然,5级流水线的平均理论速度是不用流水线的4倍。
流水线系统最大限度地利用了CPU资源,使每个部件在每个时钟周期都工作,大大提高了效率。但是,流水线有两个非常大的问题:相关和转移。
在一个流水线系统中,如果第二条指令需要用到第一条指令的结果,这种情况叫做相关。以上面哪个5级流水线为例,当第二条指令需要取操作数时,第一条指令的运算还没有完成,如果这时第二条指令就去取操作数,就会得到错误的结果。所以,这时整条流水线不得不停顿下来,等待第一条指令的完成。这是很讨厌的问题,特别是对于比较长的流水线,比如20级,这种停顿通常要损失十几个时钟周期。目前解决这个问题的方法是乱序执行。乱序执行的原理是在两条相关指令中插入不相关的指令,使整条流水线顺畅。比如上面的例子中,开始执行第一条指令后直接开始执行第三条指令(假设第三条指令不相关),然后才开始执行第二条指令,这样当第二条指令需要取操作数时第一条指令刚好完成,而且第三条指令也快要完成了,整条流水线不会停顿。当然,流水线的阻塞现象还是不能完全避免的,尤其是当相关指令非常多的时候。
另一个大问题是条件转移。在上面的例子中,如果第一条指令是一个条件转移指令,那么系统就会不清楚下面应该执行那一条指令?这时就必须等第一条指令的判断结果出来才能执行第二条指令。条件转移所造成的流水线停顿甚至比相关还要严重的多。所以,现在采用分支预测技术来处理转移问题。虽然我们的程序中充满着分支,而且哪一条分支都是有可能的,但大多数情况下总是选择某一分支。比如一个循环的末尾是一个分支,除了最后一次我们需要跳出循环外,其他的时候我们总是选择继续循环这条分支。根据这些原理,分支预测技术可以在没有得到结果之前预测下一条指令是什么,并执行它。现在的分支预测技术能够达到90%以上的正确率,但是,一旦预测错误,CPU仍然不得不清理整条流水线并回到分支点。这将损失大量的时钟周期。所以,进一步提高分支预测的准确率也是正在研究的一个课题。
越是长的流水线,相关和转移两大问题也越严重,所以,流水线并不是越长越好,超标量也不是越多越好,找到一个速度与效率的平衡点才是最重要的。
三、CPU的外核
1、解码器(Decode Unit)
这是x86CPU才有的东西,它的作用是把长度不定的x86指令转换为长度固定的类似于RISC的指令,并交给RISC内核。解码分为硬件解码和微解码,对于简单的x86指令只要硬件解码即可,速度较快,而遇到复杂的x86指令则需要进行微解码,并把它分成若干条简单指令,速度较慢且很复杂。好在这些复杂指令很少会用到。
Athlon也好,PIII也好,老式的CISC的x86指令集严重制约了他们的性能表现。
2、一级缓存和二级缓存(Cache)
以及缓存和二级缓存是为了缓解较快的CPU与较慢的存储器之间的矛盾而产生的,以及缓存通常集成在CPU内核,而二级缓存则是以OnDie或OnBoard的方式以较快于存储器的速度运行。对于一些大数据交换量的工作,CPU的Cache显得尤为重要。
好了,看到了吧,CPU其实也就这样,并不是很神秘。这篇文章的所有内容都不针对某一种CPU,而是适合于任何CPU,是一些最基本的CPU原理,希望能够对你有所帮助。
2. 如何在CPU中加入缓存
返回到CPU生产厂商~
然后打报告给公司~
批下来了~~~就能在CPU增加缓存了~
自己是加不进去的~
3. CPU的缓存是如何工作的
CPU执行指令时,会将执行结果放在一个叫“寄存器”的元件中,由于“寄存器”集成在CPU内部,与ALU等构成CPU的重要元件,因此寄存器中的指令很快被CPU所访问,但毕竟寄存器的容量太小,CPU所需的大量指令和数据还在内存(RAM)当中,所以CPU为了完成指令操作,需要频繁地向内存发送接收指令、数据。
由于内存的处理速度远远低于CPU,所以传统的系统瓶颈在这里就产生了,CPU在处理指令时往往花费很多时间在等待内存做准备工作。
为了解决这个问题,人们在CPU内部集成了一个比内存快许多的“Cache”,这就是最早的“高速缓存”。
L1高速缓存是与CPU完全同步运行的存储器,也就是我们常说的一级缓存,如果CPU需要的数据和指令已经在高速缓存中了,那么CPU不必等待,直接就可以从一级缓存(L1)中取得数据,如果数据不在L1中,CPU再从二级缓存(L2)中提取数据,大大提高了系统的工作效率。
4. cpu的缓存是如何工作的
CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。
正是这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后内存。
5. CPU的缓存有什么用
缓存是CPU自己的“内存”,用来放暂时处理不及的东西,因为它的作用像内存对电脑的作用,但为什么CPU不用内存而用自己的缓存呢?因为内存的速度虽然很快,但依然达不到CPU的读写频率,所以CPU需要这样一个缓存来快速读写。而内存用来存放目前运行的程序所必须占用的空间。
而CPU又分为一级(L1)二级(L2)三级(L3)缓存,你通常会看到L1最小,L2次之,L3最大(很多普通CPU并没有三级,只有一二级),成这种结构是因为,L1制造难度大,成本高,但往大了做对系统提升却比较有限,所以都很小。而CPU的读取顺序也是先从L1里读,然后L2→L3→内存。L2作为其外部缓冲,而L3就是L2的缓冲(备胎当到老)。缓存当然是越大越好,毕竟它们都比内存快嘛,但以目前相同情况下,L1还是越大越好,相同L1比L2,相同L2比L3。
6. 怎样增大CPU缓存
很正常不是CPU的问题。
7. CPU的缓存
cpu缓存现在都分两个级别,一及缓存称L1 cache,二级缓存称为L2 cache.
当然对于不同cpu,两及缓存的作用是不同的.但总体来说,缓存是储存cpu急需处理的数据的地方,当cpu要处理东西的时候,缓存中就开始储存这些数据,由于缓存速度非常之高,所以,cpu读取这些数据的速度就相当快.
由于缓存容量相当小,但是当缓存中的数据处理完了又没有来得及重新添满的时候,或者是缓存中的数据不是cpu马上要处理的数据的时候,cpu就只有跳过缓存,直接村内存读取,内存的速度要相对慢得多,所以这个时候cpu整体的速度就下降了.
当然,AMD和intel在缓存上的结构完全不同,这个造成了为什么intel的主流处理器的L2 cache缓存在2-4Mb,而AMD的L2 cache只有256kb-512kb.这个我们就要说到他们L1 cache的区别了.
intel的L1中不储存cpu要处理的实际数据,他储存的都是L2中数据的目录,也就是intel的cpu要处理数据的时候先要访问L1,为的是了解他要储存的实际数据在L2中具体的位置.这个大大减少了cpu寻找L2数据的时间.比喻起来,intel的L2是一个仓库,L1关于就是这个仓库中储存东西具体位置的目录.
AMD完全不同,L1中就储存实际数据,L2也储存实际数据,当L1中的数据用完了的时候,或者L1不能装的过大的数据的时候,cpu就直接处理L2中的数据.比喻起来,AMD的L1是个小仓库,L2是个大仓库.
然后是为什么他们对L2需求不同.
AMD的很好理解,他cpu处理数据的时候是有续处理的,先处理L1,处理完了再处理L2,数据一个接一个.
intel采取的是则是乱处理方式,cpu不会衣顺序处理数据,而是随即挑选数据来处理,当他随便挑选的数据在L2中时,他就读取L1了解数据在L2的位置,然后处理这个数据,但是当数据不在L2中时,就读取内存.
这个造就了他们L2大小不同,intel的处理方式像是一个人随机的在扔飞标,飞标落在标盘每个地方的几率是相同的,标盘内的红心就是L2的数据,标盘的其他地方是内存.前面说了,L2中数据是高速的,只有处理L2的,才能更快,否则要慢很多。所以,一个随机扔飞标的人为了让飞标落在红心的几率更大,最好的办法就是加大红心的面积,也就是L2.因此为了提高cpu的速度,intel需要很大的红心,也就是L2.
AMD则不同,他是一个接一个处理的,不是随机的扔飞标,他要考虑的只是L1和L2中单个数据的大小,因为cpu要处理的数据几乎都在0-2Mb之间,0-128kb的占了50%,128-256kb占了25%,256-512的占了24%,大于512kb的只占了1%.
因此,512kb就能满足cpu几乎所有的需求了,只有处理那些1%的大于512kb的数据的时候AMD才会访问内存.因此AMD需求很小的L2.
8. 如何清理CPU缓存
清理CPU缓存最好的方法是关机或重启设备。
CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。
9. 如何设置CPU缓存
CPU的缓存是无法设置的,他的大小有CPU决定,但是你可以选择要不要打开》不打开的话机器贼慢。
10. cpu缓存的问题
CPU运算指令直接从L1缓存里提取,L1不必很大,只要能够控制其他缓存的取址参数就可以了。
L2是高速数据缓存,是CPU直接要调用计算的部分,越大越好
L3原理相似,只是辅助性质更强了