安心地睡吧,就算你将遗忘一切,我也会永远记得。我将为你而生、为你而死。 每日签到 收藏本站
登陆 / 注册 搜索

USERCENTER


查看:6084   回复: 2

CPU的自述

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

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

        上帝把我制造出来,给我了一个很小的脑容量,为数不多的寄存器能临时的记一点东西,但是上帝给我打开了一扇特别的窗户,那就是像阿甘一样,跑的飞快。: i, ~, x$ X3 j0 z/ q8 L

9 D6 B, n6 l+ J$ M        到底有多快呢?我这么比喻一下吧,我的工作都是以纳秒为单位的,你们人间的一秒,我可能已经做了1000,000,000(10亿)次动作了。
" R% Z& c3 \" O1 W
  X% ]& {$ v8 |. S3 A$ P5 B
 cpu-floating.jpg CPU的自述
( X  [, Y3 I4 q$ ?, ?3 P# K
        相比而言,内存比我慢100倍,硬盘比我慢1000多万倍,你说我快不快?
! W# E( E! b# `5 A        6 C6 W: ]# {; w
启 动

2 b0 v7 S7 B% O7 ?+ L' ^0 }        我住在一个机箱里,每天早上一阵电流把我叫醒,还夹杂着嗡嗡的声音,我知道我忠实的护卫电风扇又开始工作了,我特别怕热,又运行的飞快,如果没有电风扇给我降温,我很快就会生病,生病的后果很严重,那就是我的伙伴们像内存了,硬盘了。。全部都要罢工了,没有我这个系统就会陷入的一片死寂。% I- R  X; ]. U: T2 r' W

+ O4 l; u7 a9 x+ o        我听说有些CPU的福利很好,竟然待在恒温恒湿,一尘不染的托管机房里,让我好生羡慕。/ W) g6 C* x2 }) K/ j( z! L1 ?
1 p6 @4 u9 g5 v. q8 ]7 O* l
        我的脑容量很小,所以醒来后只想起了我的创造者告诉我的几件事情:# _/ r% P5 s3 c' t7 \  u& Z# x  K( |
       
* T0 \8 K6 E# _, f8 g        1.你的工作就是运行指令3 ~" m% ?9 G8 j. K, p0 w0 ?
        2.你不能保存指令,你的指令全在内存里
! A. C+ j& n& H, O4 j2 x$ r4 _$ t        3.你的第一条指令在内存的最顶端处0xFFFFFFF0( |! S2 s7 B7 ]" F7 W- f. H  y

& |5 ]) k# W  J$ e6 n, F, X/ _# H
 cpu流程图.jpg CPU的自述
9 ^/ c2 |/ S9 b
        那还有什么可说的,赶紧打电话给内存要指令,电话通过系统总线,还得通过I/O桥电话局需要转接一下,再通过存储总线接通内存。
  ^) v, k$ i8 J: @0 {0 n+ \  _' f& q$ G4 C5 f! r
        "哥们,把这个地址处的指令给我说一下吧"
& r2 j- E- M7 Q# p% W  @( Y7 r. D3 ]$ r: L" U% D
        "你是谁?"内存竟然把我忘了,当然,他断了电和我一样,失忆了。#j347:" G3 D8 v) x0 c7 `

' ?+ a* e# X% Y        "我是阿甘啊,我们经常聊天来着,你忘了?"
. V9 S" }% B, K7 Q" b  i( p& V- a2 U5 {. @- c
        内存磨磨唧唧半天才把数据发了过来(比我慢100倍啊),这是一条跳转指令,我立刻回忆起来了,这是我的老朋友BIOS等着我去运行他那一堆指令呢。4 x! P' M4 C0 ^  L& z0 q$ w+ E. I

. y) p9 _" `4 G. U9 b4 F        我给BIOS打电话:“老弟,今天干点啥?”% i  u5 \* Z. v6 t
$ Z0 K) K1 [- [: ^  h5 e. h
        “阿甘,早上好"BIOS从不失忆,把所有人都记得清清楚楚“还不是老一套啊,无非做一下系统的自检,看看内存,硬盘,显卡等这些老伙计们有没有问题,有问题的话用小喇叭提示一下主人”
" G# f" f4 M3 u/ B3 S$ Q) D/ i$ G" N8 A- @% C, e
        这些过程我已经轻车熟路了,很快搞定,像往常一样,没有问题,我还把一个叫做中断向量表的东西给弄好了,我知道一会而要用
& z1 G1 M2 I) a  c) C  V& y0 w/ d6 h/ k* C3 L* b
        这些东西都搞完了,BIOS果然告诉:"阿甘,int 0x19"5 d9 Q; b, A  H. T0 |/ @: p8 q
: m( W5 g& v2 ^
        我赶紧去刚弄好的中断向量表中去查第19号,顺藤摸瓜又找到对应0x19的一大堆指令。' F9 w' k9 r, {# ~
% n9 b1 j, K1 ^- ]
        执行吧,这堆指令把将磁盘的第一扇区(磁盘最开始的512字节)运到内存的0X0000:0X7C00处,然后我就从此处接着执行。
" d/ X; W, I, |5 _
9 A/ m7 y$ e# j        我想起来了,接下来有一大堆精巧的指令把迷迷糊糊的操作系统从硬盘中唤醒,运输到内存中来。(此处实在是复杂,略去10万字。。。。)9 V7 O+ S$ @  f
* F+ ]& t5 L8 d5 u' ^5 l8 x7 {, y5 M  q
        你看这就是为啥他们叫我阿甘,我做事飞快,但非得别人告诉去哪里执行才行,要不然我就只会坐在那里无所适从。/ y# K" a; w0 ^, R1 _' }; ~" c
        / G! n1 N& W' R$ E
运 行
7 d9 _7 _& k3 b8 m+ c9 r
        操作系统一旦进入内存,立刻就是老大,所有人都得听他指挥。我也发现我的周围出现了一个屋子:进程屋。屋里堆着一大堆东西,什么进程描述信息包裹了,进程控制信息包裹了,我都不太关心,我只关心最最重要的两件东西:% `5 i8 ^/ N" M' t
       
( L6 r1 Q3 k- {: L! z  c        1.我工作必备的寄存器,就放在我面前的工作台上。) z# s" }5 q0 j. o
        2.程序计数器,我用它记住我要执行的下一条指令地址。
3 @5 k; x& q6 k4 }0 f& w5 ^6 {( J+ t! v' @5 ]7 g
        "阿甘,别来无恙啊",操作系统对我还是挺不错的,先给我打招呼。
3 x0 e0 }2 z7 @; G+ ~
' J. D. k6 T0 M4 g8 b        "Linux老大,今天有什么活啊",我每次都表现的积极主动。  C! g- o, `' ]- D% e4 ~
; @4 F4 y. }; ?
        "来,把这个hello world程序给运行了"。
8 U* d: D3 [* M7 R5 m+ X- k, {
8 C' y# p/ r8 }8 u- u$ W! W& v6 F        Hello world程序还在硬盘上睡着呢,得先把他也装载到内存里,要不然我怎么执行啊。于是我就拿起电话打给硬盘,电话通过系统总线来到IO桥电话局,再转接到IO总线,这才来到硬盘这里。( p* [! c( o# M1 C) }  m5 n

" a+ G* N5 Y9 K( ~" G# y        我在电话里请他把数据给我运过来,然后我就无所事事的坐在那里等。Linux老大立刻就怒了:阿甘,告诉你多少次了,你小子怎么还在等硬盘给你发数据!#j332:; w/ v# \6 d6 _" y; C/ n) Y
* s5 Z" Q. X8 }
        是的,我忘了一件事,硬盘比我慢太多了,我执行一条指令大概是1ns,在用来读磁盘的16ms里,我能潜在的执行1600多万条指令啊。2 q" w# D3 E, e" o2 w3 q5 H

0 z! O5 ?3 M  b/ S6 m! r' \        我感到深深的愧疚,赶紧拿起电话打给硬盘:哥们,按我们之前商量好的,用直接内存访问(DMA)啊,你直接把数据装载到内存吧,不用经过我了,装载完成以后给我发个信号。
# K- r$ r# d" G( ?* ~1 G" Q* _: X6 i) w1 C. Y
        "这还差不多"!Linux老大心情好了些。
: Q. Y# u8 V/ T0 B) V       
# X& {/ n) J8 W; z4 ~        “阿甘,数据还没来,别闲着,这有一个菲波那切数列数列,来算一下吧”。2 n, o7 h! P: \3 ?

# k7 W7 M- [9 [        "肥波纳妾数列?这名字好古怪,老大,其实你也知道,我脑子小,懒得去理解那是啥意思,你把进程屋切换下,把程序计数器设置好,指向下一条指令,我一条条指令执行就得了“我挺没追求的。
  Y1 g* C7 `0 F! d0 o4 K3 A
, a3 f' I/ M/ p+ |        "真是个阿甘啊!”老大感慨到。
) U4 K% Q: b, u) J) B
- B. j/ p& W: J: ]: }3 X( a        我所处的进程屋立刻发生了变化(当然,这也是我辅助Linux老大干的),各种包裹的信息都变了,尤其是寄存器和程序计数器。
" K$ H& Y0 N0 o% ?
; [" ]% D9 |8 I3 `        于是我就开始计算这个什么纳妾数列,但是这个数列似乎无穷无尽,哪个无脑子的程序员写了个无限循环吧。正在这时,我便收到了一个电话,说是Hello world的数据已经装载到内存了,让我去处理。
0 V) [3 |1 S  F" `8 W: {6 K- K/ q6 K( e
        我放下手中的活,保存好现场,就去处理那个Hello world,果然数据已经都好了,那就切换过去运行吧。其实老大并不知道,任何人,只要你运行了相当多的数量的指令以后,你都能悟到这些程序的秘密。
$ @) v2 k# U5 H& X       
  i1 C- q# ]0 k8 u/ {$ w        我CPU阿甘虽然傻傻的,但也架不住执行这数以万万亿的指令给我的熏陶啊。这个秘密就是:程序都是由顺序,分支,循环来组成的。其实分支和循环在我看来都是跳转而已。0 @% ]' b* _# K$ X8 n' S0 X5 l0 c

/ s- p- ]1 q+ c8 F0 c$ ^        所以我的工作就是打电话问内存要一条指令,执行这个指令,如果是个跳转指令的话,我就问内存要跳转的目标地址的那一条指令,继续执行,生活就是这么简单。
4 }. o0 ]) G' C7 y0 h+ H. h( v. f+ x2 ~, G
        奥对了,当然也有复杂的,就是函数调用,我得和内存紧密配合才能完成。这个咱下回再说。3 b) X; I* [# ]9 ?$ ^% h
       
) X; z& }* h4 {2 L: j7 _
新 装 备——缓 存

5 ~0 d8 a- [) e: w$ G        提到内存,这真是我的好哥们,没有他,我几乎什么事儿都干不成,更重要的是他比硬盘快的多,读取一次数据,只需要100纳秒左右。这样我们俩说起话来就轻松多了。( U+ v( A) M- i2 J
" H8 G' C! p  A% X
        每次他都说:"阿甘,幸亏有你给我聊天,要不然我肯定被活活的闷死不可,那个硬盘说话是在太慢了"
! b" k! a1 h0 E: u
+ k8 ~, b7 ~2 `        "它为啥那么慢?"我每次都问。5 S/ F7 r& V+ Z. _3 p

( B7 Y: Q# @& I. W4 Z        "硬盘是个机械是的玩意,一个磁头在一碟高速旋转的磁片上挪来挪去,光定位就慢死了"。5 A. Y/ i- E* n+ v0 i
- M0 N( I( m- ~6 ^& T) G4 a  h8 F
        "那主人为什么要用硬盘?") t+ `3 S) V/ t( m; O% b

; z. b7 O) |# _        "人家虽然慢,但是不怕停电,哪像你和我,一停电全部都失去记忆了。"
* A' r6 c+ ^# C
* n# U' i  a* h        确实是,人不能把好事都占全了啊。9 K# {! P) W4 `! }

! S, L4 p0 e( @. J7 c        我的指令中有些完全用我的寄存器就能完成,但是有很多都需要读写内存的数据,再加上所有的指令都在内存中存着,虽然它只比我慢个100倍,但指令多了我还是有点受不了。3 x6 n8 Q3 m9 A% C. Q, d7 g- }

1 A# s9 _% |4 A/ U        我给内存说:"哥们,你能不能再快点!"9 R6 u8 k+ C9 s* [; Y7 f, M! t" E

/ t, p" V# g. m$ U        内存说:拜托,这已经是我的极限了,阿甘,你自己再想想办法吧!我给你说啊,我留意了你最近访问的指令和数据,我发现了个规律“。
+ z. B, ^1 |0 a8 Z. s
2 {. S) l1 \7 z' y" ?        "啥规律?". ~3 ^8 E4 S* l' G: O" e: J$ ~
/ ~; |& i" R6 L" r
        "比如说吧,你访问了我一个内存位置以后过不多久还会多次访问,还有,一个内存位置被访问了,附近的位置很快也会访问到"(这其实叫程序的局部性原理)。
) H( |+ r+ W3 T! {6 Y0 ]+ @. G/ a8 r+ x( e
        我还以为是啥规律,其实我早就注意到了。
/ w; m/ j/ K2 k7 q
9 n6 L! L0 D# c# Q1 K- H1 N        "这有啥用啊?”
% [: ]. V' m3 l$ ?5 j$ I8 E3 J% }# M! ^; ^
        "既然你经常访问同一块区域的东西,你想想如果把这些东西缓存在你那里会怎么样...."
: W. }( ^. ]+ G4 y( @3 |- Y8 x% q) u
        我一想有道理啊!加个缓存试试!; g; c, `  e& n2 P% q5 Y' @. w

4 z5 I# D+ O# v& f3 S, d        从此以后,我每次读写指令和数据,都问缓存要,缓存没有才给内存打电话。/ B+ c/ F2 @& k* {5 W; |) j

7 ^2 Y; c' l, P& M" p8 m6 a, T$ D        果然,由于局部性原理的存在,我发现的确是快了不少啊。* ~4 F( }: {% N- Z- z0 `2 K/ X! S

; K' }# [. d9 ?* s1 Q( A        当然也有缺点,那就是Linux老大在做程序切换的时候,缓存就会失效,因为两个程序之间没什么联系,局部性原理不起作用,所以需要重建缓存。
" f4 U. q0 s3 E# l  }% C. Y5 F( R# Y$ |1 l- |- m
自 我 提 升——流 水 线

4 k- @8 N: _9 o$ |& {        缓存让我的工作更有效率,得到了Linux老大的表扬:"阿甘,我看你很聪明嘛,都会用缓存了"。
5 ?0 A& M- e  h+ X4 J3 X3 H& s; B) k  v& w) P
        "我哪有那么聪明,都是内存的点子。老大,不过我学会了一个重要的东西:当你改变不了别人的话,抱怨也没用,还是先改变一下自己吧"。
, [: ]  k* X  y# U: ?6 Z  ^# e2 h. t/ [# I
        "挺有哲理的吗,希望你明天重启后还能想起来!#379:"# E1 x: D5 @' C/ F# p$ X
  B$ e5 O7 m0 U% F" ?
        "我最近又发现了一个问题,正苦恼着呢,你看我有四只手,第一只手负责打电话问内存要指令,第二只手翻译指令,第三只手真正执行,第四只手有时候还得把结果写回内存。问题是,我发现经常只有一只手在忙活,其他都在闲着,你看第一只手取指令,其他手只能等着。第二只手翻译指令的时候,其他三只也得等“+ }! x, z7 H. P# T2 e
7 l! {1 Y! E/ P7 @$ `) h
        "看来以后我们不能叫你阿甘了,你已经开始思考了!#392:"
$ g5 h6 Q. y/ k% u# b3 Z+ E7 V2 {% M* b. N) }
        “这问题好解决,给你举个例子,你听说过洗车没有?和你差不多,也是先喷水,再打洗洁剂,再擦洗,最后烘干,但人家的工作方式和你不一样,人家是流水线作业,你想想,一辆车在烘干的时候,后边是不是还有三辆车,分别在喷水,打清洁剂和擦洗,每个步骤都不会空闲。”; r5 Z3 ?5 u& y6 P/ a% [$ a
( q* D9 ]) z+ O8 v) k. d: R
        "这么简单的道理我怎么都没有想到呢?我也可以搞个流水线啊,这样每只手都利用起来了"
) e' g# N$ y: {1 C! A& R9 ^" w. T# r$ N  [, T
        别人都说我们高科技,但其实原理都蕴含在生活之中啊。
' _, l+ E5 u) M! I6 W  h5 ]1 c. o% {: L& w2 G8 i: |4 x$ C: L2 m
        有了缓存和流水线的帮助,让我的工作大大的加快了,大家都对我刮目相看。 他们想给我起个新名字:超人,不过我还是更喜欢他们叫我“阿甘”,多亲切。' s+ E; G" Z- J, A
       
* m3 n2 h7 s; i- }8 Q
尾 声
3 o  \, S: P0 L$ D/ J' E
        我一丝不苟,兢兢业业的运行指令,时不时和伙伴们聊天,很快一天就过去了,又到了晚上,我知道关机的时刻到了,赶紧挨个给他们道别。: M/ \/ q6 d2 f% B" Y
9 V0 _( q( f, a- u
        很快那些让我兴奋的电流消失了,风扇的嗡嗡声也没有了,我再也无法打出电话,整个世界沉寂了。明天将会是新的一天。0 a  |" W9 \* S: m

$ i2 |4 z0 I1 v* [

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

本版积分规则

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

GMT+8, 2019-9-21 07:00 , Processed in 0.048314 second(s), 35 queries , Gzip On, Redis On.

© 2015-2019 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表