计算机组成原理入门知识概念

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_33588730/article/details/97523935

一、冯·诺伊曼结构

1.撰写的程序、打开的浏览器、运行的游戏,都要加载到内存里才能运行。程序读取的数据、计算得到的结果,也都要放到内存里。存放在内存里的程序和数据,需要被 CPU 读取,CPU 计算完成之后,还要把数据写回内存。而主板的芯片组(Chipset)和总线(Bus)解决了 CPU 和内存之间如何通信的问题。芯片组控制了数据传输的流转,也就是数据从哪里到哪里的问题总线则是实际数据传输的高速公路。因此,总线速度(Bus Speed)决定了数据能传输得多快

2. 鼠标、键盘以及硬盘,都是插在主板上的。作为外部 I/O 设备,它们通过主板上的南桥(SouthBridge)芯片组,来控制和 CPU 之间的通信,一方面,它在主板上的位置,通常在主板的“南面”。另一方面,它的作用就是作为“桥”,来连接鼠标、键盘以及硬盘这些外部设备和 CPU 之间的通信。以前的主板上通常也有“北桥”芯片,用来作为“桥”,连接 CPU 和内存、显卡之间的通信。不过,随着时间的变迁,现在的主板上的“北桥”芯片的工作,已经被移到了 CPU 的内部,所以在主板上,已经看不到北桥芯片了。

3.冯诺依曼结构的计算机由以下几部分组成:

(1)运算器Processing Unit),包含算术逻辑单元(Arithmetic Logic UnitALU)和处理器寄存器(Processor Register),用来完成各种算术和逻辑运算。

(2)控制器Control Unit/CU),包含指令寄存器(Instruction Register)和程序计数器(Program Counter),用来控制程序的流程,通常就是不同条件下的分支和跳转。在现在的计算机里,运算器和控制器共同组成了 CPU

(3)存储器,包括用来存储数据(Data)和指令(Instruction)的内存,以及更大容量的外部存储,通常就是硬盘。

(4)输入和输出设备,例如鼠标,键盘,显示器,网卡,触摸屏等,其中网卡和触摸屏等既是输入设备也是输出设备。

二、性能

4.衡量计算机性能有两个重要指标,第一个是响应时间Response time)或者叫执行时间(Execution time)。第二个是吞吐率Throughput)或者带宽(Bandwidth),所以,响应时间指的就是执行一个程序,到底需要花多少时间。花的时间越少,自然性能就越好。 而吞吐率是指在一定的时间范围内,到底能处理多少数据或者程序指令。

缩短程序响应时间,一般都能提升吞吐率,除此以外还可以使用多核处理器,多个核心同时处理数据,吞吐率也会提升。

一般可以把性能定义成响应时间的倒数,也就是:

                                                                                      性能 = 1/ 响应时间

计算响应时间时,直观会认为是程序执行结束的时间减去程序开始的时间(Wall Clock Time & Elapsed Time),但是这样计算有以下问题:

(1)该时间不一定准。多次运行同一程序会发现结束时间不一样,因为计算机中同时执行好几个程序,CPU实际上不停地在各个程序之间进行切换(线程与时间片的概念)。在这些走掉的时间里面,很可能CPU切换去运行别的程序了。而且,有些程序在运行的时候,可能要从网络、硬盘去读取数据,要等网络和硬盘把数据读出来,给到内存和CPU。所以说,要想准确统计某个程序运行时间,进而去比较两个程序的实际性能,得把这些其余时间去除掉。

为了统计该时间,Linux下有一个叫time的命令,可以统计出来,同样的Wall Clock Time下,程序实际在CPU上到底花了多少时间。它会返回三个值,第一个是real time,也就是Wall Clock Time,也就是运行程序整个过程中流逝掉的时间;第二个是user time,也就是CPU运行程序,在用户态运行指令的时间;第三个是sys time,是CPU在操作系统内核里运行指令的时间。而程序实际花费的CPU执行时间(CPU Time),就是user time加上sys time

$ time seq 1000000 | wc -l
1000000


real  0m0.101s
user  0m0.031s
sys   0m0.016s

(2)即使已经拿到了CPU时间,也不一定可以直接“比较”出两个程序的性能差异。即使在同一台计算机上,CPU 可能满载运行也可能降频运行,降频运行的时候自然花的时间会多一些。除了CPU之外,时间这个性能指标还会受到主板、内存这些其他相关硬件的影响。所以,需要把程序的CPU执行时间变成:

                                                 CPU时钟周期数×时钟周期时间(CPU主频的倒数,Clock Cycle

对于CPU时钟周期数,可以再做一个分解,把它变成“指令数×每条指令的平均时钟周期数(Cycles Per InstructionCPI)”。不同的指令需要的Cycles是不同的,加法和乘法都对应着一条CPU指令,但是乘法需要的Cycles就比加法要多,自然也就慢。在这样拆分了之后,CPU执行时间就可以变成这样三个部分的乘积:

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

因此,想要解决性能问题,其实就是要优化这三者,即提升CPU主频、优化 CPU 设计使得在单个时钟周期内能够执行更多指令、以及通过编译器来减少需要的指令数。每条指令的平均时钟周期数CPI,就是一条指令到底需要多少CPU Cycle。现代的CPU通过流水线技术(Pipeline),让一条指令需要的CPU Cycle尽可能地少。因此,对于CPI的优化,也是计算机组成和体系结构中的重要一环。指令数,代表执行程序到底需要多少条指令、用哪些指令,这个很多时候就把挑战交给了编译器。

5.上面三方面的优化程序执行速度方法中,增加CPU主频是相对容易做到的一点,但是随着晶体管密度和开关速度的上升,功耗发热也在不断上升。因此,在 CPU 里面,能够放下的晶体管数量和晶体管的“开关”频率也都是有限的。一个 CPU 的功率,可以用这样一个公式来表示:

                                                        功耗 ~= 1/2 ×负载电容×电压的平方×开关频率×晶体管数量

当功耗增加太多时,会导致CPU散热跟不上。因此现代CPU研发都在不断降低供电电压。近年来通过提升主频越来越困难,因此CPU厂商们选择研发多核CPU,通过提升吞吐率即并行,而不是减少响应时间来提升性能。利用处理器并行运算进行优化的程序,执行时间如下所示(阿姆达尔定律):

                                           优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 +不受影响的执行时间

除了摩尔定律与并行计算以外,还有三种方法可以提升程序性能:

(1)加速大概率事件。算法中通常使用 big-O 去表示一个算法的好坏,我们优化一个算法也是基于 big-O,但是 big-O 其实是一个近似值,就好比一个算法时间复杂度是 O(n^2) + O(n),这里的 O(n^2) 是占大比重的,特别是当 n 很大的时候,通常会忽略掉 O(n),着手优化 O(n^2) 的部分。

(2)通过流水线提高性能。例如任务分解,把一个大的任务分解成好多个小任务,把一个大规模的SQL分成几个规模适当的小SQL进行执行。一般来说,分的越细,小任务就会越简单,整个框架、思路也会变得更加清晰。

(3)通过预测提高性能。例如redis数据库会将高频率使用的数据缓存在内存中,提高读取效率;另外就是深度优先搜索算法里面的 “剪枝策略”,防止没有必要的分支搜索,这会大幅度提升算法效率。

猜你喜欢

转载自blog.csdn.net/qq_33588730/article/details/97523935