自身不先改变的话,一切都不会改变。 收藏本站
登陆 / 注册 搜索

阅读: 7.2K   回复: 2

CPU的自述

仗剑天涯论坛大牛 2017-7-6 23:50 |显示全部楼层

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

主题破百
        上帝把我制造出来,给我了一个很小的脑容量,为数不多的寄存器能临时的记一点东西,但是上帝给我打开了一扇特别的窗户,那就是像阿甘一样,跑的飞快。+ H' U. n0 X7 r* I+ \

6 W7 E0 o- Q& E5 Z' k  w0 J6 E        到底有多快呢?我这么比喻一下吧,我的工作都是以纳秒为单位的,你们人间的一秒,我可能已经做了1000,000,000(10亿)次动作了。
& f2 Z& k) ^- l1 ]) h& U. E) C% x# R; g. E1 y
CPU的自述 cpu-floating.jpg
  F( E0 e: b  O9 t$ D9 l) a+ J
        相比而言,内存比我慢100倍,硬盘比我慢1000多万倍,你说我快不快?7 D: c& t4 W) I, S- D" ~) f
        0 c3 G$ Y- q3 F
启 动

6 p9 ^$ B9 p3 I9 ~/ H/ V        我住在一个机箱里,每天早上一阵电流把我叫醒,还夹杂着嗡嗡的声音,我知道我忠实的护卫电风扇又开始工作了,我特别怕热,又运行的飞快,如果没有电风扇给我降温,我很快就会生病,生病的后果很严重,那就是我的伙伴们像内存了,硬盘了。。全部都要罢工了,没有我这个系统就会陷入的一片死寂。+ v* Q* t2 h% I1 y4 O
6 O- A: F" k/ v6 L
        我听说有些CPU的福利很好,竟然待在恒温恒湿,一尘不染的托管机房里,让我好生羡慕。
: f; g: _0 [$ ~0 Q# r# I5 l+ ]% A( n% T8 y( c3 X; }5 }
        我的脑容量很小,所以醒来后只想起了我的创造者告诉我的几件事情:. h6 v$ B$ K' B$ U0 R3 B4 X+ M
        $ g* Y) j) t5 Z& {' y* n0 M4 l. ^
        1.你的工作就是运行指令
$ w' a1 O4 ~  h" t  X, ^        2.你不能保存指令,你的指令全在内存里
+ a9 R) p' m; \+ G4 q        3.你的第一条指令在内存的最顶端处0xFFFFFFF0
+ v8 J4 L; T  i9 \1 r6 Y4 G, _% o8 m' b0 h
CPU的自述 cpu流程图.jpg

; J6 j7 @- ]7 H$ K! J        那还有什么可说的,赶紧打电话给内存要指令,电话通过系统总线,还得通过I/O桥电话局需要转接一下,再通过存储总线接通内存。3 V2 [) [6 n% J) T) R8 w0 ^9 A

" ~1 f0 W: t1 e+ S  S; z1 }        "哥们,把这个地址处的指令给我说一下吧"# ^* f4 x* _9 `; c& w" V; ?
3 O- @. }3 S. Z* R
        "你是谁?"内存竟然把我忘了,当然,他断了电和我一样,失忆了。#j347:
! a7 R: k% W% `( c0 u4 W, S+ t/ H$ ~9 H, e
        "我是阿甘啊,我们经常聊天来着,你忘了?"
2 ]: x( e- y6 L1 m' K$ T3 z( K/ G8 @! ]; K% G' a
        内存磨磨唧唧半天才把数据发了过来(比我慢100倍啊),这是一条跳转指令,我立刻回忆起来了,这是我的老朋友BIOS等着我去运行他那一堆指令呢。
4 j1 a* M% I" Z' M$ }3 [% P3 `
: Y  z* U6 ?9 [8 @3 V# ~; d        我给BIOS打电话:“老弟,今天干点啥?”
) {5 j. T, {8 E9 X* E
: x( \: }4 L4 C/ B. k" E% a5 d        “阿甘,早上好"BIOS从不失忆,把所有人都记得清清楚楚“还不是老一套啊,无非做一下系统的自检,看看内存,硬盘,显卡等这些老伙计们有没有问题,有问题的话用小喇叭提示一下主人”: R& G! ~% L  o) m
- P) M1 M4 e+ Q2 ~! X
        这些过程我已经轻车熟路了,很快搞定,像往常一样,没有问题,我还把一个叫做中断向量表的东西给弄好了,我知道一会而要用8 O1 o, H, b7 v4 a) }
7 o; g$ E5 u9 n& W
        这些东西都搞完了,BIOS果然告诉:"阿甘,int 0x19"; v4 I$ z: I/ f- ?* U. S

( e0 @" h# A7 {9 f# Q        我赶紧去刚弄好的中断向量表中去查第19号,顺藤摸瓜又找到对应0x19的一大堆指令。
# ^' A0 L, e' ^5 A+ m$ A7 N! R% }
9 i0 y- m; x; f; h7 {* d- w0 G" u        执行吧,这堆指令把将磁盘的第一扇区(磁盘最开始的512字节)运到内存的0X0000:0X7C00处,然后我就从此处接着执行。7 g+ ?2 k  U6 C. {8 E- q: Q0 _

2 T3 i- N: Y8 w        我想起来了,接下来有一大堆精巧的指令把迷迷糊糊的操作系统从硬盘中唤醒,运输到内存中来。(此处实在是复杂,略去10万字。。。。)
" A) }7 u% f! @
" l) d8 I9 g" N/ G        你看这就是为啥他们叫我阿甘,我做事飞快,但非得别人告诉去哪里执行才行,要不然我就只会坐在那里无所适从。
, d! F! f! a9 o" h4 |2 N+ Y       
7 k$ H( T3 f/ q3 P+ Y
运 行

0 e& v. G! r% @' B) Z( Q' K% l        操作系统一旦进入内存,立刻就是老大,所有人都得听他指挥。我也发现我的周围出现了一个屋子:进程屋。屋里堆着一大堆东西,什么进程描述信息包裹了,进程控制信息包裹了,我都不太关心,我只关心最最重要的两件东西:/ b$ Z: [- H) s7 F
       
6 ~$ T% e" }! V7 x+ b        1.我工作必备的寄存器,就放在我面前的工作台上。- a& f: Q  ]0 ^+ K7 K( m% n: V7 N
        2.程序计数器,我用它记住我要执行的下一条指令地址。% p0 ~5 ~3 F$ {( T4 Z( F

$ M6 {+ o2 U; h2 w        "阿甘,别来无恙啊",操作系统对我还是挺不错的,先给我打招呼。
% }' q8 L. m, O2 g, \9 [6 W
8 n4 n4 u3 _1 `1 j, i+ i% b& C        "Linux老大,今天有什么活啊",我每次都表现的积极主动。" }. [* \7 n4 l! L4 J2 O" ~5 i
: x% |' X  i' G# q2 d3 W7 E, z6 M
        "来,把这个hello world程序给运行了"。( h6 s+ u! z' [; s# c* ?

4 o" n! r+ p  U- n- g        Hello world程序还在硬盘上睡着呢,得先把他也装载到内存里,要不然我怎么执行啊。于是我就拿起电话打给硬盘,电话通过系统总线来到IO桥电话局,再转接到IO总线,这才来到硬盘这里。
& C# s% q0 X( W' q8 B
" G" {& {( e) n/ _6 X1 g: S' H% A        我在电话里请他把数据给我运过来,然后我就无所事事的坐在那里等。Linux老大立刻就怒了:阿甘,告诉你多少次了,你小子怎么还在等硬盘给你发数据!#j332:5 u1 u% J6 v# K% e( l
* T1 s0 V, ]: g3 t
        是的,我忘了一件事,硬盘比我慢太多了,我执行一条指令大概是1ns,在用来读磁盘的16ms里,我能潜在的执行1600多万条指令啊。  z" m4 s# v2 [, p8 k
$ u, o4 O" G( k( W2 B
        我感到深深的愧疚,赶紧拿起电话打给硬盘:哥们,按我们之前商量好的,用直接内存访问(DMA)啊,你直接把数据装载到内存吧,不用经过我了,装载完成以后给我发个信号。+ F5 S- m1 I! [: A! Z4 m" K
  L0 n, p. [. v
        "这还差不多"!Linux老大心情好了些。# }: \8 n6 [& c6 S! v% Z
       
4 i4 p! U) y. d* H) |        “阿甘,数据还没来,别闲着,这有一个菲波那切数列数列,来算一下吧”。6 t- s9 L- w5 P
1 k4 i( ?4 w1 Q# E' {
        "肥波纳妾数列?这名字好古怪,老大,其实你也知道,我脑子小,懒得去理解那是啥意思,你把进程屋切换下,把程序计数器设置好,指向下一条指令,我一条条指令执行就得了“我挺没追求的。
& U; f! p* m1 w$ V* W4 }' F) L8 G8 R  m; h, \& }: b: N8 a
        "真是个阿甘啊!”老大感慨到。
% G& O+ I6 l  H8 D/ v$ z# D: Z) P. q! y
        我所处的进程屋立刻发生了变化(当然,这也是我辅助Linux老大干的),各种包裹的信息都变了,尤其是寄存器和程序计数器。" y4 Q; }; r/ q' |: u1 r0 P
3 l# O7 n5 i8 J
        于是我就开始计算这个什么纳妾数列,但是这个数列似乎无穷无尽,哪个无脑子的程序员写了个无限循环吧。正在这时,我便收到了一个电话,说是Hello world的数据已经装载到内存了,让我去处理。; [- ], i% d. C, `# r

: e( ^1 N5 E" D8 |8 e! D        我放下手中的活,保存好现场,就去处理那个Hello world,果然数据已经都好了,那就切换过去运行吧。其实老大并不知道,任何人,只要你运行了相当多的数量的指令以后,你都能悟到这些程序的秘密。
$ J2 n; Q) U" x: s5 P        , }& [. s0 ]  p' k: O# {
        我CPU阿甘虽然傻傻的,但也架不住执行这数以万万亿的指令给我的熏陶啊。这个秘密就是:程序都是由顺序,分支,循环来组成的。其实分支和循环在我看来都是跳转而已。3 ]; D  [) R6 V/ R' h

% }1 T1 f7 x6 j7 c        所以我的工作就是打电话问内存要一条指令,执行这个指令,如果是个跳转指令的话,我就问内存要跳转的目标地址的那一条指令,继续执行,生活就是这么简单。7 U" d- c4 G' l' o

" p" X  v% i5 ?0 U! k  t        奥对了,当然也有复杂的,就是函数调用,我得和内存紧密配合才能完成。这个咱下回再说。
8 y2 s) ~3 K5 Y2 W( A       
9 a2 Q; X% F8 M3 \+ [% F+ w
新 装 备——缓 存
3 l" R1 y8 J+ H4 S7 g  ?
        提到内存,这真是我的好哥们,没有他,我几乎什么事儿都干不成,更重要的是他比硬盘快的多,读取一次数据,只需要100纳秒左右。这样我们俩说起话来就轻松多了。& q' l. a' E1 O' l, I
1 B6 y& T! G8 p/ u$ `& t& l4 v
        每次他都说:"阿甘,幸亏有你给我聊天,要不然我肯定被活活的闷死不可,那个硬盘说话是在太慢了"
+ c/ e  K. @3 ?; a5 K9 x1 I6 K$ n$ W$ ]# f- f* d& I
        "它为啥那么慢?"我每次都问。7 @. l, _8 P" E6 K
5 O# ^* Y: Y/ f5 U: m8 L4 w
        "硬盘是个机械是的玩意,一个磁头在一碟高速旋转的磁片上挪来挪去,光定位就慢死了"。
" r% Y$ ]1 D) h/ X5 u0 L
8 X' P# y5 Z! Y2 L        "那主人为什么要用硬盘?"
: k# M2 O9 r8 t6 w' J
4 F: S# E! M' J0 Q        "人家虽然慢,但是不怕停电,哪像你和我,一停电全部都失去记忆了。"
* S1 s- q2 Q! E1 ~/ ]1 ^$ X1 L4 T/ w( H
        确实是,人不能把好事都占全了啊。, k  j9 t# o* N. J" E

& v* X3 m' V" z5 W: \3 k8 N* c        我的指令中有些完全用我的寄存器就能完成,但是有很多都需要读写内存的数据,再加上所有的指令都在内存中存着,虽然它只比我慢个100倍,但指令多了我还是有点受不了。
5 Q8 g, T; [$ Z) Y3 f4 I( A$ s/ s0 q( t& {
        我给内存说:"哥们,你能不能再快点!"
1 B2 U1 `+ s$ s/ k/ o% D
. O7 b+ S( q. E3 j        内存说:拜托,这已经是我的极限了,阿甘,你自己再想想办法吧!我给你说啊,我留意了你最近访问的指令和数据,我发现了个规律“。9 W1 C, t/ L/ q# R. N! @( s

" m+ Z( ^; _( c( q/ v2 l        "啥规律?"
; m( |1 O! Q1 K7 U5 v( g
6 n# s' l# t* D1 E8 }) I- T        "比如说吧,你访问了我一个内存位置以后过不多久还会多次访问,还有,一个内存位置被访问了,附近的位置很快也会访问到"(这其实叫程序的局部性原理)。7 W2 \, P, G% a: I( v
: W. h2 }; V$ \; Q6 B
        我还以为是啥规律,其实我早就注意到了。; k' |6 T. p; l) N/ y' @' R5 D

: q" e/ ^6 y3 d) s- k7 ?  L% m        "这有啥用啊?”0 H% U2 c1 v/ v7 t
% L$ h- c% h+ e! m1 ^
        "既然你经常访问同一块区域的东西,你想想如果把这些东西缓存在你那里会怎么样...."$ S' Y1 |; \+ A/ p# b4 `# ?/ m

; J; T  Q$ K* F) c4 O) x        我一想有道理啊!加个缓存试试!
; X$ ?* K% L; O. p1 }6 ~* }
& ~7 D& m: n9 M/ G        从此以后,我每次读写指令和数据,都问缓存要,缓存没有才给内存打电话。
, I6 O: C& T( U* n+ z1 l, k
0 B) Z% P, {/ F1 B2 d3 i        果然,由于局部性原理的存在,我发现的确是快了不少啊。! k  ^4 I/ \6 |9 P

) P3 J& I( }" O" u* Y9 K        当然也有缺点,那就是Linux老大在做程序切换的时候,缓存就会失效,因为两个程序之间没什么联系,局部性原理不起作用,所以需要重建缓存。
6 t; I) q; i, c/ ^, z$ Y
2 ^; J/ P6 K# S& q/ E6 }' T, `0 r  i
自 我 提 升——流 水 线
" b9 f5 Z$ b- h# t6 {- w+ l
        缓存让我的工作更有效率,得到了Linux老大的表扬:"阿甘,我看你很聪明嘛,都会用缓存了"。
$ \* R& i: [9 X) I  h5 a
9 ?. u+ c1 r8 F; O        "我哪有那么聪明,都是内存的点子。老大,不过我学会了一个重要的东西:当你改变不了别人的话,抱怨也没用,还是先改变一下自己吧"。
+ s% s5 p+ `" [
# D( ^* e7 v' a9 H        "挺有哲理的吗,希望你明天重启后还能想起来!#379:"
+ m' q8 t8 i  E6 r# ?6 C$ ^: M+ C, A5 M" O
        "我最近又发现了一个问题,正苦恼着呢,你看我有四只手,第一只手负责打电话问内存要指令,第二只手翻译指令,第三只手真正执行,第四只手有时候还得把结果写回内存。问题是,我发现经常只有一只手在忙活,其他都在闲着,你看第一只手取指令,其他手只能等着。第二只手翻译指令的时候,其他三只也得等“
6 A' J; @5 {3 n% Q" c  r/ P, u5 D. o1 {
        "看来以后我们不能叫你阿甘了,你已经开始思考了!#392:"
5 P" `% Y- s- Z2 }/ P
' Q; B' M2 l0 r6 X) a7 p        “这问题好解决,给你举个例子,你听说过洗车没有?和你差不多,也是先喷水,再打洗洁剂,再擦洗,最后烘干,但人家的工作方式和你不一样,人家是流水线作业,你想想,一辆车在烘干的时候,后边是不是还有三辆车,分别在喷水,打清洁剂和擦洗,每个步骤都不会空闲。”$ M& _9 `2 \; O! Y0 A# g; @+ b

* w. g$ y/ i* Y, b4 v" d! j        "这么简单的道理我怎么都没有想到呢?我也可以搞个流水线啊,这样每只手都利用起来了"
3 X) u4 T6 w; O  o3 e0 F
0 B, O. H* O: C9 a/ P        别人都说我们高科技,但其实原理都蕴含在生活之中啊。
7 w# G# _3 z' i" M6 Z2 ~8 Z! |1 H4 F$ g; ?' J+ L
        有了缓存和流水线的帮助,让我的工作大大的加快了,大家都对我刮目相看。 他们想给我起个新名字:超人,不过我还是更喜欢他们叫我“阿甘”,多亲切。
$ D, C5 z& v1 N0 A4 p+ Y       
( y. y4 G% O: f6 ?, H# d' Q
尾 声
- O% {7 P$ t) b# @
        我一丝不苟,兢兢业业的运行指令,时不时和伙伴们聊天,很快一天就过去了,又到了晚上,我知道关机的时刻到了,赶紧挨个给他们道别。6 L  P0 F' L8 x

) u' Y& A$ ^" A; t        很快那些让我兴奋的电流消失了,风扇的嗡嗡声也没有了,我再也无法打出电话,整个世界沉寂了。明天将会是新的一天。
* x) P0 u7 p" [6 }, {& q
- V8 D2 A( C  g0 w% q4 [
上一篇
下一篇


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

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

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

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

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

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2021-3-3 14:07 , Processed in 0.028476 second(s), 20 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表