也许我们都没有长大,只是世界变小了。 收藏本站
登陆 / 注册 搜索

阅读: 11.2K   回复: 9

[# 系统基础] 计算机扫盲贴|第三章_深入了解CPU

[复制链接]
小执念 古黑浩劫论坛大牛 2017-1-15 22:27 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员 五周年纪念
        第1章(计算机扫盲贴|第一章_计算机里有什么)我们说过,中央处理单元或者CPU是计算机的“大脑”,但当时并没有就这个术语多作讨论。这一章我们就来详细探讨一下CPU,因为它是一台计算机中最重要的组件,而且理解其特性对理解本书后面的内容也至关重要。
( W" R7 O: Z7 z' I
$ t' S4 x/ q. ~( V" Q$ B/ \
计算机扫盲贴|第三章_深入了解CPU processor-CPU-chip-computer_p.jpg
' I$ @- i+ i) a9 Q) y& {2 \
        中央处理器如何工作?它处理什么,怎么处理?直观来讲,CPU有一个小型指令系统,包含着它能够执行的基本操作。它可以做算术题,加、减、乘、除,跟计算器一样。它可以从RAM中取得要操作的数据,然后再把结果保存到RAM,与很多计算器中的存储操作一样。CPU还要控制计算机的其他组件,确保鼠标、键盘等外围设备输人的数据得到响应,让信息在屏幕上得以显示,同时还要控制和协调连接到计算机的其他所有器件。
% ?; ~& |9 G5 k; y+ h! R& ~        - Z8 I% a0 r" a/ l' {+ n
        最重要的是,它可以作出决定一尽管是简单的决定:它可以比较数值(这个数比那个数大吗?)或者比较其他数据(这段信息与那段信息一样吗?),还能根据结果决定接下来做什么。这一条最重要,因为这意味着CPU能做的虽然比计算器多不了多少,但它可以在无人看管的情况下完成自己的工作。正如冯·诺依曼所说的:“要让这种机器完全自动化,即让它在计算开始后不再依赖人工操作。”4 P% Q- {' M" V9 \1 ]4 K) @
        * C7 y. Q+ _0 Q0 ?
        由于CPU能根据它所处理的数据决定下一步做什么,因此它就能自己运行整个系统。虽然其指令系统并不大,或者说并不复杂,但CPU每秒可以执行数十亿次运算,所以它能完成极为复杂的处理。
8 u& y% ^% w9 ^8 k# ]; h; L4 |$ ?! S+ O
        3.1玩具计算机4 o1 D+ V) v. u; Q- P8 H
        ! ]" X' ]+ _6 B: R. g* L1 r( B5 p
        为了解释CPU如何工作,我们先介绍一台不存在的机器。这是一台编造的或者说“假想的”计算机,它与真正计算机的原理相同,只不过要简单得多。因为这台计算机只存在于纸面上,所以我就可以随意设计它,让它能有助于我们理解计算机的工作机制。我还可以写一个真正的计算机程序,用它模拟我的纸面设计,这样就可以给假想的机器写程序,看看这些程序怎么运行。
, x; J  h0 n4 P/ s/ n1 D        
$ n: T! r% w4 h7 J5 ?        我想了一下,就管这个编造的机器叫“玩具”计算机吧,因为它不是真的,但又具有真正计算机的很多特性。实际上,它跟I960年代末的小型机差不多是一个水平,某种程度上与冯·诺依曼论文中的例子相近。这个玩具有用来存储指令和数据的RAM,还有一块额外的存储区叫累加器,其容量足以存储一个数值。累加器类似于计算器的显示屏,保存用户最近输人的数值,或者最近计算的结果。玩具还有一个指令表,只包含10个指令,都是前面提到过的基本操作。比如下面几个指令:- ~$ z# E# l- E6 V
        6 ?$ A7 [$ i0 T! I+ q. g
        GET                        从键盘获取数值并放到累加器中
. [" @0 t2 @6 O4 F7 U( J* _        PRINT                打印累加器中的内容
: ]+ a4 a+ G. v# k: N# I1 G        STOREM                把累加器中内容的副本保存到位置M(累加器的内容不变)7 H/ Q8 V) M0 I$ v+ D6 }2 k
        LOADVal                把Val加载到累加器,Val是一个值或值在存储器中的位置(Val不变)4 J- m$ ?! k' _4 L4 w% v
        ADDVal                把Val与累加器中的内容相加(Val不变)7 S' g) Z  S0 }7 e4 R  o
        STOP                停止运行6 N# b6 L  T9 ]) s
        
  K9 z; k* V6 l1 n        为了保证最简单,我们规定每个RAM位置可以保存一个数值或一条指令(至于如何表示先不说),这样就可以在RAM中保存由指令和数据共同组成的程序。运行时,CPU从RAM的第一个位置开始,重复如下简单的循环:
! N9 J  {3 K7 I/ X) |  M4 p        3 R. s; u, ~. j4 ]8 W5 F6 X
        读取        从RAM中取得下一条指令
$ A9 n9 J! \! v* f5 v! [( M        译码        搞明白该指令要做什么
2 H1 s+ k, x4 Z8 J7 p: L        执行        执行指令
) n" D5 D* T6 B, z                        返回“读取”
* B6 ~, k! [) [6 u! t. B# c+ G                        8 ~8 j% X, @9 n3 ?' k6 b# |
        而给这个“玩具”计算机编写程序,就是要写出一组完成相应任务的指令,把它们放到RAM中,然后告诉CPU去执行这些指令。举个例子,比如RAM中正有如下指令(指令在RAM中都保存为等价的数值形式):. ^5 X7 C9 L: R8 D
        : y* G# f, f: S. ]8 E" Z: j
        GET. o3 O% r' q) A4 U9 u4 C! ^4 N/ w
        PRINT
  s( J/ R) o+ U7 A( e  y        STOP, z' L/ x3 n9 l* l, h9 p$ f
        
* `# X: L9 @) o. ]8 k# k8 I        运行程序时,第一条指令会要求用户输人一个数值,第二条指令会把该数值打印出来,而第三条指令告诉处理器停止执行。这个过程似乎很无聊,但却足以说明程序是如何运行的。假如真有这么个“玩具”计算机,这个程序还真能运行哩。巧啦,确实有这种“玩具”计算机,下面就是其中一个在运行时的样子了:
! {, I8 d. t( Q0 H4 X. _. B1 V0 `" b$ q* a+ P# z
计算机扫盲贴|第三章_深入了解CPU QQ截图20170115165735.png
% C3 `) D2 e; D/ d' {
        按下RUN,出现一个对话框:
- S# l8 r5 C( Z4 d4 _2 e( J3 Q) `8 b$ b" c5 t  D
计算机扫盲贴|第三章_深入了解CPU QQ截图20170115165749.png
        : [+ \# f# L  n, z4 o
        键人一个数字,按下OK,结果就这样了:& V: D) W5 F( ~5 X8 }/ u

+ s- u$ w0 [! `5 a8 n/ T
计算机扫盲贴|第三章_深入了解CPU QQ截图20170115165756.png

. ^0 t; J- I: ^" n7 j: l3 Y        跟我们期望的一样,程序要求输人数值,打印它,然后停下来。再看一个复杂些的程序。这个程序多了向RAM中存储值,然后再取出的操作。具体来说,程序先把一个数读到累加器中,然后把这个数保存到存储器,再把另一个数读到累加器中(覆盖前一个数),给它加上第一个数(从RAM中保存该数的位置取出),打印两个数的和,然后停下来:! H+ B  u0 T- n* y9 L2 B! A
        
4 D* j& Q* {% V% b) C        GET                        取得第一个数并放到累加器中
' \/ _5 @9 t; |8 o; W( U6 g: W        STORE Mem        把这个数保存到RAM中的位置MemGET        取得第二个数并放到累加器中" G$ \+ o/ Y! _2 g4 {& d8 b
        ADD Mem                给它加上第一个数
. Q8 _( f" C9 q" ~0 Y        PRINT                打印两个数的和
" C6 V; I; l4 o% Y7 Q# f8 J        STOP
. p! T8 ^% d! P0 e0 }        Mem -                RAM中的一个位置,保存用户输入的第一个数值" g3 N5 ~; S( p1 p
        8 X" _7 y2 ^7 G1 G8 R+ d' x% s
        CPU从程序的起点开始,每次取得一条指令。执行完一条指令后,继续取得并执行下一条指令。
3 \3 B9 Z7 D5 u# z7 m  w& |- }$ R        , l8 @# V( ]4 T
        唯一麻烦点儿的地方是要在RAM中辟出一个位置,好保存读到的第一个值。但不能把这个值留在累加器中,因为第二个GET指令会覆盖它。由于它是数据,而非指令,因此必须把它放在RAM中一个不会被当成指令取出来的位置。把数据放到程序末尾,所有指令后面,CPU就不会把它解释成指令了,因为STOP指令会让CPU停下来,不会继续读取下一个位置。2 M# f/ n1 l& `3 f5 Y& d
        
) t% U* }* Q+ \3 h+ b  W% \        还需要一种引用该位置的方法,这样程序中的指令才能在必要时找到它。或许可以把它放在存储器的第七个位置(即第六条指令后面),但这样就要先数一数有多少条指令,很麻烦,而且一旦修改了程序,位置可能也要随之变更。通行的做法是给该数据项起个名字(第5章也会讨论),让一个程序负责跟踪记录该数据项在RAM中的实际位置,然后用实际的位置代替名字。名字可以任意起,但最好是起一个让人一看就明白相应数据或指令含义的名字。比如,这里的Mem,其实改为Firstnum更好理解。
! P& c; v6 b6 A2 p: z- W& K        
. x) k' s6 _4 @5 m( `        怎么扩展这个程序,让它能计算三个数的和呢?没错,可以再加一组STORE、GET和ADD指令(有两个位置可以插人这组指令),但这种方法肯定不能扩展到1000个数相加。并且,在事先不知道有多少数的情况下也行不通。
7 f5 T$ v7 a2 p* a7 W. W5 _9 D        ! A  u2 X& w6 m8 f: D5 c5 R% K5 p. D
        答案是给CPU的指令表增加一个新指令,通过它能重用已有的指令序列。这就是GOTO指令,有时候也叫“分支”或“跳转”,它告诉CPU读取下一条指令时不要从序列中的下一个位置读,而要从它指定的位置读。
) C0 s# g0 Y. J9 X' O9 O) M          R  n) h, `! _) Y
        使用GOTO指令,可以让CPU返回到程序的前面,重复执行指令。举一个简单的例子,比如写一个程序随时显示每个输人的值。这个功能正是数据复制程序的核心,也能说明GOTO指令的作用。我给这个程序的第一条指令加了个标签,叫Top(能说明其角色的任何名字都行),而最后一条指令告诉CPU再返回到程序的第一条指令:9 _% C1 N1 `" _4 S8 K; w" s: K
        & x9 v7 h0 G6 Q6 S5 e3 z: k5 y( s$ v8 ^
        Top        GET                取得一个数并放到累加器中
; G0 }9 Q7 j, J        PRINT                打印出来* u- P- l/ @; G7 p" [! S1 o
        GOTOTop                返回Top,取得另一个数
% D% S2 u" p8 d! ^+ P" ^9 R* Q        1 L5 x1 `; e; R& b" k: \* b5 X
        问题只解决了一半:可以重用指令,但却没办法停止循环。为此,还得再增加一条指令,该指令先测试一个条件,然后决定接下来该做什么,而不是一味往前走。这样的指令被称为“条件分支”指令,或条件跳转、条件转向。现实中,不同的机器在实现该指令时测试的条件会有所不同,但有一种可能是测试某个值是否等于零,如果是则跳到某个位置。/ E7 e5 }, H- t- B) ]
. N6 m7 c6 v, w$ F3 c
        那好,我们就给这个“玩具”计算机的指令表添加一个IFZERO指令,它会在累加器的值等于零的时候把CPU弓丨导到一个指定的位置,否则继续顺序执行下一条指令。下面这个程序就使用了IFZERO,该程序会在输人值不等于零的情况下不断打印输人的值:
8 Z/ O/ o" J; u. }  ^1 i' M        
0 p3 p( l- G! Z: Z        Top        GET                        取得一个数并放到累加器中( r7 {, H  D8 v  B
        IFZEROBot                如果累加器的值为零,跳到标签为Bot的指令
/ f  [; }5 O  W2 }9 a3 {: t        PRINT                        值不是零,打印出来+ |7 E$ y& v9 P3 g! `* Q. z
        GOTOTop                        返回Top,取得另一个数
( y+ C) u% ]5 Z; ^8 {6 l( I        BotSTOP, d2 n1 I8 g4 R. k0 ?' H
        
: h; ~) X0 O7 S5 S0 \        只要用户不觉得无聊,这个程序就会不断取得数据并打印出来。如果用户输人了零,程序就会跳到STOP指令(标签Bot代表“bottom”,即“末尾”的意思)并退出。( t* w7 P% o/ ^' U
        
/ g5 s+ f8 G# j. N8 L8 @        注意,程序不会打印那个表示终止输人的零。怎么修改一下程序,让它能打印出这个零再停止呢?这个问题不难一答案明摆着一y但它却足以揭示一个现象:简单地交换两个指令的位置,就能导致程序的行为与我们的设想出现偏差,或者说会导致程序去做一些与我们希望的完全不同的事。
( n  n" l( G5 z1 R/ }        . h: P7 x$ d7 S- u2 E7 y
        组合使用GOTO和IFZERO,可以写出在指定条件为真之前可以重复执行指令的程序,而CPU也可以根据之前计算的结果改变计算过程。指令表中有了IFZERO之后,我们的玩具CPU可以执行任何计算。尽管有点难以想象,但这些指令足以应对数字计算机能够完成的任何计算一任何计算都可以分解为能使用基本指令完成的小步骤。( a/ I# N# R9 \. R* U9 }8 V
7 R5 G% z6 h: u4 d& @
        关于任务分解的思想,我们会随时随地提到,因为它太重要了。(想一想,既然有了IFZERO,那严格来讲GOTO还有必要吗?能不能用前者来模拟后者呢?)$ n) ?1 a3 g4 F8 K! Y/ l" U% g

. ?* b$ m/ r# \+ p6 r        例如,下面这个程序可以把一大堆数加起来,到输人了零为止。使用特殊的值终止循环输人是一种常见的做法。因为对于求几个数之和的计算,加零没有意义,所以这里使用零很合适。
% k' i; V1 h/ A/ \0 o7 d
' R7 k) f2 o# f4 h
计算机扫盲贴|第三章_深入了解CPU QQ截图20170115180750.png

5 H" u. n' _( P  G$ Z, p4 W7 I        玩具模拟器对这个程序最后一行的“指令”是这样解读的:给一个存储器位置命名,然后在程序运行前放进去一个值。之所以需要这样做,是因为程序要计算很多数的和,而且累计和的初始值必须从零开始。( p' f/ O, A# w9 N" z/ U5 X
        
; V4 ~5 `7 Y% C5 ~        怎么检验这个程序,确定它没问题呢?表面上看没有问题,但有些问题很容易被忽视,所以有必要进行系统的测试。注意这里说的是“系统的测试”,并非随便给程序输人几个值。
1 t0 P# K8 O7 R/ Y
; r( t) J6 ~/ o        最简单的测试用例是什么?如果根本没有要相加的数,除了用来终止输人的零,则和应该为零,这就是第一个测试用例。然后要试试只输人一个数,而和就应该是那个数。接下来可以试试两个数,这两个数的和你是知道的,比如1加2等于3。此时,基本上就可以确定程序没有问题了。假如你真用心的话,通过一步一步地仔细过几遍指令,就可以在程序上机之前完成对代码的测试。优秀的程序员无论写什么都会自己先做这种检查。" n- |* a0 C% W# S: C6 W, i2 A
5 Q* m0 ]5 p5 i9 g" i/ ]
        到目前为止,我们一直没有讨论指令和数据在RAM中是如何表示的。说一种可能性吧,比如每条指令都需要一个存储器的位置存储其数值代码,而在该指令引用存储器位置或有一个数据值的情况下,还需要另一个紧随其后的位置。也就是说,IFZERO和ADD等指令因为引用了存储器位置,所以要占用两个存储器单元,其中第二个单元中保存的是它引用的位置;同样假设数据值也要占用一个位置。这是一种简化,但实际情况也差不太多。最后,假设各个指令的数值代码(按它们在前几页中出现的先后顺序)分别为:get=1、print=2、store=3、load=4、add=5、stop=6、goto=7、ifzero=8。
& `$ v% h1 [6 O8 Q) k" V        
) U/ J2 a( d6 L& F        现在,我们来看看前面计算一系列数之和的程序。在程序刚开始运行的时候,RAM中的内容如下图所示。图中也给出了为三个存储器位置指定的名字,给出了指令以及存储器单元的地址。
% @" O$ W3 |% B, y; B4 a, o        
# Z3 B, d0 C! `. {. U
计算机扫盲贴|第三章_深入了解CPU QQ截图20170115180947.png

% p* @% v; l  q        前面的玩具模拟器是使用JavaScript写的,第7章将介绍JavaScript。扩展这个模拟器很容易,就算你以前从来没见过计算机程序,也可以给它添加一条乘法指令,或者其他的条件分支指令。9 G$ S; U4 l; e8 {! p; {& R
  L  s6 d9 p: S6 e" F
        3.2真正的CPU" V5 V9 C3 N9 {) n
        
( O; y9 h: d1 }) p/ x2 N5 w        CPU反复执行简单的循环:从存储器中取得下一条指令,该指令正常情况下保存在存储器的下一个位置,但也可以是使用GOTO或IFZER0指定的位置;对指令进行译码,也就是搞清楚这条指令要干什么,然后为执行该指令做好准备;执行指令,从存储器中取得信息,完成算术或逻辑运算,保存结果,总之是执行与指令匹配的组合操作;然后再从头取得指令,开始下一次循环。真正的处理器也执行同样的“取指令一译码一执行”循环,只不过为了加快处理速度,还会配备精心设计的各种机制。但核心只有循环,与前面重复把数值加起来的例子一样。
* b6 O$ A4 r- @4 Q3 E" W6 v+ H        " z& J) u" e; E/ o
        真正计算机的指令比我们玩具计算机的多,但性质相同。比如,有更多移动数据的指令,更多完成算术运算及操作不同大小和类型数值的指令,更多比较和分支指令,以及控制计算机其他组件的指令。典型的CPU有几十到数百个不同的指令;指令和数据通常要占用多个内存位置,通常为2至8个字节。真正的处理器有多个累加器,通常是16或32个,所以可以保存多个中间结果,而且都是速度极快的存储器。真正的程序与我们的玩具示例相比可谓庞大,有的甚至多达数百万条指令。至于如何编写这么大的程序,本书后面有关软件的章节会详细讨论。
! [' m  R+ v6 X7 A  C; D        
( G6 I( X1 ~. w9 V        计算机体系结构是研究CPU与其他计算机组件连接的一门学科。在大学里,它通常是计算机科学和电子工程的交叉领域。1 z1 F1 Y* O, @0 x9 N5 o1 S9 A
        ( F+ ^7 I1 D, Q6 N  G
        计算机体系结构研究的一个问题是指令集,也就是处理器配备的指令表。是设计较多的指令去处理各式各样的计算,还是设计较少的指令以简化制造并提升速度?体系结构涉及复杂的权衡,要综合考虑功能、速度、复杂性、可编程能力(如果太复杂,程序员将无法利用其功能)、电源消耗及其他问题。用冯·诺依曼的话说:“一般来讲,运算器内在的经济性取决于期望的机器运行速度……与期望的简易性或低价位之间的折中。”, Y6 o4 N' ?# w! s" M
        
( L6 Y* F" V$ N" K; i        CPU与RAM和计算机的其他组件是如何连接的?处理器非常快,通常执行一条指令只需要零点几纳秒。(1纳秒等于十亿分之一秒,或者10^-9秒。)相对而言,RAM则慢得让人难以忍受一从存储器中取得数据或指令大概要花25到50纳秒。当然,这里的快指的是绝对速度,而慢则是相对于CPU而言。假如CPU不必等待数据,那它可能早就执行完上百条指令了。
+ }. q7 i( t( W* h        
3 l  X$ u+ [7 x+ P3 V- I) ^        现代计算机会在CPU和RAM之间使用少量的高速存储器来保存最近使用过的指令和数据,这种高速存储器叫作缓存。如果可以从缓存中找到信息,那么就会比等待RAM返回数据快得多。下一节我们会详细介绍缓存及缓存机制。: f3 B! o$ i- ?8 C  l; Y% S
        
' _- I2 n# p5 ?2 {4 A        设计师在设计体系结构的时候也有一套方法,能够让处理器跑得更快。比如,可以把CPU设计为交替地取得和执行指令,而同一时刻会有几个指令处于执行过程的不同阶段,这种设计叫做流水线。(与汽车装配线很相似。)结果呢,虽然某个特定的指令仍旧要花同样的时间完成,但其他指令都有机会得到处理,从整体上看完成这些指令则会快很多。另一种方法是并行执行多条互不干扰、互不依赖的指令,就相当于多条平行的汽车装配线。有时候,只要指令的操作不会相互影响,甚至可以不按顺序执行。\# J: v" m6 Y+ V; Y1 x3 w
        & c& G) w, u9 R. Q; x
        另外一种可能是同时运行多个CPU。今天的笔记本电脑,甚至连手机都已经有多个CPU了。英特尔酷睿双核处理器在一块集成电路芯片上集成了两个CPU(“核心”)。在一块芯片上集成越来越多的处理器已经成为明显的趋势。由于集成电路特征尺寸越来越小,因而可以集成在一块芯片上的晶体管数量必将越来越多,这些晶体管可以构成更多CPU,也可以构成更多缓存。3 G3 A; B' l2 x  y3 K
        0 u0 O# j+ z/ [. m" z$ Y& A$ L
        处理器应用的领域决定了设计者要权衡哪些要素。很长时间以来,处理器主要的应用领域是桌面计算机,而桌面环境下的电源和物理空间都比较充足。因此,设计者只要专注于让处理器尽可能地快就好了,电源是用之不竭的,而散热只要多加风扇就行。笔记本电脑要求的权衡要素有了明显不同,一方面空间有限,另一方面在不插电的情况下,笔记本要靠沉重又昂贵的电池供电。其他方面条件不变,笔记本处理器必然要相对慢一些,耗电少一些。
+ n0 M# }& r6 O7 Y. u+ S! M; p# W        
1 B8 N; A# r/ B( n, O! N        手机和其他超轻便设备进一步提高了设计要求,因为尺寸、重量和电源各方面都有了更多限制。此时,单靠小范围调整设计是行不通的。虽然英特尔是台式机和笔记本处理器的主要供应商,但几乎所有的手机都使用“ARM”处理器,因为它耗电更少。ARM处理器是指获得英国ARMHoldings公司许可制造的处理器。9 S% p2 u( s- g/ P( B1 |5 B, s. s" n: Q
        ' ~) Z# q& _( J% V# I( e" S/ `" e! f$ r
        比较不同CPU的速度并不是特别有意义。即便是最基本的算术运算,其处理方式也可以完全不同,很难直接比较。比如,同样是计算两个数的和并保存结果,有的处理器需要用三个指令(比如我们的玩具计算机),有的则需要两个,而有的可能只需要一个。有的CPU具有并行处理能力,或者说能够同时执行多条指令,从而让这些指令在不同阶段上执行。为了降低处理器的耗电量,牺牲执行速度,甚至根据是不是电池供电动态调整速度都是很常见的。对于某个处理器比另一个处理器“更快”的说法,不必太当真,因为很多情况下都要具体问题具体分析。
" A8 L- ~  b2 q) `4 g9 V+ \        ) J) j. A, v/ |, e
        3.3缓存
1 o7 \; M- ~) u( `0 u& D( U! x        : F5 y1 b4 y& R# ^1 t
        说到这里,有必要花点时间简单介绍一下缓存,这是一个在计算领域中广泛适用的思想。在CPU中,缓存是容量小但速度快的存储器,用于存储最近使用的信息,以避免访问RAM。通常,CPU会在短时间内连续多次访问某些数据和指令。例如,加法计算程序循环体中的多条指令,对每个输人值都要执行一遍。如果这些指令存储在缓存中,就不用在每次循环时都从RAM读取它们,这会让程序的速度快50倍。类似地,把Sum存储在数据缓存中也能提高访问速度。- a$ y$ ?. W( H" `9 y3 c: W. D
        
4 O5 \) a) Q2 _6 l- D7 u; j4 K* e        典型的CPU有两到三个缓存,容量依次增大,但速度递减,一般称为一级缓存、二级缓存和三级缓存。最大的缓存能存储以兆字节计的数据(我的Macbook有3MB的二级缓存),大多数CPU的指令和数据缓存都是独立的。缓存之所以有用,关键在于最近用过的信息很可能再次被用到,而把它们存储在缓存里就意味着减少对RAM的等待。缓存通常会一次性加载一组信息块,比如只请求一个字节,但会加载RAM中一段连续的地址。因为相邻的信息也可能被用到,要用的时候它们同样已经在缓存里了,换句话说,对邻近信息的引用也不需要等待。! H" [. C! r( Z& C
        
: l5 S0 K! `  I6 m7 x        除了发现性能提升之外,用户是感受不到这种缓存的。但缓存的思想却无处不在,只要你现在用到的东西不久还会用到,或者可能会用到与之邻近的东西,那运用缓存思维就没错。CPU中的多个累加器本质上也是一种缓存,只不过是高速缓存而已。RAM也可以作为磁盘的缓存,而RAM和磁盘又都可以作为网络数据的缓存。计算机网络经常会利用缓存加速访问远程服务器,而服务器本身也有缓存。
7 v$ ]' [: h9 A3 ^- S        
" m% e" X& G( f1 m' c4 W        在使用浏览器上网的时候,你可能见过“清空缓存”的字眼。对网页中的图片和其他体积较大的资源,浏览器会在本地保存一份副本,因为再次访问同一网页时,使用本地副本比重新下载速度快。缓存不能无限地增长,因此浏览器会悄悄地删除旧项目,以腾出空间给新的,它还给你提供了删除所有缓存内容的命令。  O& m7 n0 j2 J' F
        ) ^# z8 b" E0 m* _; p/ b# b. F. y
        你自己随时可以检验缓存的效果。比如可以做下面两个实验,一是打开Word或Firefox等大程序,看看从启动到加载完成并可以使用要花多长时间。然后退出程序,立即重新启动它。正常情况下,第二次启动的速度会明显加快,因为程序的指令还在RAM里,而RAM正在充当磁盘的缓存。使用其他程序一段时间后,RAM里会填满该程序的指令和数据,原先的程序就会从缓存中被删除。% x9 g- w2 |, h; m+ i  l
        
- k# ^! t* O6 d( `        二是在谷歌里搜索几个不太常见的单词或短语,注意谷歌查询结果要花多长时间。接着再搜索同样的关键词。返回搜索结果的时间会明显缩短,因为谷歌已经在其服务器上缓存了搜索结果。这个缓存对其他搜索相同关键词的人也有好处,因为缓存在谷歌的服务器上,不在你的机器里。要验证缓存在谷歌服务器上,可以在你搜索完之后,让别人在他们自己的计算机上搜索同样的关键词。虽然不能完全保证,但一般来说第二次搜索速度会快很多。5 e4 q2 c( ~7 C
        2 Z  s0 \4 f6 J9 q$ I2 U4 ^
        3.4其他计算机& {* n, k7 M2 y0 v3 U/ r) F

# L4 @' P: r2 {) n: o+ k        人们很容易认为计算机不是PC就是Mac,因为那是我们最常见到的。实际上,还有很多其他类型的计算机。这些计算机无论大小,都具有相同的核心特性,即都能完成逻辑运算,并且都具有类似的体系结构,只不过在设计的时候会不同程度地考虑成本、供电、大小、速度等因素。手机和平板电脑也是计算机,它们运行操作系统并支持更加丰富多样的运算环境。比这还小的系统是嵌人式系统,日常生活里能见到的几乎所有数字设备里都有嵌人式系统,比如数码相机、摄像机、GPS导航系统、家电、游戏机,等等。/ I# z( }0 P* O. m: F! G
        ' ^& I0 m" L) N& n+ ^2 R
        更大的计算机在很多年前就已经实现多个CPU共享内存了。如果能把大任务分解成小任务,而分解后的小任务又可以通过不同CPU协作完成,CPU相互之间不会出现太长的等待,也不会有太多的相互干扰,那么就能以这种方式加快完成大任务。除了在大型系统中广泛应用,这种集成多个处理器的多核芯片在个人计算机中也已经司空见惯,而且未来很可能会普及。! ~; Z, |) @4 `! j
        
4 {3 q+ v+ T: R* ]        超级计算机往往有大量的处理器和大量的内存,这些处理器本身可能带有一些特殊指令,在处理某种数据时,它们比通用的处理器速度更快。今天的超级计算机通常是高速计算机集群,CPU仍然是普通的CPU,并没有什么特殊的硬件。网站top500.org每六个月就重新公布一次全世界最快的500台计算机。最快速度的纪录不断被打破,几年前还能跻身排行榜前几名的计算机,今天可能已经在榜单上找不到了。2016年6月最快的计算机有一千万个CPU,每秒可以执行9.3x10^17次数学运算。6 _+ ^( T1 ~3 Z5 c- v
        
# F7 [% H: `, m1 k4 d8 g, Y        分布式计算指的是很多更加独立的计算机(比如不共享内存),而且地理上更加分散,甚至位于世界的不同地方。这样一来,通信更加成为瓶颈,但却能够实现计算机之间的远距离协作。大规模的Web服务,比如搜索引擎、在线商店和社交网络,都是分布式计算系统。在这种系统中,数以千计的计算机协作,可以为海量用户迅速地提供结果。
( B  P2 \6 k' V7 X        ) f  G( W! A) r  h0 ?( d0 u
        所有这些计算系统都有相同的基本原理。它们都使用通用处理器,可以通过编程完成无穷无尽种任务。每个处理器都有一个有限的简单指令表,能够完成算术运算、比较数据、基于前置计算结果选择下一条指令。不管物理结构的变化让人多么眼花缭乱,它们的一般体系结构从1940年代至今并没有太大的变化。
! @: w, E& q4 Y* ]# n        
4 F! W8 Q. R' H- a        或许很难想象,这些计算机都具有相同的逻辑功能,可以完成一模一样的计算(暂且不论对速度和内存的要求)。1930年代,这个结果就已经被几个人分别独立地证明过,其中包括英国数学家艾伦·图灵。对于非专业人员,图灵的手段最容易理解。他描述了一个非常简单的计算机(比我们的玩具计算机还简单),展示了它能够计算任何可以计算的任务。他描述的这种计算机,我们今天叫做图灵机。
0 L) L9 I: E9 A  L6 T% q" m3 O7 z2 }% h' B: j0 v5 C% P
        然后,他展示了如何创建一种图灵机,模拟其他图灵机,这种图灵机现在被称为通用图灵机。写一个模拟通用图灵机的程序很容易,而写一个程序让通用图灵机模拟真实的计算机也是可能的(尽管不容易)。实际上,从能够计算什么的角度讲,所有计算机都是等价的,尽管运行速度明显不可能等价。9 k% e6 X& ^4 s8 B9 _
        
  F( p! ?1 _7 M* D* n        第二次世界大战期间,图灵从理论转到实践:他领导开发了用于破译德军情报的计算机。1950年,他发表了一篇名为“计算机器与智能”(Computing machinery and intelligence)的论文,其中提出一个测试(即今天所谓的图灵测试),人们可以通过该测试来评估计算机是否能表现出人类的智能。想象一下,一台计算机和一个人,通过键盘和显示器与另一个提问者交流。通过问答,提问者能确定哪个是人,哪个是计算机吗?图灵的想法是,如果不能明显地将二者区分开,那么计算机就表现出了智能的行为。2 _3 R) |" e, Z$ O
        
0 k: z* [# Q: F7 E- x6 W        缩写词CAPTCHA中包含图灵的名字,这个缩写词代表“Completely Automated Public Turing test to tell Computers and Humans Apart”(用以区分计算机和人的完全自动化的公共图灵测试)。CAPTCHA(可以理解为“验证码”)就是一些扭曲变形的字母,广泛用于验证网站的用户是人而非程序:" y2 }$ c- W& g# I5 t
6 O( S: C) ?- k8 U- k$ a$ O! h* m. Q: R6 i
计算机扫盲贴|第三章_深入了解CPU QQ截图20170115205545.png

% r' a5 J! v) W1 l  f        CAPTCHA是一个反向图灵测试,因为它利用了人比计算机更擅长识别文字这一特点,来达到区分人和计算机的目的。图灵是计算机领域最重要的人物之一,他对人类理解计算做出了重大贡献。计算机科学领域的诺贝尔奖一图灵奖,就是以图灵的名字命名的。后面几章将陆续介绍一些获得过图灵奖的重要计算机发明。
/ W. D8 t2 ?8 L7 r, f
0 j- |$ @% A9 l/ s0 K
#f470:
        / g! N/ Y1 o, [' o' Y- _, m
        硬件部分小结
" w6 U/ s& j7 \: d3 [: {) h        " f9 w% g7 f, \4 E$ z7 ]) q
        关于硬件的讨论结束了,但后面偶尔还是会提到一些装置或设备。以下是你应该通过这一部分掌握的基本概念。
/ l$ x. X3 K' H6 s, n3 T9 f2 Y        
/ k* X; \% `7 K/ P" c! P% m        数字计算机包含处理器和存储器。处理器执行简单的指令,速度非常快。它可以根据早先计算的结果以及外界的输人,决定接下来做什么。存储器包含数据和处理数据的指令。3 y6 |% p* i/ y
        + z2 l" w) u( c( q8 _
        计算机是一种通用的机器。它从存储器中读取指令,而人把不同的指令放到存储器中,可以改变它要执行的计算。指令和数据要通过使用场景区分,一个人的指令可以是另一个人的数据。
! q5 w5 R7 O5 ?4 F        . z4 R# U5 ]( `& l6 c
        图灵的结论:从能够执行完全相同的计算的意义上说,这种结构的所有计算机(包括你以后可能会看到的任何计算机)具有完全相同的计算能力。当然,它们的性能可能千差万别,但在不考虑速度和存储器容量的前提下,它们的能力则是等价的。最小最简单的计算机也能够完成大计算机所能完成的计算。  Y5 U: D  e" }) L0 b3 D6 ]/ d3 t* {/ r

4 M1 z2 |' V7 r: g. z# L        的确,可以通过编程让任何计算机模拟其他计算机,而图灵正是这样证明了他的结论。
1 |3 E# M' X, J( `2 g2 p" |( e        
6 \2 e- E1 ]$ b1 l; q/ R; k        计算机的逻辑结构自冯·诺依曼之后并没有太大改变,但物理结构已经发生了巨大变化。摩尔定律已经应验了大约50年,成为迄今为止几乎完全兑现的预言。摩尔定律预言了在既定的空间和成本之下,个别器件的大小和价格会呈指数级下降,而它们的计算能力呈指数级増长。
" `& Q0 r/ x8 d. w        8 D9 g6 \7 g; p: ?
        还应该提到一个最重要的主题,即它们都是数字计算机:所有一切最终都要化简为比特,单独或成组地以数字形式表示信息,所谓信息可能是指令也可能是数据。这些比特的含义取决于它们的上下文。可以化简为比特的任何事物,都可以通过数字计算机来重现和处理。
5 S( g# V; n- n& A8 n9 f6 c% J        
5 B% m/ X4 V3 E( o8 ]5 O        海量的数据让计算机有可能代替人去完成一些通常只有人才能胜任的工作。不同语言间的翻译就是一个非常明显的例子。/ _- t) d( @, Q' d
; L4 u( t3 X) P" `+ h6 a3 }$ q( b
计算机扫盲贴|第三章_深入了解CPU QQ截图20170115213043.png
        & J- s/ z* e1 R" N- p, F
        从某种角度讲,互译结果相当不错,甚至还考虑到了一些语法问题。然而,翻译过程忽略了一个谈论计算机时至关重要的事实,即“比特”bit)并不等同于“碎块(piece),而“化简为比特”(reduced to bits)与“切分成碎块”(cut in pieces)的意思也完全不同。类似的结论同样适用于今天的语音识别、面部识别及其他图像处理:计算机可以做得很出色,但没人会说它们的能力可以与人类比肩。顺便说一下,如果你再试一次,翻译的结果又会不一样,其算法和底层的数据好像变化很频繁。1 y) Q% m( D# _" }2 w
        
7 o/ {4 A% I: r; u# q6 `) k        计算机可以下出特级大师水平的国际象棋,但在人脸识别上却不及幼儿。早些时候,计算机下国际象棋的水平其实很烂,但随着机器的速度不断加快,它下棋的水平明显提高,但这一切几乎完全是因为它比人类对手能够多看几步。类似地,语言翻译、语音识别等领域最大的进步,主要还体现在庞大的数据量(比如不同语言的平行文本数量),而有了这些数据计算机才能接近人的表现。
0 W* i: e7 c$ u# _6 d- R        * T  s% E& c# @+ l$ |( a% v0 y  E
        2011年2月,广受欢迎的电视节目Jeopardy发起了最强的两位人类参赛者与IBM的Watson计算机系统之间的对决。Jeopardy智力问答需要掌握大量的事实性知识,还要求能够处理双关语、省略句、松关联,以及具备其他语言能力。公平地说,Watson彻底打败了人类。图灵测试想做的,就是在隐身、忽略响应时间等因素的前提下,通过对人和计算机提问,看看能否区分哪个是人,哪个是计算机。阅读Jeopardy电视节目的文字版,你很难区分人类和计算机。( Y7 {, J' M7 [5 O7 w2 W, X- g2 s
        6 ?! S2 D+ C+ t! l
        尽管如此,我们还是有太多太多的事物不知道怎么用比特来表示,更不必说怎么用计算机来处理了。比如,日常生活中最重要的一些事物:艺术、创意力、真理、美、爱、荣誉和价值。我想在一定的时期内,这些事物仍将超出计算机的能力之外。如果你碰见了一个人,声称知道怎样“通过计算机”处理这些东西,那你可不要随随便便就相信他。. g7 x. n1 a( P1 y
上一篇
下一篇

评分

参与人数 1成长值 +1 金币 +1 展开 理由
居高声自远 + 1 + 1 很给力!

查看全部评分

帖子热度 1.1万 ℃

小执念 古黑浩劫论坛大牛 2017-1-15 22:29 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员 五周年纪念
唉,一个人的论坛#j347:
15548085 「初入古黑」 2017-2-27 23:45 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

并不是一个人哦·谢谢你的扫盲·我会坚持到底
15548085在路边丢垃圾被发现,被罚款2 个 金币.
hoioh 「初入古黑」 2017-3-2 14:57 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

我也再看,只不过看的不是很懂,一章内容会来来回回的看几篇,看的很慢!
hoioh胡乱攻击他人电脑被抓,保释金 1 个 金币.
黑啤 「初入古黑」 2017-6-2 17:21 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

哈哈,我也来顶一下,不算灌水哈
血夜的风 「初入古黑」 2017-6-10 13:45 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

感谢楼主扫盲贴!
血夜的风在论坛发帖时没有注意,被小偷偷去了 1 个 金币.
暮色里的白雪檐 「出类拔萃」 2017-9-14 10:48 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

这么整齐的十五个字人家最喜欢了* C; a6 E& R$ A4 k- K
安心的味道 「锋芒初露」 2018-5-14 11:56 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

          ⚠内容无法访问2 ^2 x1 O: E% ?* x  i
        ━━━━━━━━━━━━━━━/ }7 `) _  I) O* D& K+ B( U
当前网络不可用,是否尝试连接无线网络?3 U7 q3 w. ^& P' |; W
——————————————————
3 _: T& n) E: w# C  T/ @$ F     ✗ 取消   │  ✓ 确定
夏雨初晴 「出类拔萃」 2018-5-14 17:50 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

楼主,我现在有些冷静下来了,我觉得应该做一些实际的事情。我决定先把你的名字纪录下来。让子孙后代牢记于心,广为传诵。让他们知道什么是中国的传统美德,什么是炎黄子孙的精神,什么是黄河水,什么是长江魂。什么是五千年的文明史.
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表