只要你还记得我,我就会一直在你的身边。 收藏本站
登陆 / 注册 搜索

阅读: 8.9K   回复: 2

CPU的自述

[复制链接]
仗剑天涯论坛大牛 2017-7-6 23:50 |显示全部楼层

今生相逢便是缘分,何苦去怨恨,何苦去仇视。

主题破百
        上帝把我制造出来,给我了一个很小的脑容量,为数不多的寄存器能临时的记一点东西,但是上帝给我打开了一扇特别的窗户,那就是像阿甘一样,跑的飞快。+ W  \0 }3 V$ O6 n2 r! u

5 z! @9 H. [$ Q: f        到底有多快呢?我这么比喻一下吧,我的工作都是以纳秒为单位的,你们人间的一秒,我可能已经做了1000,000,000(10亿)次动作了。
4 S5 e; N+ V& D  ~- u
" O( @- o, R3 ?1 b) n5 F* f, U1 |
CPU的自述 cpu-floating.jpg

+ o: ]$ f# j1 r5 r: F1 N# ~, T0 q        相比而言,内存比我慢100倍,硬盘比我慢1000多万倍,你说我快不快?
1 y8 y6 j. y2 E6 m' s& j/ Q       
( x1 F; n- e9 e1 ]: c$ H
启 动

6 L. }3 b. T: Z# _6 o0 ], t0 _* i5 h        我住在一个机箱里,每天早上一阵电流把我叫醒,还夹杂着嗡嗡的声音,我知道我忠实的护卫电风扇又开始工作了,我特别怕热,又运行的飞快,如果没有电风扇给我降温,我很快就会生病,生病的后果很严重,那就是我的伙伴们像内存了,硬盘了。。全部都要罢工了,没有我这个系统就会陷入的一片死寂。* F1 S+ R9 m1 F% F" u' |* G* M
6 Z8 ~4 E# o( z. z9 P1 F3 t
        我听说有些CPU的福利很好,竟然待在恒温恒湿,一尘不染的托管机房里,让我好生羡慕。
) x: n  l% ]# M; Y( |) \
# u* f8 u4 [5 Q5 n        我的脑容量很小,所以醒来后只想起了我的创造者告诉我的几件事情:
- N8 M; K' J/ Y+ F' B" @6 m        * C- t7 }/ l% ?+ b6 `  Y: \- I
        1.你的工作就是运行指令
* @; w+ g& U. \7 X4 |. W        2.你不能保存指令,你的指令全在内存里
& h8 M" r; F* d* m3 Z1 a; Q7 k, h1 {        3.你的第一条指令在内存的最顶端处0xFFFFFFF0
4 ]; f1 G& s& l4 Z) r% E7 G( f. X$ Q3 T; Q2 N) d% B. O7 K
CPU的自述 cpu流程图.jpg
# [4 A( e2 }' q+ S# z3 E% ^
        那还有什么可说的,赶紧打电话给内存要指令,电话通过系统总线,还得通过I/O桥电话局需要转接一下,再通过存储总线接通内存。
- |" i' z' o* Q4 q: X" T3 l3 O' ]7 |- u2 }
        "哥们,把这个地址处的指令给我说一下吧"' K" S' d/ `2 `6 ]0 i
( v+ n. i  R: X% c7 u5 U
        "你是谁?"内存竟然把我忘了,当然,他断了电和我一样,失忆了。#j347:
  {# ^% |  O. q) Y# ~$ v1 \0 S& s' C0 g# i. o
        "我是阿甘啊,我们经常聊天来着,你忘了?"0 @+ P; d8 |) w; E2 @" Y8 w  B
; O8 x7 h" z1 ~7 F& `  h
        内存磨磨唧唧半天才把数据发了过来(比我慢100倍啊),这是一条跳转指令,我立刻回忆起来了,这是我的老朋友BIOS等着我去运行他那一堆指令呢。6 k* Q9 u4 Z" K' C1 j

( u' R: o/ M0 Y' W) x        我给BIOS打电话:“老弟,今天干点啥?”. g7 A# W+ b( H+ L

# W) J" V' {( S" W1 W; M. o        “阿甘,早上好"BIOS从不失忆,把所有人都记得清清楚楚“还不是老一套啊,无非做一下系统的自检,看看内存,硬盘,显卡等这些老伙计们有没有问题,有问题的话用小喇叭提示一下主人”- m* \4 P' A" W9 k
# b# Q% V9 p3 X' k' F* {8 J2 i+ f
        这些过程我已经轻车熟路了,很快搞定,像往常一样,没有问题,我还把一个叫做中断向量表的东西给弄好了,我知道一会而要用# K8 E) h; w) B. Q6 n2 t
* m6 d# W: }9 S8 B1 u* X* c
        这些东西都搞完了,BIOS果然告诉:"阿甘,int 0x19"% j2 C) [7 p7 C9 N$ b8 p, w
; Z1 T0 q* v& v* Z" \) D7 J: u# d
        我赶紧去刚弄好的中断向量表中去查第19号,顺藤摸瓜又找到对应0x19的一大堆指令。
- {/ z' M" p# B9 L( @- y3 ]# |: C* W6 N( ^% V  [5 j% B6 z
        执行吧,这堆指令把将磁盘的第一扇区(磁盘最开始的512字节)运到内存的0X0000:0X7C00处,然后我就从此处接着执行。
8 u8 Y7 c" B* Y5 C- s( w
+ d) B- }: O2 j. e* v/ e  ~: I        我想起来了,接下来有一大堆精巧的指令把迷迷糊糊的操作系统从硬盘中唤醒,运输到内存中来。(此处实在是复杂,略去10万字。。。。)
! b$ X* }: p! [/ u; w
) p4 h- t$ z# A( N( r        你看这就是为啥他们叫我阿甘,我做事飞快,但非得别人告诉去哪里执行才行,要不然我就只会坐在那里无所适从。$ c# @* e# Q) j& ~- b- R7 o# D- t
       
5 }# q- Q3 r9 F" k3 M1 d3 S2 |
运 行

) [! n7 L: u* v/ U! n* R0 ?        操作系统一旦进入内存,立刻就是老大,所有人都得听他指挥。我也发现我的周围出现了一个屋子:进程屋。屋里堆着一大堆东西,什么进程描述信息包裹了,进程控制信息包裹了,我都不太关心,我只关心最最重要的两件东西:
$ B3 h/ f0 Z6 W& ~' ]  O* v' g        8 L8 K6 {% j. M) j. F2 h1 l
        1.我工作必备的寄存器,就放在我面前的工作台上。
" G/ \  s: x1 W7 a6 [7 n        2.程序计数器,我用它记住我要执行的下一条指令地址。. n  x& o' u( r3 Q, P
" c9 r6 `( A( H: u
        "阿甘,别来无恙啊",操作系统对我还是挺不错的,先给我打招呼。) q( h( r* y% f1 m

7 `- e, n2 E: U! b$ m  k        "Linux老大,今天有什么活啊",我每次都表现的积极主动。: f( C) z3 k) A1 |& \

+ U) n2 L0 L* k" a" M' p' C        "来,把这个hello world程序给运行了"。6 S! ]7 o3 |$ S' |
7 g, L9 j1 K5 a1 p5 }7 T0 Q' E
        Hello world程序还在硬盘上睡着呢,得先把他也装载到内存里,要不然我怎么执行啊。于是我就拿起电话打给硬盘,电话通过系统总线来到IO桥电话局,再转接到IO总线,这才来到硬盘这里。
9 b1 b# q) N* u
9 V% O" h7 @& H1 Y        我在电话里请他把数据给我运过来,然后我就无所事事的坐在那里等。Linux老大立刻就怒了:阿甘,告诉你多少次了,你小子怎么还在等硬盘给你发数据!#j332:- v& T" x# @5 ^% S" U8 p% _% ~* S
* P, w& ?9 A( v9 ?& m+ r
        是的,我忘了一件事,硬盘比我慢太多了,我执行一条指令大概是1ns,在用来读磁盘的16ms里,我能潜在的执行1600多万条指令啊。
; v) }; |+ B0 f8 c( g& H+ W# m6 f' a2 F& b; D$ r
        我感到深深的愧疚,赶紧拿起电话打给硬盘:哥们,按我们之前商量好的,用直接内存访问(DMA)啊,你直接把数据装载到内存吧,不用经过我了,装载完成以后给我发个信号。
6 X$ b. b$ O6 h7 r" N! Y+ O
( B; _$ [- j" F+ v6 P& z/ I        "这还差不多"!Linux老大心情好了些。7 o, H5 M6 ~) @: r
        8 E* ?( i3 T) w$ t+ E
        “阿甘,数据还没来,别闲着,这有一个菲波那切数列数列,来算一下吧”。& F% X, m- f1 r  y6 i& j6 y$ j
' T6 _. Q5 M6 j/ j: H
        "肥波纳妾数列?这名字好古怪,老大,其实你也知道,我脑子小,懒得去理解那是啥意思,你把进程屋切换下,把程序计数器设置好,指向下一条指令,我一条条指令执行就得了“我挺没追求的。
& J# {: X" }. N! C
2 u6 ~# i' {+ {) d, V. F8 t4 l: i        "真是个阿甘啊!”老大感慨到。7 d! n! {" y% v; O; l, o1 A

( c2 z! C: M) Z  r. G+ \        我所处的进程屋立刻发生了变化(当然,这也是我辅助Linux老大干的),各种包裹的信息都变了,尤其是寄存器和程序计数器。8 x/ R5 p. [- {' m8 ?

, d! c% o' f1 R! _6 t: ]        于是我就开始计算这个什么纳妾数列,但是这个数列似乎无穷无尽,哪个无脑子的程序员写了个无限循环吧。正在这时,我便收到了一个电话,说是Hello world的数据已经装载到内存了,让我去处理。
3 Z4 p$ B. T. v8 ?( `3 [! [6 K1 u+ ]
        我放下手中的活,保存好现场,就去处理那个Hello world,果然数据已经都好了,那就切换过去运行吧。其实老大并不知道,任何人,只要你运行了相当多的数量的指令以后,你都能悟到这些程序的秘密。* I$ y6 d$ ?4 t5 H
       
6 K$ P) [; E# s+ y) c7 I        我CPU阿甘虽然傻傻的,但也架不住执行这数以万万亿的指令给我的熏陶啊。这个秘密就是:程序都是由顺序,分支,循环来组成的。其实分支和循环在我看来都是跳转而已。4 m8 p" @# f2 v; J( c; C

, w/ H  @+ A: d: [/ c4 {0 U: ?- @        所以我的工作就是打电话问内存要一条指令,执行这个指令,如果是个跳转指令的话,我就问内存要跳转的目标地址的那一条指令,继续执行,生活就是这么简单。+ J- z$ H' ~; }5 N) o
. t$ n1 ?1 |4 l8 B8 {: C$ S
        奥对了,当然也有复杂的,就是函数调用,我得和内存紧密配合才能完成。这个咱下回再说。
9 O* n8 H- y0 n* I; U        3 B2 k" Y: z) [$ P$ M& @
新 装 备——缓 存

& g% Y8 e4 {) e9 ~+ ~        提到内存,这真是我的好哥们,没有他,我几乎什么事儿都干不成,更重要的是他比硬盘快的多,读取一次数据,只需要100纳秒左右。这样我们俩说起话来就轻松多了。& }4 |9 j& C. f
& i* v7 K5 d# r, A
        每次他都说:"阿甘,幸亏有你给我聊天,要不然我肯定被活活的闷死不可,那个硬盘说话是在太慢了"' \. D8 q6 u- F

0 O) r3 S$ r7 g- O& f        "它为啥那么慢?"我每次都问。7 `) r5 W: z9 Z
- `  l( J7 a& ?. C; s( ]2 j
        "硬盘是个机械是的玩意,一个磁头在一碟高速旋转的磁片上挪来挪去,光定位就慢死了"。
2 c3 t4 g( C% `4 @
$ a% Y; j! {  z        "那主人为什么要用硬盘?"% s/ D0 C0 p/ m( U$ [" [* u" @
: O; H& x! L& q/ |4 `
        "人家虽然慢,但是不怕停电,哪像你和我,一停电全部都失去记忆了。"
# a* I! @2 Z/ J# K- T) |* E5 K3 |' W7 f0 A3 ^6 P' u
        确实是,人不能把好事都占全了啊。
+ L, s& i# z) I5 O  [+ ~% e: I& t  [* ~# M1 b0 O8 }/ j4 s6 h
        我的指令中有些完全用我的寄存器就能完成,但是有很多都需要读写内存的数据,再加上所有的指令都在内存中存着,虽然它只比我慢个100倍,但指令多了我还是有点受不了。' _& `; A0 B$ p8 x

+ M; z! ]! B$ |: o# V        我给内存说:"哥们,你能不能再快点!"
5 N4 e& G& U. L
7 B8 E, k1 n: i' q& \3 [* `; _) Z5 [        内存说:拜托,这已经是我的极限了,阿甘,你自己再想想办法吧!我给你说啊,我留意了你最近访问的指令和数据,我发现了个规律“。
- l% ^1 p! q; M5 k% |3 c; d( H, Z; i$ Z( v4 h; z! z( v
        "啥规律?"
9 V: ?/ T7 R( t5 ?
- V( G% ~- y% f        "比如说吧,你访问了我一个内存位置以后过不多久还会多次访问,还有,一个内存位置被访问了,附近的位置很快也会访问到"(这其实叫程序的局部性原理)。
7 J% v: p! y9 L% A# ?% _+ n" W
0 `: ?; F& ~" N+ A7 v+ e- G        我还以为是啥规律,其实我早就注意到了。% ]$ F$ a1 ]1 q" `6 y* R' B9 N
6 p( j/ b: W% y& `  c6 i1 ]
        "这有啥用啊?”" d3 w( d, R& X2 q! i
; R, w# k: F0 z" j' J2 x: k
        "既然你经常访问同一块区域的东西,你想想如果把这些东西缓存在你那里会怎么样...."
6 s! Q4 C5 R$ K# m+ w0 {- m, A2 _2 p3 z* r. T
        我一想有道理啊!加个缓存试试!  g, C, o2 x; R

3 J* r& ^- q1 D2 a3 P/ ^! e        从此以后,我每次读写指令和数据,都问缓存要,缓存没有才给内存打电话。
0 d3 r8 I3 b$ W6 H9 D) L
) l% f# a2 l$ o" A        果然,由于局部性原理的存在,我发现的确是快了不少啊。
- I( ^! ]7 M$ b+ j" q5 B2 x$ c4 q/ ^" D5 h
        当然也有缺点,那就是Linux老大在做程序切换的时候,缓存就会失效,因为两个程序之间没什么联系,局部性原理不起作用,所以需要重建缓存。" I  [: H6 c: y6 u; D8 G
% K7 P  q0 h& A* i# s$ [6 h$ F  V
自 我 提 升——流 水 线
' I( F$ c5 t) S# k& Z0 @
        缓存让我的工作更有效率,得到了Linux老大的表扬:"阿甘,我看你很聪明嘛,都会用缓存了"。& x6 E+ m+ L0 F4 ?  d9 X6 d: f( y+ G

" o4 I7 s" k$ X6 w! [6 Q        "我哪有那么聪明,都是内存的点子。老大,不过我学会了一个重要的东西:当你改变不了别人的话,抱怨也没用,还是先改变一下自己吧"。) Y# R9 O+ B; D9 s3 E: u4 _

* A, _/ J* q, H* _3 v& ^) u% j/ u        "挺有哲理的吗,希望你明天重启后还能想起来!#379:"
& l6 R, h' V; ^$ Z% M9 i! ^, ]0 ]" z( I) L7 P4 E  i2 A
        "我最近又发现了一个问题,正苦恼着呢,你看我有四只手,第一只手负责打电话问内存要指令,第二只手翻译指令,第三只手真正执行,第四只手有时候还得把结果写回内存。问题是,我发现经常只有一只手在忙活,其他都在闲着,你看第一只手取指令,其他手只能等着。第二只手翻译指令的时候,其他三只也得等“
* m& Y3 }( y2 X: v
/ Z" V' [& f/ x7 c        "看来以后我们不能叫你阿甘了,你已经开始思考了!#392:"
- m0 h0 I5 U% O2 D4 {, Z
8 A' ~& P4 P  [: J) T. [% L" a        “这问题好解决,给你举个例子,你听说过洗车没有?和你差不多,也是先喷水,再打洗洁剂,再擦洗,最后烘干,但人家的工作方式和你不一样,人家是流水线作业,你想想,一辆车在烘干的时候,后边是不是还有三辆车,分别在喷水,打清洁剂和擦洗,每个步骤都不会空闲。”, t- t6 t- y+ N5 S# j) Y( f

+ F1 ~+ z' |5 s. l. A) ^$ B/ x        "这么简单的道理我怎么都没有想到呢?我也可以搞个流水线啊,这样每只手都利用起来了"1 v( ^/ M2 w7 ?3 x% |

# U% _6 N# N' k        别人都说我们高科技,但其实原理都蕴含在生活之中啊。
# j! @! Q: P# Y$ d9 G, N- \3 }4 Q
+ P  K+ |4 k( u8 Z9 m: @$ k        有了缓存和流水线的帮助,让我的工作大大的加快了,大家都对我刮目相看。 他们想给我起个新名字:超人,不过我还是更喜欢他们叫我“阿甘”,多亲切。
" G* E+ g6 Z6 Z       
  `1 a' s9 g% }9 s1 G
尾 声
. n" A7 G3 r4 J7 Q! o/ N
        我一丝不苟,兢兢业业的运行指令,时不时和伙伴们聊天,很快一天就过去了,又到了晚上,我知道关机的时刻到了,赶紧挨个给他们道别。
& ?% v. l' s9 f+ J3 g1 k# o- C  R4 F8 E
        很快那些让我兴奋的电流消失了,风扇的嗡嗡声也没有了,我再也无法打出电话,整个世界沉寂了。明天将会是新的一天。: ?9 N& n' V( b2 I2 E; I3 ^2 r

' [6 m! e- c* [8 f9 a1 x3 b; ^4 F
上一篇
下一篇
帖子热度 8890 ℃
小执念乐于助人,奖励 2 个 金币.

故事,还未完、 「锋芒初露」 2018-1-20 22:41 来自手机 |显示全部楼层

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

顶起出售广告位#j325:
梦纸 「出类拔萃」 2018-1-23 07:43 |显示全部楼层

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

我水土不服就服你
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表