时间并不存在,存在的只有此刻。 收藏本站
登陆 / 注册 搜索

阅读: 6.8K   回复: 2

CPU的自述

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

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

主题破百
        上帝把我制造出来,给我了一个很小的脑容量,为数不多的寄存器能临时的记一点东西,但是上帝给我打开了一扇特别的窗户,那就是像阿甘一样,跑的飞快。
+ n1 y) T2 E) s# @
% H4 m/ ~' e( K5 {, P3 m) w        到底有多快呢?我这么比喻一下吧,我的工作都是以纳秒为单位的,你们人间的一秒,我可能已经做了1000,000,000(10亿)次动作了。
2 g" {) U6 f& Q$ c( b3 G
. B" o1 p- }. m+ q* K9 S5 d; }
CPU的自述 cpu-floating.jpg

1 g# {  Q& F( ~! e+ S4 u& i% O        相比而言,内存比我慢100倍,硬盘比我慢1000多万倍,你说我快不快?
  [  o. {: p( u        ; Q7 k. U+ l* y( ]
启 动

" k! d- H  P; Q' S        我住在一个机箱里,每天早上一阵电流把我叫醒,还夹杂着嗡嗡的声音,我知道我忠实的护卫电风扇又开始工作了,我特别怕热,又运行的飞快,如果没有电风扇给我降温,我很快就会生病,生病的后果很严重,那就是我的伙伴们像内存了,硬盘了。。全部都要罢工了,没有我这个系统就会陷入的一片死寂。, {5 m& g4 {8 T' H
+ M: {5 ]# S) {9 V$ a: c
        我听说有些CPU的福利很好,竟然待在恒温恒湿,一尘不染的托管机房里,让我好生羡慕。
+ w5 r" a7 S2 h8 |. t' n9 ?* v% q  J& e( \- s$ G( h' z: k
        我的脑容量很小,所以醒来后只想起了我的创造者告诉我的几件事情:
4 U( \1 ], W. g. z$ d        8 u) [3 m0 N) r' p9 t
        1.你的工作就是运行指令2 k) l) A) g! f7 V9 i5 J
        2.你不能保存指令,你的指令全在内存里
* ]" t0 L  u6 s2 Z" E1 e' y1 _        3.你的第一条指令在内存的最顶端处0xFFFFFFF0
1 p6 Z5 r4 z: I. k( U) }4 w0 x4 |9 v! P
CPU的自述 cpu流程图.jpg
4 L4 y' s/ ~3 I4 M1 }
        那还有什么可说的,赶紧打电话给内存要指令,电话通过系统总线,还得通过I/O桥电话局需要转接一下,再通过存储总线接通内存。! |3 n) N* h5 E7 l' y8 r  ~

. m" z" X' [5 q4 H' L        "哥们,把这个地址处的指令给我说一下吧"+ u/ U! [5 J. t- l% O5 t
6 d0 P# P& e4 n
        "你是谁?"内存竟然把我忘了,当然,他断了电和我一样,失忆了。#j347:/ z1 K5 |9 m! Y% R" a0 O+ B' u

! D' \$ q( R) J1 B        "我是阿甘啊,我们经常聊天来着,你忘了?": h, C9 ]5 Q: D) l, M! U' R

4 x* b* v+ ]2 S- a. o7 k: @! E) m( l        内存磨磨唧唧半天才把数据发了过来(比我慢100倍啊),这是一条跳转指令,我立刻回忆起来了,这是我的老朋友BIOS等着我去运行他那一堆指令呢。
- |8 y9 [- U' B# Z" D. H
9 A  S: f/ r7 U) v5 m4 P% h        我给BIOS打电话:“老弟,今天干点啥?”
4 f' j  D! K3 \+ f/ P8 C# T9 p
- t% j5 P% N- g1 ^$ m) e( y, w        “阿甘,早上好"BIOS从不失忆,把所有人都记得清清楚楚“还不是老一套啊,无非做一下系统的自检,看看内存,硬盘,显卡等这些老伙计们有没有问题,有问题的话用小喇叭提示一下主人”# R' F' z1 O5 w  j+ p# T

, l" t4 G- h& x: o  j: }        这些过程我已经轻车熟路了,很快搞定,像往常一样,没有问题,我还把一个叫做中断向量表的东西给弄好了,我知道一会而要用
8 }2 ?0 a3 ]3 S5 ~6 |+ k3 U
/ w8 O" Z3 j/ Q! E% y% |        这些东西都搞完了,BIOS果然告诉:"阿甘,int 0x19"5 b5 C* F$ Q, `7 c9 u) B. m$ Z
1 a, B9 w+ ^8 b2 q
        我赶紧去刚弄好的中断向量表中去查第19号,顺藤摸瓜又找到对应0x19的一大堆指令。
" B* D# H" g1 j& G# N: K
8 D: R4 u5 f0 \9 r0 m# c2 p" z3 e        执行吧,这堆指令把将磁盘的第一扇区(磁盘最开始的512字节)运到内存的0X0000:0X7C00处,然后我就从此处接着执行。
2 Y! c$ P. `4 `9 K( c5 z
. I$ Z4 O. k3 u8 H; S5 _$ [        我想起来了,接下来有一大堆精巧的指令把迷迷糊糊的操作系统从硬盘中唤醒,运输到内存中来。(此处实在是复杂,略去10万字。。。。)
7 D( ?  s! c9 t- u( @
2 e5 B* ~* S5 A* @+ J# O; M        你看这就是为啥他们叫我阿甘,我做事飞快,但非得别人告诉去哪里执行才行,要不然我就只会坐在那里无所适从。1 c9 x* c, K+ l* J
       
1 I8 p0 n$ \/ r3 U3 \4 A
运 行

3 s. Q3 t+ d+ I, M        操作系统一旦进入内存,立刻就是老大,所有人都得听他指挥。我也发现我的周围出现了一个屋子:进程屋。屋里堆着一大堆东西,什么进程描述信息包裹了,进程控制信息包裹了,我都不太关心,我只关心最最重要的两件东西:: h7 G1 W4 I- V; A- }1 @
        , Y4 v5 A! c2 A* f3 `3 ~' O4 g; X" M' h
        1.我工作必备的寄存器,就放在我面前的工作台上。$ U' f7 A# l( G7 n2 [% t  Y
        2.程序计数器,我用它记住我要执行的下一条指令地址。# n( V# b6 r* v! r. N, K# o2 s5 m

& ^9 e5 U: `5 I( m; w3 I+ F* H8 d1 p0 K        "阿甘,别来无恙啊",操作系统对我还是挺不错的,先给我打招呼。
3 m' z) Y7 S2 O2 U) U
' k, ]  F) S- D6 ?1 i+ Y( [        "Linux老大,今天有什么活啊",我每次都表现的积极主动。
$ N& _7 Z7 X* m  N' Q9 L) ?
! U7 Z" O3 Y5 F        "来,把这个hello world程序给运行了"。1 c# H( e0 O7 r  S

) q. d9 Q5 o1 \1 s( w" G        Hello world程序还在硬盘上睡着呢,得先把他也装载到内存里,要不然我怎么执行啊。于是我就拿起电话打给硬盘,电话通过系统总线来到IO桥电话局,再转接到IO总线,这才来到硬盘这里。
" j+ N; {1 J* `' _" o* P7 [0 z9 B0 T2 `, H# l' @' O
        我在电话里请他把数据给我运过来,然后我就无所事事的坐在那里等。Linux老大立刻就怒了:阿甘,告诉你多少次了,你小子怎么还在等硬盘给你发数据!#j332:
$ h) {+ x6 A1 c" W7 x5 K
- {- w5 C& t% @  ^. T3 }        是的,我忘了一件事,硬盘比我慢太多了,我执行一条指令大概是1ns,在用来读磁盘的16ms里,我能潜在的执行1600多万条指令啊。4 i* k6 n4 P1 C
; z' }2 K  z% u
        我感到深深的愧疚,赶紧拿起电话打给硬盘:哥们,按我们之前商量好的,用直接内存访问(DMA)啊,你直接把数据装载到内存吧,不用经过我了,装载完成以后给我发个信号。
/ p  [% a7 ]/ J* f
. D5 v* M( b- a        "这还差不多"!Linux老大心情好了些。" g  ~& q) F, L# W/ N
       
" M* r0 j* [" S  d8 d9 F9 S; U: d        “阿甘,数据还没来,别闲着,这有一个菲波那切数列数列,来算一下吧”。! \# N2 V9 T  k
4 [2 I" U6 b: R$ v0 p6 Z
        "肥波纳妾数列?这名字好古怪,老大,其实你也知道,我脑子小,懒得去理解那是啥意思,你把进程屋切换下,把程序计数器设置好,指向下一条指令,我一条条指令执行就得了“我挺没追求的。
8 g/ Y, E. a7 M, @
, |, V1 {% r: X! z( E# N8 x        "真是个阿甘啊!”老大感慨到。1 [( \# P8 T% t
: [$ H* [4 i7 Y: q
        我所处的进程屋立刻发生了变化(当然,这也是我辅助Linux老大干的),各种包裹的信息都变了,尤其是寄存器和程序计数器。& U0 }  Y& y( C
; q" b/ D; o0 e. g
        于是我就开始计算这个什么纳妾数列,但是这个数列似乎无穷无尽,哪个无脑子的程序员写了个无限循环吧。正在这时,我便收到了一个电话,说是Hello world的数据已经装载到内存了,让我去处理。- ^. a' N1 v) [1 f7 R5 v
9 p- \. d' m8 J2 ]2 L7 C8 e1 l
        我放下手中的活,保存好现场,就去处理那个Hello world,果然数据已经都好了,那就切换过去运行吧。其实老大并不知道,任何人,只要你运行了相当多的数量的指令以后,你都能悟到这些程序的秘密。% A1 q- E4 |- R' t  B: x
       
7 J  u+ y& v4 |3 X. G5 q! |        我CPU阿甘虽然傻傻的,但也架不住执行这数以万万亿的指令给我的熏陶啊。这个秘密就是:程序都是由顺序,分支,循环来组成的。其实分支和循环在我看来都是跳转而已。
# Q, `/ h/ X( A' z- I3 E/ `
! b4 e8 u1 W4 N& i( h* A        所以我的工作就是打电话问内存要一条指令,执行这个指令,如果是个跳转指令的话,我就问内存要跳转的目标地址的那一条指令,继续执行,生活就是这么简单。/ s* R8 a, l  C# [: r6 s

4 ?% Z! O8 o$ a' R6 \        奥对了,当然也有复杂的,就是函数调用,我得和内存紧密配合才能完成。这个咱下回再说。
! |0 z. F/ j/ G, I        3 d* Z0 M! V& Z5 C( @: R
新 装 备——缓 存

, {  J' k( Y( X! ~/ h- K        提到内存,这真是我的好哥们,没有他,我几乎什么事儿都干不成,更重要的是他比硬盘快的多,读取一次数据,只需要100纳秒左右。这样我们俩说起话来就轻松多了。3 S5 Z2 q+ G1 r! \. n. `; M
  ~5 `  ~( d  }7 i: @
        每次他都说:"阿甘,幸亏有你给我聊天,要不然我肯定被活活的闷死不可,那个硬盘说话是在太慢了"8 {0 G  b, _, R: G7 C4 _( H7 C

+ X' S& F, S! T        "它为啥那么慢?"我每次都问。9 Z( k" |9 d4 E' ?3 Y1 @

& l) p' f. }1 N6 M$ [+ b        "硬盘是个机械是的玩意,一个磁头在一碟高速旋转的磁片上挪来挪去,光定位就慢死了"。
; t# h$ \) T& `* D8 A
* [9 |0 J2 |' q$ Q2 U. O+ n: Y        "那主人为什么要用硬盘?"3 x( U4 d1 }, P2 l; Z
5 p6 Y  @2 ~. |) \& c+ d0 @
        "人家虽然慢,但是不怕停电,哪像你和我,一停电全部都失去记忆了。"
  x. C' {1 X( z* X" o% U  M% H* A  W- Y) p
        确实是,人不能把好事都占全了啊。* Q& O3 b4 q* P3 U
: M4 n3 t6 Y7 m1 p; C# _* p
        我的指令中有些完全用我的寄存器就能完成,但是有很多都需要读写内存的数据,再加上所有的指令都在内存中存着,虽然它只比我慢个100倍,但指令多了我还是有点受不了。
% z. \/ t" e; ]2 w* [/ I
+ N3 {  A' E- y2 V8 B: z        我给内存说:"哥们,你能不能再快点!"
: i. e: Q/ t5 r
" i, b. K) |1 g% B. F        内存说:拜托,这已经是我的极限了,阿甘,你自己再想想办法吧!我给你说啊,我留意了你最近访问的指令和数据,我发现了个规律“。3 f8 Q5 T% e  c3 v0 G' W  f
1 M1 r# n2 E$ P
        "啥规律?"1 ?: ~: f: b% t$ z5 e5 |) e. S1 H
1 S6 Y, r. b0 I, P, o* @# `, F
        "比如说吧,你访问了我一个内存位置以后过不多久还会多次访问,还有,一个内存位置被访问了,附近的位置很快也会访问到"(这其实叫程序的局部性原理)。7 Q2 J* E( \! j8 D2 g- l
2 R; b% T/ x, b/ }
        我还以为是啥规律,其实我早就注意到了。
8 x1 ~; F" }; z% T* g; R/ x) l) r0 P
        "这有啥用啊?”
. a: `5 U6 b% ]5 _( l( {- v! E3 _/ L/ {* \) z0 P' H# ~
        "既然你经常访问同一块区域的东西,你想想如果把这些东西缓存在你那里会怎么样...."
- g, u! v" D! f* Z. B8 P, `! ?1 e
  F; c. {  J" h        我一想有道理啊!加个缓存试试!
+ h8 M0 `- X; P( B5 n8 |, J1 k8 s& F  @1 {" P! o( ^9 O
        从此以后,我每次读写指令和数据,都问缓存要,缓存没有才给内存打电话。& m9 @- l/ V5 i

; C. k( d/ m. Q. f        果然,由于局部性原理的存在,我发现的确是快了不少啊。1 T; h0 l" l# N& \% R  @

$ y6 T  B3 Z0 c7 r3 R2 G* v, y        当然也有缺点,那就是Linux老大在做程序切换的时候,缓存就会失效,因为两个程序之间没什么联系,局部性原理不起作用,所以需要重建缓存。4 M/ ^# k8 e  W

" ]/ M: R7 N( C" [& q. q9 X  o
自 我 提 升——流 水 线

* I5 C4 E, E9 u' T% E- Y        缓存让我的工作更有效率,得到了Linux老大的表扬:"阿甘,我看你很聪明嘛,都会用缓存了"。' }7 |2 L. t* a0 R) H# {

7 n1 F6 ~# A3 W* W8 T9 V( m  N        "我哪有那么聪明,都是内存的点子。老大,不过我学会了一个重要的东西:当你改变不了别人的话,抱怨也没用,还是先改变一下自己吧"。4 p- a6 Z" I) R" r' x

+ i2 D) C2 y- k        "挺有哲理的吗,希望你明天重启后还能想起来!#379:"
, |/ t& D' U7 o' s5 j; r6 \, u' z% F. _  H
        "我最近又发现了一个问题,正苦恼着呢,你看我有四只手,第一只手负责打电话问内存要指令,第二只手翻译指令,第三只手真正执行,第四只手有时候还得把结果写回内存。问题是,我发现经常只有一只手在忙活,其他都在闲着,你看第一只手取指令,其他手只能等着。第二只手翻译指令的时候,其他三只也得等“# U: F" }3 T1 A$ j& H, ~- i

2 l; ]' o- u  e3 }% e        "看来以后我们不能叫你阿甘了,你已经开始思考了!#392:"
9 [9 n, X% h$ y4 A) [$ Z6 D6 D
- |6 D( W/ w% r  b' G) B$ |        “这问题好解决,给你举个例子,你听说过洗车没有?和你差不多,也是先喷水,再打洗洁剂,再擦洗,最后烘干,但人家的工作方式和你不一样,人家是流水线作业,你想想,一辆车在烘干的时候,后边是不是还有三辆车,分别在喷水,打清洁剂和擦洗,每个步骤都不会空闲。”: v0 S& _$ d/ W" T  Z& S) Y+ {

7 y; k! F# j7 P! o- j' N5 `        "这么简单的道理我怎么都没有想到呢?我也可以搞个流水线啊,这样每只手都利用起来了"" F1 E7 @, Z, p4 u! u7 G+ Q
  K) p. ~( Q# K4 z
        别人都说我们高科技,但其实原理都蕴含在生活之中啊。# `% o' K8 D9 N! `9 y# E

/ n6 W" S4 ?7 c7 G! u5 k5 M        有了缓存和流水线的帮助,让我的工作大大的加快了,大家都对我刮目相看。 他们想给我起个新名字:超人,不过我还是更喜欢他们叫我“阿甘”,多亲切。
! X! e$ d2 x+ D2 n- h        4 M2 w, {6 [% E; y; P
尾 声
, M9 b7 l6 U3 H4 H9 q+ Y
        我一丝不苟,兢兢业业的运行指令,时不时和伙伴们聊天,很快一天就过去了,又到了晚上,我知道关机的时刻到了,赶紧挨个给他们道别。
* V1 o& I! X# }2 e& y- \
& O' _$ N! e0 r& J0 D        很快那些让我兴奋的电流消失了,风扇的嗡嗡声也没有了,我再也无法打出电话,整个世界沉寂了。明天将会是新的一天。: s; \6 ?8 R. W+ O. u! n
, Z' Z1 Y) M" e$ c  S0 j0 K


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

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

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

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

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

本版积分规则

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

GMT+8, 2020-8-5 19:14 , Processed in 0.041422 second(s), 21 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表