新闻联播的牛X之处在于就算你一直在换台,也能完整的看完一条新闻。 每日签到 收藏本站
登陆 / 注册 搜索

USERCENTER


查看:5970   回复: 2

CPU的自述

[复制链接]
发新帖
跳转到指定楼层
楼主
仗剑天涯吾是土豪 发表于 2017-7-6 23:50:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

        上帝把我制造出来,给我了一个很小的脑容量,为数不多的寄存器能临时的记一点东西,但是上帝给我打开了一扇特别的窗户,那就是像阿甘一样,跑的飞快。
2 {/ @$ q% N0 N, K3 ?8 s" v9 C6 H, r$ S# z3 P5 z+ n6 n
        到底有多快呢?我这么比喻一下吧,我的工作都是以纳秒为单位的,你们人间的一秒,我可能已经做了1000,000,000(10亿)次动作了。
' D( z% f6 y6 V2 Y% v
* ?/ q; s2 Z. v- m1 X, P
 cpu-floating.jpg CPU的自述
% X$ y- N1 D% P4 X. @+ Z8 m
        相比而言,内存比我慢100倍,硬盘比我慢1000多万倍,你说我快不快?% k# Y1 r5 H" o! {
       
9 \6 ]0 O: w- K* a5 W' \
启 动
4 b) u% Q( i  T
        我住在一个机箱里,每天早上一阵电流把我叫醒,还夹杂着嗡嗡的声音,我知道我忠实的护卫电风扇又开始工作了,我特别怕热,又运行的飞快,如果没有电风扇给我降温,我很快就会生病,生病的后果很严重,那就是我的伙伴们像内存了,硬盘了。。全部都要罢工了,没有我这个系统就会陷入的一片死寂。
( ?* B) b, N1 `7 B6 L/ `
# Y# N6 \1 ^+ s+ `. g. H        我听说有些CPU的福利很好,竟然待在恒温恒湿,一尘不染的托管机房里,让我好生羡慕。
; U6 f* W" j& t1 @, I
: C! b7 a& H, C4 r7 c        我的脑容量很小,所以醒来后只想起了我的创造者告诉我的几件事情:* y, {' T8 O) ]" q% M5 i* |
       
4 U7 E1 @! d7 s: L        1.你的工作就是运行指令2 W* i7 N& R+ t
        2.你不能保存指令,你的指令全在内存里5 o4 e# ?9 w" ~, ?
        3.你的第一条指令在内存的最顶端处0xFFFFFFF0
) {" c1 i) i; {- E0 {
/ |; o" o( l3 c5 S( K* @6 {3 Y
 cpu流程图.jpg CPU的自述

( O1 c: @1 N- E, \8 p        那还有什么可说的,赶紧打电话给内存要指令,电话通过系统总线,还得通过I/O桥电话局需要转接一下,再通过存储总线接通内存。( y' \: n9 G2 d2 }" t
! a% @4 h! |+ A5 ?5 s; [4 C% W& \4 n
        "哥们,把这个地址处的指令给我说一下吧"
( ^! b. [( Z1 [' i5 J% C0 F9 M' l+ g6 a  s
        "你是谁?"内存竟然把我忘了,当然,他断了电和我一样,失忆了。#j347:
, S. |; S% X- g- ]& l+ s& J
0 ?* `& ?* l6 e" i. f1 f        "我是阿甘啊,我们经常聊天来着,你忘了?"
. u2 v( X0 e5 @) p6 {/ m% ^5 x6 i" @* `
        内存磨磨唧唧半天才把数据发了过来(比我慢100倍啊),这是一条跳转指令,我立刻回忆起来了,这是我的老朋友BIOS等着我去运行他那一堆指令呢。
: b3 Q3 p4 v( g+ M& e3 v7 G0 a4 m4 s0 a9 h
        我给BIOS打电话:“老弟,今天干点啥?”
, F: T7 w" y0 `2 {/ Y2 V" A! e
- U: m: H+ |" V, y3 }        “阿甘,早上好"BIOS从不失忆,把所有人都记得清清楚楚“还不是老一套啊,无非做一下系统的自检,看看内存,硬盘,显卡等这些老伙计们有没有问题,有问题的话用小喇叭提示一下主人”
7 I9 g2 ~# j! \4 p! ?* x  ~
! F( ~9 h  y( \0 ]' `        这些过程我已经轻车熟路了,很快搞定,像往常一样,没有问题,我还把一个叫做中断向量表的东西给弄好了,我知道一会而要用
- ?& a; Z0 R8 [9 O- g" k" q7 [0 W
! Q* s8 b$ O  T: F& W* Z- t        这些东西都搞完了,BIOS果然告诉:"阿甘,int 0x19"
& Q2 E- }" T1 N1 e' H, k1 D5 @) N6 v& z4 j3 u7 \
        我赶紧去刚弄好的中断向量表中去查第19号,顺藤摸瓜又找到对应0x19的一大堆指令。
/ }6 b5 U8 A7 j: w  H& G) A9 {; `5 j( \9 P8 ~: ~1 ~& f$ {
        执行吧,这堆指令把将磁盘的第一扇区(磁盘最开始的512字节)运到内存的0X0000:0X7C00处,然后我就从此处接着执行。) O6 G, L( W- o9 {, k' X3 o& T
$ m5 R$ X' L2 z, k
        我想起来了,接下来有一大堆精巧的指令把迷迷糊糊的操作系统从硬盘中唤醒,运输到内存中来。(此处实在是复杂,略去10万字。。。。)$ L& A) P* w: [5 M, y

) l5 {/ I( Q0 u2 D6 K$ }        你看这就是为啥他们叫我阿甘,我做事飞快,但非得别人告诉去哪里执行才行,要不然我就只会坐在那里无所适从。3 u5 \4 o; ~: |3 e. s# d( B
        0 D  Y8 d3 P% z& F# s4 o
运 行

7 `* S5 c5 J! `8 `. h7 M# w3 v- z        操作系统一旦进入内存,立刻就是老大,所有人都得听他指挥。我也发现我的周围出现了一个屋子:进程屋。屋里堆着一大堆东西,什么进程描述信息包裹了,进程控制信息包裹了,我都不太关心,我只关心最最重要的两件东西:
& c- k( b( J" C/ C, \/ @7 i       
1 S6 J4 ^! {4 ]$ T! U7 A) m        1.我工作必备的寄存器,就放在我面前的工作台上。' s- s8 G; n1 B0 r" g2 B; t4 n
        2.程序计数器,我用它记住我要执行的下一条指令地址。4 B( a7 [5 S0 q; N& f

/ Y' F7 |  {2 G( `! @. Y  K        "阿甘,别来无恙啊",操作系统对我还是挺不错的,先给我打招呼。
( x3 Y7 y1 a" i. _; G3 ?4 u
: y* R) G1 J# E$ K5 H7 H        "Linux老大,今天有什么活啊",我每次都表现的积极主动。
  U9 c3 b6 B9 ~; @/ {; x
# D, ]' w2 w& Z1 {. v( C. R* [        "来,把这个hello world程序给运行了"。
  [! R! w; l' K4 h, c3 e: m! R# f# I# o
        Hello world程序还在硬盘上睡着呢,得先把他也装载到内存里,要不然我怎么执行啊。于是我就拿起电话打给硬盘,电话通过系统总线来到IO桥电话局,再转接到IO总线,这才来到硬盘这里。6 f+ E% j5 i  j  A1 v$ M2 U
+ D  b/ Q  R5 ^1 {7 y
        我在电话里请他把数据给我运过来,然后我就无所事事的坐在那里等。Linux老大立刻就怒了:阿甘,告诉你多少次了,你小子怎么还在等硬盘给你发数据!#j332:7 ^5 a6 v* X. O4 t) K, \8 c6 O

+ h, x& B7 z3 b$ }1 b: A& X# F        是的,我忘了一件事,硬盘比我慢太多了,我执行一条指令大概是1ns,在用来读磁盘的16ms里,我能潜在的执行1600多万条指令啊。
: u4 G! d3 |& B9 M6 s8 ]/ n& R* ]+ i5 j0 E
        我感到深深的愧疚,赶紧拿起电话打给硬盘:哥们,按我们之前商量好的,用直接内存访问(DMA)啊,你直接把数据装载到内存吧,不用经过我了,装载完成以后给我发个信号。( y8 }  l/ e- \0 c
5 V9 Y* o* S9 x3 Q
        "这还差不多"!Linux老大心情好了些。- B) a6 w* b( |, v# R5 e, @
        ! W9 V2 X1 S+ a/ C3 K
        “阿甘,数据还没来,别闲着,这有一个菲波那切数列数列,来算一下吧”。
0 W- S* r3 V5 U0 b/ W+ W  h3 a& _0 B! ]- r* Y# N3 E" L# p' s
        "肥波纳妾数列?这名字好古怪,老大,其实你也知道,我脑子小,懒得去理解那是啥意思,你把进程屋切换下,把程序计数器设置好,指向下一条指令,我一条条指令执行就得了“我挺没追求的。
& e: R! Q+ B$ |. m* Q' i  h. U
2 q! D# {! O. f0 a/ y        "真是个阿甘啊!”老大感慨到。! e& L% F/ n$ x7 W/ y$ r* P: \

9 F7 h7 [" q; p2 T1 d4 `        我所处的进程屋立刻发生了变化(当然,这也是我辅助Linux老大干的),各种包裹的信息都变了,尤其是寄存器和程序计数器。9 @- Z) `" S; B4 N7 d" _1 W
2 [7 G" ]0 H* o0 Y: E* J* M
        于是我就开始计算这个什么纳妾数列,但是这个数列似乎无穷无尽,哪个无脑子的程序员写了个无限循环吧。正在这时,我便收到了一个电话,说是Hello world的数据已经装载到内存了,让我去处理。
$ |3 H9 w' k2 ]. O$ \8 N6 ?( b( O: d) L( M* r' ?5 m
        我放下手中的活,保存好现场,就去处理那个Hello world,果然数据已经都好了,那就切换过去运行吧。其实老大并不知道,任何人,只要你运行了相当多的数量的指令以后,你都能悟到这些程序的秘密。
8 N: S" l2 |" {* f2 E       
! E9 X9 S0 ~: Q1 h5 d. v+ F        我CPU阿甘虽然傻傻的,但也架不住执行这数以万万亿的指令给我的熏陶啊。这个秘密就是:程序都是由顺序,分支,循环来组成的。其实分支和循环在我看来都是跳转而已。  O* _; j! g5 t. U
5 Z9 ~- Q/ t) v+ j9 H
        所以我的工作就是打电话问内存要一条指令,执行这个指令,如果是个跳转指令的话,我就问内存要跳转的目标地址的那一条指令,继续执行,生活就是这么简单。
) P8 n! f; H3 U# D) f9 j8 O7 ?" {+ E- x4 i
        奥对了,当然也有复杂的,就是函数调用,我得和内存紧密配合才能完成。这个咱下回再说。
8 @. C, ?" `& a8 T        " F! A: V/ [; r7 D# Y% Y$ T" R
新 装 备——缓 存

2 ?: w6 D& r# K+ t% @/ P        提到内存,这真是我的好哥们,没有他,我几乎什么事儿都干不成,更重要的是他比硬盘快的多,读取一次数据,只需要100纳秒左右。这样我们俩说起话来就轻松多了。+ f0 c6 p2 b+ N7 F1 x9 e
5 i6 X1 g3 e' o8 K6 B! k2 D- f8 x
        每次他都说:"阿甘,幸亏有你给我聊天,要不然我肯定被活活的闷死不可,那个硬盘说话是在太慢了"3 [  X( U: O4 n4 @
) |) V# M6 U, x, ?* _: m
        "它为啥那么慢?"我每次都问。
  r7 j  o. u7 U1 C# i) O- x' C0 @
5 U  u# l- `# \' F3 Y: j: T8 m        "硬盘是个机械是的玩意,一个磁头在一碟高速旋转的磁片上挪来挪去,光定位就慢死了"。
4 `  k& I& H) s
5 X& y3 P8 D% X  }7 S  m# b( k+ L        "那主人为什么要用硬盘?"
! I; _! X; m; F
1 G5 y! x7 @: D# z: Z        "人家虽然慢,但是不怕停电,哪像你和我,一停电全部都失去记忆了。"; `( J# S; u+ y! O- O$ o

# l5 C, z& K! s. e* C8 z- c        确实是,人不能把好事都占全了啊。/ q( Z" e: q3 I) I1 ^9 Y2 q
. f# ~6 l9 \% Q" [% U. g0 e1 N
        我的指令中有些完全用我的寄存器就能完成,但是有很多都需要读写内存的数据,再加上所有的指令都在内存中存着,虽然它只比我慢个100倍,但指令多了我还是有点受不了。
9 I" @+ c4 t2 B4 }" \6 R3 s. V  x$ g4 K5 w0 R
        我给内存说:"哥们,你能不能再快点!") j4 m+ k. A5 l4 h' D3 P8 T6 G, M
+ Y6 b: B3 A: A  E
        内存说:拜托,这已经是我的极限了,阿甘,你自己再想想办法吧!我给你说啊,我留意了你最近访问的指令和数据,我发现了个规律“。, E! O5 N5 b, J4 I3 |7 n" W( ~- A( ~
0 s* A5 @9 y% Z1 m+ G7 d9 y# R) J1 t
        "啥规律?"1 i5 {. z6 B. X5 j0 d
5 V7 d' O3 `4 Z! \6 ?5 Z) U
        "比如说吧,你访问了我一个内存位置以后过不多久还会多次访问,还有,一个内存位置被访问了,附近的位置很快也会访问到"(这其实叫程序的局部性原理)。
1 }" a4 ?# @/ u/ }# m1 T& ]  c+ p) m6 T* W9 u$ H" S9 e# x0 }8 w) @
        我还以为是啥规律,其实我早就注意到了。
: j/ f7 a; @% {! ^, s7 }
! R, H% x  P, H/ T" _  ?        "这有啥用啊?”$ R2 u+ f% g# G+ }; P) d2 C9 v

! c% i$ W& n# A        "既然你经常访问同一块区域的东西,你想想如果把这些东西缓存在你那里会怎么样...."
9 S( \. R  |& [: Y5 z' A7 I1 g9 ?3 G3 S. v
        我一想有道理啊!加个缓存试试!
/ h+ s* t& N, c. U4 ]7 D! P) y3 a8 |; X! P. t( l4 y' c0 J
        从此以后,我每次读写指令和数据,都问缓存要,缓存没有才给内存打电话。
$ F/ l) _$ Z8 ?- k: b8 B5 m$ r3 U7 K' D& V6 r2 B( W
        果然,由于局部性原理的存在,我发现的确是快了不少啊。
  |2 \5 X( B4 r- ~0 ]0 u- ?5 b5 p7 T, @
        当然也有缺点,那就是Linux老大在做程序切换的时候,缓存就会失效,因为两个程序之间没什么联系,局部性原理不起作用,所以需要重建缓存。
7 P, ]* X9 n3 m. j% Q1 N$ a) F, C% M; K8 F+ a1 u
自 我 提 升——流 水 线

( G% D( B; D5 C        缓存让我的工作更有效率,得到了Linux老大的表扬:"阿甘,我看你很聪明嘛,都会用缓存了"。) S8 _' k$ b% o/ }5 }- {/ _
; }) i2 \  e8 Y" D
        "我哪有那么聪明,都是内存的点子。老大,不过我学会了一个重要的东西:当你改变不了别人的话,抱怨也没用,还是先改变一下自己吧"。
/ R7 h5 X" R0 b" C1 N
# n8 Q- [1 ~) W8 J. ]& h1 w6 x- J8 m        "挺有哲理的吗,希望你明天重启后还能想起来!#379:"
- l3 u1 |: N1 O0 |+ [* }- N, d( E# |6 w& a. u! Q
        "我最近又发现了一个问题,正苦恼着呢,你看我有四只手,第一只手负责打电话问内存要指令,第二只手翻译指令,第三只手真正执行,第四只手有时候还得把结果写回内存。问题是,我发现经常只有一只手在忙活,其他都在闲着,你看第一只手取指令,其他手只能等着。第二只手翻译指令的时候,其他三只也得等“4 Q7 P  D* Q. D
' L; s/ A9 ~2 v+ Q. m, d5 P8 Q$ G( d
        "看来以后我们不能叫你阿甘了,你已经开始思考了!#392:", o. v6 R* X+ ?* B  C/ Q% i* K
! _; B9 |" K, X, l
        “这问题好解决,给你举个例子,你听说过洗车没有?和你差不多,也是先喷水,再打洗洁剂,再擦洗,最后烘干,但人家的工作方式和你不一样,人家是流水线作业,你想想,一辆车在烘干的时候,后边是不是还有三辆车,分别在喷水,打清洁剂和擦洗,每个步骤都不会空闲。”- f3 [7 g- N0 O, |9 f6 l5 M: p

* O* w( o2 C- B" M  x# i        "这么简单的道理我怎么都没有想到呢?我也可以搞个流水线啊,这样每只手都利用起来了"0 B1 w$ U: Q. N
- a& \: h3 S0 L0 z
        别人都说我们高科技,但其实原理都蕴含在生活之中啊。
4 ^: Q' P# d" \5 H8 @6 J1 q9 O7 L/ i) P. N  u
        有了缓存和流水线的帮助,让我的工作大大的加快了,大家都对我刮目相看。 他们想给我起个新名字:超人,不过我还是更喜欢他们叫我“阿甘”,多亲切。
) H- d9 Y* o; c       
, j7 R9 A/ w* L4 i
尾 声

% p+ ^1 @4 R& x5 J# H5 [4 g& `        我一丝不苟,兢兢业业的运行指令,时不时和伙伴们聊天,很快一天就过去了,又到了晚上,我知道关机的时刻到了,赶紧挨个给他们道别。* T7 y$ b% b7 }
6 x0 B( y4 [5 j; M" e" T
        很快那些让我兴奋的电流消失了,风扇的嗡嗡声也没有了,我再也无法打出电话,整个世界沉寂了。明天将会是新的一天。
1 K/ N* D9 E  e9 S* q
! U4 e4 I, z4 T4 U6 _9 x# m
上一篇:一个路由器的自述摘要:我就是网卡TP-Link7954经常和大家提起的网关路由器, ...
下一篇:一个CPU的自诉——这个世界好慢啊啊啊摘要:1,简介: 经常听到有人说磁盘很慢、网络很卡, ...

故事,还未完、「锋芒初露」 发表于 2018-1-20 22:41:20 来自手机 | 只看该作者
顶起出售广告位#j325:
梦纸「出类拔萃」 发表于 2018-1-23 07:43:55 | 只看该作者
我水土不服就服你
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

关于我们|小黑屋|手机版|Archiver|古黑论

GMT+8, 2019-7-17 23:22 , Processed in 0.105023 second(s), 37 queries , Redis On.

© 2015-2019 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表