本人现在大二,为考研而担忧,借着假期的空闲时间来自学计算机组成原理。参考资料是王道考研。
目录
一、计算机发展历程
1.定义
计算机系统=硬件+软件
这一点相信有过操作系统学习经验的同学很容易理解,没学过的同学也不必慌张,这里知道即可。
并且一个功能只要实现,不外乎通过硬件或者软件来实现,二者在地位上是等效但是不等价。很显然通过硬件实现,效率更高但是难度更大。
值得注意的是,具体的例子是这样的:能够组成计算机实体的如主机、外设等就是硬件了;而具有各类特殊功能的程序如QQ、360就是软件了。
并且软硬件并非是完全割裂的,它们共同决定了计算机的总体性能。假如说:苹果的硬件能力不如华为,但是系统却优于鸿蒙,二者孰强孰劣未必。
2.硬件的发展
第一代:电子管时代
代表为:ENIAC(1946 宾大) 5000次加法/秒 逻辑元件为电子管
第二代:晶体管时代
1947,贝尔实验室发明晶体管;
晶体管的电气特性和体积大小支持其替换电子管;
有了操作系统的雏形出现;
人为焊接大量的晶体管过于麻烦;
第三代:中小规模集成电路时代
1957,八叛徒创立仙童半导体公司,并在1959发明集成电路;
开始出现分时操作系统;
依旧局限于科学计算领域;
高级程序语言迅速发展;
第四代:大规模、超大规模集成电路时代
1968,摩尔等离开仙童创立Inter;1959,桑德斯也离开创建AMD;二者均推动第四代的发展!
开始出现“微处理器”;
PC开始萌芽;
Windows、Linux、MacOS.......出现;
3.软件的发展
首先应该清楚地是:软件分为系统软件与应用软件!
系统软件有如:Windows、Linux之类的操作系统、DBMS(数据库管理系统)、网络软件等等。
应用软件有如:QQ、原神、360等等。
发展历程就是从机器语言到汇编语言再到高级语言的发展。
4.发展趋势
更微型、多用途:比如手机或其他微小的智能穿戴设备;
更巨型、超高速:超级计算机(神威·太湖之光等);
5.思维导图
二、计算机硬件组成
1.五大部分
通常可以概括为:输入设备、输出设备、主存储器、运算器、控制器。
2.冯诺依曼结构
创造性地提出了“存储程序”的概念:将代码以二进制的形式事先存入主存中后按其首地址执行指令,并顺序执行;所以其基本工作方式是控制流驱动方式。
冯诺依曼计算机特点:
1.由五大部件组成;
2.指令与数据以同等地位存于存储器,按地址寻访;
3.指令、数据用二进制表示;
4.指令由操作码(如加、减)和地址码组成;
5.存储程序
6.以运算器为中心:麻烦在于降低数据处理效率
解释:这就好比一个加工厂不是围绕仓储部门为中心,而是把加工生产部门作为必须经历的中心;
3.现代计算机结构
最大的改进就是以存储器为中心!
CPU=运算器+控制器
4.思维导图
三、各硬件部件详析
虽然上上图和定义中说CPU只包括控制器和运算器,但是现代的计算机实际结构中往往内部集成了地址寄存器(这个一般存在于主存)
CPU不同部件的存取速度也是有差异的:寄存器>Cache>内存
1.主存储器的基本组成
主存储器包含三个部分:存储体、MAR(地址寄存器)、MDR(数据寄存器);
很显然,主存储器的工作方式是按照存储单元的地址进行存取;与之差异的是相联存储器既可以按地址存取,又可以按内容存取;
比喻性的例子来理解就是咸鱼学长那个菜鸟驿站的例子就很形象具体:
略微不同的是CPU可以取数据也可以存数据,我一般只能在菜鸟驿站拿快递;
存储体
数据在存储体内部是按照地址存储的;存储体内部的概念如下:
存储单元:每个存储单元存放一串二进制代码;
存储字(word):存储单元中二进制代码的组合;
存储字长:存储单元中二进制代码的位数,通常是8bit的整数倍;
存储元:存储二进制的电子元件(电容),每个存储元可存1bit;
MAR
其位数反映了存储单元的个数;
例如:MAR=4位就是说共有个存储单元
MDR
位数=存储字长;
例如:MDR=16位就是说每个存储单元可以存放16bit,一个字(word)=16bit;
note:1字节(Byte)=8bit=8b=1B
字节(word)和字(Byte)不是一个概念!!!一个字有多少位看的是计算机硬件的设计,未必是固定的!!!
2. 运算器的基本组成
运算器是用于实现算术运算(如:加减乘除)、逻辑运算(如:与、非)的硬件;
ACC
累加器,存放操作数或者运算结果;
MQ
乘商寄存器,在乘除运算时,存放操作数或计算结果;
X
通用操作数寄存器,存放操作数;
ALU
算术逻辑单元,通过内部的复杂的电路实现两种运算;
3.控制器的基本组成
CU
会分析指令,给出控制信号,是控制器的核心;
IR
指令寄存器,存放当前执行的之类;
PC
程序计数器,存放下一条指令,有自动加一的功能;
4.计算机的工作流程
举个非常常见的例子:
int a=2,b=3,c=1,y=0;
void main(){
y=a*b+c;
}
因为我是最开始学的python,虽然也会C,但是方便更多人理解,转换成python的意思就是:
a,b,c=2,3,1
y=a*b+c
然而计算机的理解过程,或者说是工作过程却比较复杂。
首先就是编译程序,然后装入主存,效果如下图:
总体的流程模板如下:
语言描述就是:
1# 首先PC会指向一条指令位置,希望获取指令包含的操作码和地址码的二进制数据;
2# 然后将位置给MAR去存储体的具体位置获取操作码和地址码;
3# 再由MDR寄存根据MAR要求获得的指令数据;
4# 指令数据从MDR通过数据总线交付给IR,而IR是负责寄存指令的部分;
5# IR会将操作码的部分交给CU,也就是控制单元,控制单元负责分析操作码的实际含义比如说是“取数”指令;
到这一步所有操作还是一致的,之后会因为分析出来的指令不同而有不同的进程
6# IR除了将操作码交付给CU,还需要将另一个部分,就是地址码再交给MAR;
7# 地址码转换成地址之后去存储体获取数据;
8# 获取的数据寄存在MDR中;
9# 最后MDR中的数据放入到ACC
实例如下:
值得注意的是,虽然总体是这样的,但是也会有部分变化,比如取出a之后,要与b相乘。5#分析完为乘数指令,则会将9#改为存入MQ(乘商寄存器)中,在把原来ACC里面的a=2移入X中,再通过ALU来得出计算结果,这就是10#了;最后还是要把结果寄存入ACC当中,这就是11#;
5.思维导图
四、计算机层次结构
所谓的虚拟机器就是指想象出来的可以直接按照高级语言或者汇编语言(汇编语言实际上是助记符)来运行的机器,实际上不存在,因为任何机器都只能识别二进制的数据,所以会有编译和汇编的过程。
解释与编译
要区分的一点是:高级语言往下有两条路可以选择,解释和编译;
所以与之对应的就是解释器(JavaScript,Python)和编译器(C,C++)
编译程序:全部代码一次编译完成,之后再执行就无需再编译,可以理解已经生成了.exe文件(只需要翻译一次);
解释程序:读一行代码翻译一行代码并执行,再对下一行代码如是操作,但是之后再运行同一个代码文件时,仍然要重复这些操作(每次执行都要翻译);
前者就是一本已经翻译好的书随便什么时候看都认得,后者是同声传译,随用随翻。
思维导图
五、计算机性能
1.存储器的性能指标
首先我之前提过MAR与MDR位数所代表的意义,现在就用上了呀!
回忆一下,MAR的位数代表了存储单元数量的上限,n位的数量上限为;然后MDR的位数是指存储字长,m位的是m bit;
所以,总容量的公式:单元个数*每个单元的大小=
例如,MAR是32位,MDR是8位,存储大小就是
注意单位换算哦!
下面的比较常见,要求背下来!
2.CPU的性能指标
在买电脑的时候,CPU的参数如下:
i7-10750H 2.60GHz 8核16线程
这其中2.60GHz表示的是CPU主频,即内部数字信号震荡的频率;属于是一种节奏器,一般频率高一点好;但是实际上的影响因素很多,包括一些物理损耗等等,微观上无法定性定量!
例题:100条指令,主频为1000Hz,平均的CPI=3,那么执行完该程序需要耗时多久?
3.系统整体的性能指标
数据通路带宽:数据总线一次所能并行传送信息的位数。
吞吐量:指系统在单位时间内处理请求的数量。
反应时间:指从用户向计算机发出一个请求到系统对该请求做出响应并获得他所需要的结果的等待时间。