目录
前言
一、为什么要学习计算机组成原理
二、如何学习计算机组成原理
三、计算机的硬件设备组成
CPU
内存
主板
显卡
四、冯·诺依曼体系结构
五、计算机性能
六、计算机功耗
前言
记得吴军博士说过,上帝喜欢“笨人”。左耳朵浩子也说过类似的观点,这个世界上聪明的人太多,真正肯下苦功夫的“笨人”太少了。这段时间,停更了许久,迷茫与低沉如影随形。终于下定决心,踏踏实实把基础知识整理了。
引用浩子叔的一个观点来勉励自己:各种技术方向不是鱼和熊掌,是可以兼得的;很多技术是相通的,关键是你是学在表面还是深入本质。
平凡还是卓越?自在悠闲还是猛啃书本,不破楼兰终不还?
一、为什么要学习计算机组成原理
出来混,欠下的债迟早要还的,趁还年轻,现在就把债清清吧。
主观原因
- 心里没谱,这几年一直在从事业务相关的开发工作,技术上感觉进步不大,很多东西只停留在应用层面上。
- 学生时代这些理论课几乎只是为了应付考试,现在想趁着还年轻,把地基打牢,以备不时之需。
- 养成能静下心攻克理论知识的习惯。
客观原因
- 计算机组成原理是软件与硬件之间的桥梁,学好计原,可以比较清楚计算机硬件相关技术以及方便对硬件相关接口进行软件开发。
- 计算机业务层的相关技术随着时间的推移不断在变化,如果想从容地应对这些新技术,比较好的方法是把基础学科学好,而计原正是这其中一门基础学科。
- “练拳不练功,到老一场空” 。越早去弄清楚计算机的底层原理,在自己的知识体系中“储蓄”起这些知识,也就意味着有越长的时间来收获学习知识的“利息”。
计算机组成原理在整个软件开发领域的地位如图所示
二、如何学习计算机组成原理
计算机组成原理到底学些什么呢
推荐的书籍
- 入门的:《计算机是怎样跑起来的》、《程序是怎样跑起来的》
- 深入的:图灵奖作者写的《计算机组成与设计:硬件 / 软件接口》、《深入理解计算机系统》、《计算机组成:结构化方法》
- 课外的:《程序员的自我修养:链接、装载和库》
三、计算机的硬件设备组成
- 计算机最核心的三大部件自然是:内存、CPU、主板。
CPU
- 中央处理器,全称:Central Processing Unit。计算机中关于计算方面的都放在这里面运行。
- 在硬件上,我们是通过最基本的与、或、非、异或门这些最基础的门电路组合形成了强大的 CPU。
CPU样图如下所示:
内存
- 程序需要加载到内存方可运行,因此在我们购买电脑时总是特别在意内存的大小,因为内存越大意味着可同时执行的程序或软件就越多越顺畅。内存一般是直接插在主板上的。内存样图如下:
主板
- CPU与内存等各种小部件是需要插在主板上方可解决它们之间的通信问题。
- 主板的芯片组(Chipset)和总线(Bus)解决了 CPU 和内存之间如何通信的问题。
- 芯片组控制了数据传输的流转,也就是数据从哪里到哪里的问题。
- 总线则是实际数据传输的高速公路。因此,总线速度(Bus Speed)决定了数据能传输得多快。
常见的主板如下图所示:
通常有了上述三大部件计算也就可以运行起来了,但对于我们普通用户来说,往往还需要输入设备与输出设备以及存储设备,也就是通常的键盘、鼠标、显示器、硬盘。
除了上述常见主件,还有一个比较特殊的设备那就是显卡。
显卡
- 显卡又称为显示卡( Video card),是计算机中一个很重要的组成部分,承担输出显示图形的任务,对于喜欢玩游戏和从事专业图形设计或者是跑深度学习应用的人来说,显卡非常重要。显卡由GPU、显存、电路板,还有BIOS固件组成的,其中GPU为显卡的核心组件。由于显卡主要是通过GPU来工作的,因而通常有人把GPU直接当做显卡。
- 目前主流显卡的显示芯片主要由NVIDIA(英伟达)和AMD(超威半导体)两大厂商制造,通常将采用NVIDAI显示芯片的显卡称为N卡,而将采用AMD显示芯片的显卡称为A卡。
- 显卡之所以特殊,是因为显卡里有另一个“处理器”,也就是 GPU(Graphics Processing Unit,图形处理器),GPU 一样可以做各种“计算”的工作。
集成显卡与独立显卡的区别:
- 简单的来说集成显卡和独立显卡都是显卡的一种,是电脑进行数模信号转换的设备,承担输出显示图形的任务。
- 1. 集成显卡是内置于主板上的,没有显存,需要使用系统内存,一般GPU和CPU集成在一起了,如下是某计算机集成显卡的信息
- 2. 独立显卡是单独插入在主板上的,可随时根据需要更换,如下是某计算机显卡信息
四、冯·诺依曼体系结构
- 什么是冯·诺依曼体系结构:准确来说就是CPU 、输入输出设备、存储设备;
直观的呈现如下图所示:
五、计算机性能
通常衡量计算机的性能有两个重要指标,分别是响应时间、吞吐率。
响应时间:执行指定程序运行的快慢;
吞吐率:一定的时间范围内,处理事情的多少;
性能:一般把响应时间的倒数定义成性能;
性能 = 1/ 响应时间
1. 如何提升吞吐率?
- 缩短程序的响应时间,一般来说都会提升吞吐率。和搬东西来做对比,如果我们的响应时间短,跑得快,我们可以来回多跑几趟多搬几趟。但是响应时间的提升却没有那么容易,因为 CPU 的性能提升其实在 10 年前就处于“挤牙膏”的状态了,所以我们得慎重地来分析对待。
- 堆硬件,类似现代的服务器都是 8 核、16 核的。人多力量大,同时处理数据,在单位时间内就可以处理更多数据,吞吐率自然也就上去了。
2. 何为计算机CPU时钟周期?
CPU时钟周期通常为节拍脉冲或T周期,既主频的倒数,它是处理操作的最基本的单位。
程序启动后,根据时钟信号,CPU中的控制器会从内存中读取指令和数据。
3. 虽然时间是一个很自然的用来衡量性能的指标,但是用时间来衡量时,有两个问题。
- 1. 第一个原因就是时间不“准”。统计时间是用类似于“掐秒表”一样,记录程序运行结束的时间减去程序开始运行的时间。这个时间也叫 Wall Clock Time 或者 Elapsed Time,就是在运行程序期间,挂在墙上的钟走掉的时间。
- 2. 第二个原因即使拿到了 CPU 时间也不一定可直接“比较”出两个程序的性能差异。即使在同一台计算机上,CPU 可能满载运行也可能降频运行,降频运行的时候自然花的时间会多一些。
时间不准的原因:
- 在程序执行的这段时间内,CPU实际上是可能不断在各个进程间切换。
- 程序在运行的时候,还有可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和 CPU。所以说,要想准确统计某个程序运行时间,进而去比较两个程序的实际性能,我们得把这些时间给刨除掉。
可应用Linux 下有一个叫 time 的命令,分析程序实际在 CPU 上到底花了多少时间。
Linux time 如下:
[root@xxx ~]# time seq 1000000 | wc -l 1000000
real 0m0.637s
user 0m0.651s
sys 0m0.001s
- 第一个是 real time,也就是我们说的 Wall Clock Time,也就是运行程序整个过程中流逝掉的时间;
- 第二个是 user time,也就是 CPU 在运行你的程序,在用户态运行指令的时间;
- 第三个是 sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的时间。
而程序实际花费的 CPU 执行时间(CPU Time),就是 user time 加上 sys time。
4.为什么 user time 加上 sys time 大于 real time?
主要是由于程序是“并行”运行的。
虽然seq和wc这两个命令都是单线程运行的,但是这两个命令在多核cpu运行的情况下,
会分别分配到两个不同的cpu,于是user和sys的时间都是两个cpu上运行的时间之和,就可能超过real的时间。
运行
time seq 100000000 | wc -l &
让这个命令多跑一会儿,并且在后台运行。
然后利用 top 命令看不同进程的cpu占用情况,你会在top的前几行里看到seq和wc的cpu占用都接近100,实际是各被分配到了一个不同的cpu执行。
5. 用户态运行和系统内核运行这两个什么区别呢?
简单来讲就是程序实际在操作系统里面是运行在“保护模式”下的,很多指令我们的应用程序并没有权限去操作执行,需要切换到内核态,由操作系统去执行,比如说操作硬件的时候。
结合上述,除了 CPU 之外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响。
所以,需要对“时间”这个可以感知的指标进行拆解,把程序的 CPU 执行时间变成 CPU 时钟周期数(CPU Cycles)和 时钟周期时间(Clock Cycle)的乘积。
程序的 CPU 执行时间 = CPU 时钟周期数 × 时钟周期时间
时钟周期时间:相当于电脑CPU主频的倒数,如Intel Core-i7-7700HQ 2.8GHz,这里的 2.8GHz 就是电脑的主频(Frequency/Clock Rate)。这个 2.8GHz,可以先粗浅地认为,CPU 在 1 秒时间内,可以执行的简单指令的数量是 2.8G 条,这里的G是指10亿条。在这个 2.8GHz 的 CPU 上,这个时钟周期时间,就是 1/2.8G。
对于 CPU 时钟周期数再做一个分解,把它变成“指令数×每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI)”。
不同的指令需要的 Cycles 是不同的,加法和乘法都对应着一条 CPU 指令,但是乘法需要的 Cycles 就比加法要多,自然也就慢。在这样拆分了之后,我们的程序的 CPU 执行时间就可以变成这样三个部分的乘积。
程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time
因此,如果想要解决性能问题,其实就是要优化这三者。
- 时钟周期时间,就是计算机主频,这个取决于计算机硬件。我们所熟知的摩尔定律就一直在不停地提高我们计算机的主频。
- 每条指令的平均时钟周期数 CPI,就是一条指令到底需要多少 CPU Cycle。现代的 CPU 通过流水线技术(Pipeline),让一条指令需要的 CPU Cycle 尽可能地少。
- 指令数,代表执行的程序到底需要多少条指令、用哪些指令。这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。
六、计算机功耗
CPU一般都被叫作超大规模集成电路(Very-Large-Scale Integration,VLSI)。这些电路,实际上都是一个个晶体管组合而成的。CPU 在计算,其实就是让晶体管里面的“开关”不断地去“打开”和“关闭”,来组合完成各种运算和功能。
想要计算得快,一方面,我们要在 CPU 里,同样的面积里面,多放一些晶体管,也就是增加密度;另一方面,我们要让晶体管“打开”和“关闭”得更快一点,也就是提升主频。而这两者,都会增加功耗,带来耗电和散热的问题。
一个 CPU 的功率,可以用这样一个公式来表示:
功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量
那么降低功耗可以从如下方面下手
- 地增加晶体管数量;同样的面积下,想要多放一点晶体管,就要把晶体管造得小一点。这个就是平时我们所说的提升“制程”。
- 提升主频,让开关的频率变快;也就是买CPU主频更高的电脑。
- 降压,这点特别重要,因为在整个功耗公式中,功耗与电压平方是成正比的。这也就是超轻薄笔记本通常采用低压CPU的原因,牺牲了一定的性能换取更强劲的续航能力。也就是说,如果我们在选择电脑的时候,在纠结该买低压CPU还是标配CPU其实是看自己对电脑功耗的一个考虑。
注:参观于极客时间徐文浩老师的深入浅出计算机组成原理