深入浅出计算机组成原理
徐文浩
bothub创始人
立即订阅
13019 人已学习
课程目录
已完结 62 讲
0/4登录后,你可以任选4讲全文学习。
入门篇 (5讲)
开篇词 | 为什么你需要学习计算机组成原理?
免费
01 | 冯·诺依曼体系结构:计算机组成的金字塔
02 | 给你一张知识地图,计算机组成原理应该这么学
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
04 | 穿越功耗墙,我们该从哪些方面提升“性能”?
原理篇:指令和运算 (12讲)
05 | 计算机指令:让我们试试用纸带编程
06 | 指令跳转:原来if...else就是goto
07 | 函数调用:为什么会发生stack overflow?
08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
09 | 程序装载:“640K内存”真的不够用么?
10 | 动态链接:程序内部的“共享单车”
11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
13 | 加法器:如何像搭乐高一样搭电路(上)?
14 | 乘法器:如何像搭乐高一样搭电路(下)?
15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
原理篇:处理器 (18讲)
17 | 建立数据通路(上):指令+运算=CPU
18 | 建立数据通路(中):指令+运算=CPU
19 | 建立数据通路(下):指令+运算=CPU
20 | 面向流水线的指令设计(上):一心多用的现代CPU
21 | 面向流水线的指令设计(下):奔腾4是怎么失败的?
22 | 冒险和预测(一):hazard是“危”也是“机”
23 | 冒险和预测(二):流水线里的接力赛
24 | 冒险和预测(三):CPU里的“线程池”
25 | 冒险和预测(四):今天下雨了,明天还会下雨么?
26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
27 | SIMD:如何加速矩阵乘法?
28 | 异常和中断:程序出错了怎么办?
29 | CISC和RISC:为什么手机芯片都是ARM?
30 | GPU(上):为什么玩游戏需要使用GPU?
31 | GPU(下):为什么深度学习需要使用GPU?
32 | FPGA和ASIC:计算机体系结构的黄金时代
33 | 解读TPU:设计和拆解一块ASIC芯片
34 | 理解虚拟机:你在云上拿到的计算机是什么样的?
原理篇:存储与I/O系统 (17讲)
35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
36 | 局部性原理:数据库性能跟不上,加个缓存就好了?
37 | 高速缓存(上):“4毫秒”究竟值多少钱?
38 | 高速缓存(下):你确定你的数据更新了么?
39 | MESI协议:如何让多核CPU的高速缓存保持一致?
40 | 理解内存(上):虚拟内存和内存保护是什么?
41 | 理解内存(下):解析TLB和内存保护
42 | 总线:计算机内部的高速公路
43 | 输入输出设备:我们并不是只能用灯泡显示“0”和“1”
44 | 理解IO_WAIT:I/O性能到底是怎么回事儿?
45 | 机械硬盘:Google早期用过的“黑科技”
46 | SSD硬盘(上):如何完成性能优化的KPI?
47 | SSD硬盘(下):如何完成性能优化的KPI?
48 | DMA:为什么Kafka这么快?
49 | 数据完整性(上):硬件坏了怎么办?
50 | 数据完整性(下):如何还原犯罪现场?
51 | 分布式计算:如果所有人的大脑都联网会怎样?
应用篇 (5讲)
52 | 设计大型DMP系统(上):MongoDB并不是什么灵丹妙药
53 | 设计大型DMP系统(下):SSD拯救了所有的DBA
54 | 理解Disruptor(上):带你体会CPU高速缓存的风驰电掣
55 | 理解Disruptor(下):不需要换挡和踩刹车的CPU,有多快?
结束语 | 知也无涯,愿你也享受发现的乐趣
免费
答疑与加餐 (5讲)
特别加餐 | 我在2019年F8大会的两日见闻录
FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜
FAQ第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?

徐文浩 2019-04-29
“性能”这个词,不管是在日常生活还是写程序的时候,都经常被提到。比方说,买新电脑的时候,我们会说“原来的电脑性能跟不上了”;写程序的时候,我们会说,“这个程序性能需要优化一下”。那么,你有没有想过,我们常常挂在嘴边的“性能”到底指的是什么呢?我们能不能给性能下一个明确的定义,然后来进行准确的比较呢?
在计算机组成原理乃至体系结构中,“性能”都是最重要的一个主题。我在前面说过,学习和研究计算机组成原理,就是在理解计算机是怎么运作的,以及为什么要这么运作。“为什么”所要解决的事情,很多时候就是提升“性能”。

什么是性能?时间的倒数

计算机的性能,其实和我们干体力劳动很像,好比是我们要搬东西。对于计算机的性能,我们需要有个标准来衡量。这个标准中主要有两个指标。
第一个是响应时间(Response time)或者叫执行时间(Execution time)。想要提升响应时间这个性能指标,你可以理解为让计算机“跑得更快”。
图中是我们实际系统里性能监测工具 NewRelic 中的响应时间,代表了每个外部的 Web 请求的执行时间
第二个是吞吐率(Throughput)或者带宽(Bandwidth),想要提升这个指标,你可以理解为让计算机“搬得更多”。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(88)

  • 活的潇洒 置顶
    运行的代码是:
    [root@nfs ~]# time seq 1000000 | wc -l
    1000000

    real 0m0.058s
    user 0m0.047s
    sys 0m0.044s
    为什么user + sys 运行出来会比real time 多呢

    作者回复: 因为你在一台多核或者多cpu的机器上运行,seq和wc命令会分配到两个cpu上,user和sys是两个cpu时间相加的,而real只是现实时钟里走过的时间,极端情况下user+sys可以到达real的两倍

    2019-04-30
    82
  • 趁早 置顶
    time seq 100000 | wc -l
    100000

    real 0m0.006s
    user 0m0.003s
    sys 0m0.004s

    我也是类似的问题,操作系统centos7.4,物理环境阿里云ecs
    cpu 信息
    Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz

    作者回复: 我知道原因了,这个的确是因为“并行原因”的运行的。虽然seq和wc这两个命令都是单线程运行的,但是这两个命令在多核cpu运行的情况下,会分别分配到两个不同的cpu,于是user和sys的时间都是两个cpu上运行的时间之和,就可能超过real的时间。你可以这样来快速验证
    运行
    time seq 100000000 | wc -l &
    让这个命令多跑一会儿,并且在后台运行。
    然后利用 top 命令看不同进程的cpu占用情况,你会在top的前几行里看到seq和wc的cpu占用都接近100,实际是各被分配到了一个不同的cpu执行。

    我写文稿测试的时候开了一个1u的最小的虚拟机,只有一个cpu所以不会遇到这个问题。

    2019-04-29
    1
    18
  • 大雄逸豪
    搞明白这个事实就好了,一个程序对应多条语句,一条编程语句可能对应多条指令,一条CPU指令可能需要多个CPU周期才能完成。

    作者回复: 👍

    2019-05-13
    26
  • changing
    运行的代码是 time seq 100000 | wc -l
    real 0m0.033s
    user 0m0.030s
    sys 0m0.005s
    为什么user + sys 运行出来会比real time 多呢

    作者回复: changing同学你好,一般情况下,如果user+sys比real大,甚至光光user比real大的情况出现,都是因为对应的程序被多个进程或者多个线程并行执行了,也很常见。不过你遇到的这个问题的确有些奇怪,我要研究一下,因为linux下的seq和wc这些命令按照我的理解都是单线程运行的。
    能告诉我你使用的硬件和操作系统么?

    2019-04-29
    24
  • 易儿易
    老师,针对“主频越高,意味着这个表走得越快,我们的 CPU 也就“被逼”着走得越快。”这句话我有一点儿疑惑:
    时钟周期时间为1/2.8G 秒,代表CPU最细粒度时间,即一次晶振的时间
    这个周期时间和指令执行的耗时有直接关系吗?我说的直接关系指的是比如“一次晶振时间可以固定完成n个CPU(最简单的)指令”这种,如果有关系的话,那可以很明确的得出这个表走的快,CPU执行就快,毕竟单位时间内执行的指令数固定,通过降低单位时间就可以提升效率。
    但是文中好像并没有提到这个直接关系,所有我可不可以这么去理解,晶振时间变短后,CPU调度指令的周期变短频次变高,使得上一个指令执行完毕到下一个指令被调动期间的等待时间变短,从而提升了CPU的利用率。好比一个监工增加了抬头看监控视频的频率,一旦有员工手停下来能立马给安排任务,主频低的话,可能员工休息半天才会被发现。另外,这种情况下,似乎主频提升的倍率并不能与性能提升带来1:1的效益。
    1.晶振时间与CPU执行固定指令耗时成正比
    2.晶振时间降低使CPU调度指令的周期变短频次变高
    这两种哪一种对呢?还是都错?请指点~
    ——————————
    又看了一遍,感觉刚刚对CPI的概念误读了,其实晶振时间是固定处理一个cpu简单指令的,CPI的平均时间是用来描述复杂指令的,指令数同样也是,其实整个公式如果用用简单指令来描述可能更容易理解一些

    作者回复: 易儿易同学你好,这个问题提的得非常好,你学得和思考得都很仔细深入。1的理解更准确一点,我们为了理解简单可以暂且认为就是晶振在触发一条一条电路变化指令,就好像你拨算牌盘的节奏一样。算盘拨得快,珠算就算得快。结果就是一条简单的指令需要的事件就和一个时钟周期一样,实际这个问题要比这样一句话复杂很多。一方面,其实时钟周期应该是放下最复杂的一条指令的时间长度。我们是通过流水线来提升cpi的。我会在讲解cpu的部分更深入讲解始终信号和计数器,让大家能够理解cpu到底是怎么回事儿。

    2019-05-01
    2
    17
  • Only now
    猜测,跑分程序载入后,停止操作系统的线程调度或者给最高优先级和响应中断,全力跑跑分。暂时提高时钟频率,停止温度检测和低级中断,这样CPU就全力在跑测试程序了吧。

    没做过弊,猜测

    作者回复: 👍监测到跑分程序在运行进行超频或者过热也不降频是一种常见的作弊手段

    2019-04-30
    16
  • KR®
    又重刷了一遍前四讲, 徐老师讲得又清惜又易懂,老师备课花了不少心血吧…
    现在等待更新的心情就像追了一部超高分剧等更一样!!辛苦徐老师备课喇^^

    作者回复: 谢谢支持😊

    2019-04-30
    13
  • 霹雳
    用户态运行和系统内核运行这两个什么区别呢

    作者回复: 霹雳同学你好,

    关于用户态运行和系统内核运行,如果要深入了解的话,可以去看看刘超老师的 《趣谈Linux操作系统》。

    如果简单讲一下的话,就是我们的程序实际在操作系统里面是运行在“保护模式”下的,很多指令我们的应用程序并没有权限去操作执行,需要切换到内核态,由操作系统去执行,比如说操作硬件的时候。

    2019-05-02
    11
  • humor
    对于文中的CPU钟表时间间隔和时钟周期还是没有理解很清楚,时间间隔和时钟周期是互为倒数的关系吗?就是CPU主频是一个单位时间,而时钟周期就是这个单位时间被分成主频(2.8G)等份的一份吗?

    作者回复: humor同学你好,如果我没理解错你的意思的话,你的理解是对的。CPU主频是一个频率(frequency),频率的单位叫做赫兹(Hz)。意思是一秒内这个事情可以发生多少次。主频2.8GHz就代表一秒内晶振振动了2.8G次,这里的G其实就是10亿次,也就是28亿次。那么我们的时钟周期时间就是1/28亿秒。

    2019-04-30
    11
  • imicode
    1. 打卡总结:
    性能的CPU有两个重要的指标,响应时间和吞吐率。在这两个重要指标下,要提升性能,核心是优化CPU的执行时间,而CPU执行时间公式如下:

    程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time

    2. 关于作弊
    要提高跑分,无非是优化CPU的执行时间,可以从两个方面入手,一是提高CPI,可以采取超频运行的模式;二是优化指令数,单独针对特定的CPU进行代码优化。

    作者回复: 👍

    2019-05-14
    1
    9
  • 秦晋
    看到cpu指令这一块,我想起了精简指令和复杂指令,执行同样的任务,精简指令需要的条数少,复杂指令需要的多,是不是说同样的任务,放在同样频率的精简指令cpu和复杂指令cpu上执行,精简指令cpu的执行效率高?

    作者回复: 秦晋同学,某种程度上来说,你理解反了。精简指令集意味着cpu从硬件或者电路层面支持的指令数比较少。这个意味着很多复杂的操作需要执行更多的指令而不是更少的。
    执行效率这个问题更复杂一些,精简指令也许更容易提高频率或者利用流水线等等,只能说具体问题具体分析。现在更多地是出于一个“混合”的状态

    2019-05-12
    4
  • 潜默闻雨
    徐老师,程序的cpu执行时间是不是由很多cpu时间片组成,而cpu并不知道自己在执行哪个程序的指令,只是按时间片去按顺序执行指令,不知道这样理解对不对?非科班的转行人士,正在努力补基础😅。。。

    作者回复: 潜默闻雨同学你好,这个理解没错。到了cpu层面只有一条条机器码的指令,它并不关心这个指令具体是从哪个程序里来的。

    2019-04-29
    4
  • Guarantee
    老师,单个CPU的主频是有上限的,所以出现了多核CPU进行计算,为了提高更多的计算,是不是就要运用分布式计算这个技术。

    作者回复: 是的

    2019-05-17
    3
  • 彩色的沙漠
    老师您好,原文中有关于主频的描述如下:
    这里的 2.8GHz 就是电脑的主频(Frequency/Clock Rate)。这个 2.8GHz,我们可以先粗浅地认为,CPU 在 1 秒时间内,可以执行的简单指令的数量是 2.8G 条。

    如果想要更准确一点描述,这个 2.8GHz 就代表,我们 CPU 的一个“钟表”能够识别出来的最小的时间间隔。
    问题是"这个 2.8GHz 就代表,我们 CPU 的一个“钟表”能够识别出来的最小的时间间隔。"不应该是主频的倒数是最小的时间间隔吗?

    作者回复: 彩色的沙漠同学你好,你的描述的确更加准确一些

    2019-05-14
    3
  • 爷爷刘大
    changing 同学的问题在stackoverflow 上的解释是这样的:
    The rule of thumb is:

    real < user: The process is CPU bound and takes advantage of parallel execution on multiple cores/CPUs.
    real ≈ user: The process is CPU bound and takes no advantage of parallel exeuction.
    real > user: The process is I/O bound. Execution on multiple cores would be of little to no advantage.

    https://unix.stackexchange.com/questions/40694/why-real-time-can-be-lower-than-user-time

    作者回复: 嗯,但是核心问题是按理一般seq和wc都不是并行运行的,我需要看一下是为什么

    2019-04-30
    3
  • SUN
    文章思路非常清晰,很棒
    2019-04-29
    3
  • Geek_63ad86
    老师我尝试了用自己的话理解一下您讲授的内容:
    度量一个程序运行的时间T需要知道该程序有几条指令(n),每一个指令平均需要几个基本操作才能执行完毕(k),cpu执行一个基本操作的耗时(t),从而T = n*k*t,t作为SE一般是无法提升的,除非改进硬件,所以缩短运行时间可能主要还是从n、k入手。不知道这样理解是否正确?
    此外,跑分“作弊”我猜测是利用软件暂时提升手机性能,但是性能只是衡量手机的一个维度,在不同使用场景下手机的流畅性和稳定性也是需要考虑的,“作弊”跑分的参考价值不大,对于十分注重跑分的用户作弊的跑分可能会对他们产生很强的欺骗性。

    作者回复: 👍你的理解是正确的

    2019-05-15
    2
  • Ant
    时钟周期是啥意思

    作者回复: Ant同学你好,时钟周期,是CPU内部通过一个反馈电路形成的一个“晶振”的产生反复的0/1电路信号的一个频率,在17讲讲解CPU的时候,我们还会深入讲解一下时钟周期是怎么回事儿。

    2019-05-06
    2
  • txhh
    time seq 100000 | wc -l
    100000

    real 0m0.003s
    user 0m0.003s
    sys 0m0.003s
    虚拟机上的CentOS 7.5 i7 6700HQ

    作者回复: 我知道原因了,这个的确是因为“并行原因”的运行的。虽然seq和wc这两个命令都是单线程运行的,但是这两个命令在多核cpu运行的情况下,会分别分配到两个不同的cpu,于是user和sys的时间都是两个cpu上运行的时间之和,就可能超过real的时间。你可以这样来快速验证
    运行
    time seq 100000000 | wc -l &
    让这个命令多跑一会儿,并且在后台运行。
    然后利用 top 命令看不同进程的cpu占用情况,你会在top的前几行里看到seq和wc的cpu占用都接近100,实际是各被分配到了一个不同的cpu执行。

    我写文稿测试的时候开了一个1u的最小的虚拟机,只有一个cpu所以不会遇到这个问题。

    2019-04-30
    2
  • 脊椎疼
    同学们问题好多啊,老师压力山大啊!

    作者回复: 欢迎大家踊跃提问参与讨论!

    2019-04-30
    2
收起评论
88
返回
顶部