计算机组织简介(Computer Organization)
计算机只是执行程序的机器。那么,什么是程序?计算机如何执行程序?学习计算机组织的基本目标:充分了解这些组件的内部工作原理以及如何控制它们。
区分计算机组织和计算机架构
- 计算机体系结构:“该怎么办?”—设计和实现计算机系统的蓝图
- 计算机组织:“该怎么做?”—它说明了计算机系统的操作部分如何链接在一起以实现所提供的计算机体系结构
计算机体系结构先于计算机组织产生
我们做一个形象的举例:
- 计算机体系结构:是否应向计算机系统添加乘法指令?
- 计算机组织:如何将乘法指令添加到计算机系统?
- 选项1:实现乘法单元
- 选项2:使用多个加法单元
在现实中
- 相同的架构示例
- 所有Intel x86家族共享相同的基本架构
- IBM System / 370系列共享相同的基本架构
- 不同版本之间的不同组织
- 不同的芯片速度
- 不同的配置
- 有时甚至是不同的连接
结构与功能
一台计算机由许多组件组成:CPU,RAM,磁盘等。
功能:指作为结构一部分的单个组件的操作
结构:是指组件之间相互关联(连接)的方式
比如说:打印机具有固定功能,但是可以由系统通过CPU或内存直接方式等进行连接或控制。
自上而下的方法:分析复杂系统(例如计算机)的典型方法
例子:香港理工大学
顶层:Poly U
第二级:学院(工学院)
第三级:部门(COMP)
每个部门都是一个组成部分,具有自己的职能;
它们以分层方式组织(结构:顶层,第二层和第三层)自顶向下的理解方法,Dr. Kai Zhou
现在,我们用自上而下的理解方法理解计算机结构
注明:CPU速度快,内存速度慢,I/O速度更慢!
下一层
对于上图中的CPU
对于上图CPU中的Control Unit(简称CU,又叫做控制单元),有
所有计算机功能都与以下内容有关:
- 数据处理
- 数据存储
- 数据移动
- 控制/管理
在我看来,计算机的根本功能是存储,计算,传输和展现数据。计算机的本质是人类的工具。
计算机简史
ENIAC(电子数值积分器和计算机)
- 专为第二次世界大战而设计,可计算武器的轨迹表
- 宾夕法尼亚大学John Mauchly教授领导的项目
- 从1943年开始,于1946年完成,一直使用到1955年,对于战争而言为时已晚
它是一个十进制的计算器,而不是二进制的。它拥有20个10位累加器。他并不是通过程序编写程序,而是通过开关(switches)来进行手动编程。它由18,000个真空管,30吨的重量和15,000平方英尺的尺寸组成,功耗为140 kW。它每秒可进行5,000次加法。
冯·诺依曼机器/图灵机
1946年,普林斯顿高等研究院(the Institute for Advance Study at Princeton,IAS )开始设计“存储程序”计算机,被称为IAS计算机.
- 冯·诺依曼结构最重要的思想是“存储程序(Stored-program)”
- 工作方式:
- 任何要计算机完成的工作都要先被编写成程序,然后将程序和原始 数据送入主存并启动执行。一旦程序被启动,计算机应能在不需操 作人员干预下,自动完成逐条取出指令和执行指令的任务。
- 冯·诺依曼结构计算机也称为冯·诺依曼机器(Von Neumann Machine)。
- 几乎现代所有的通用计算机大都采用冯·诺依曼结构,因此,IAS计 算机是现代计算机的原型机。
- 存储程序概念(SPC)的想法:用内存(Main memory)存储程序和数据
- CPU中的 ALU(算术和逻辑单元)对二进制数据进行运算
- CPU中的 CU(控制单元)解释 存储器的 中的指令并执行
- CPU中的 CU(控制单元)控制单元操作的输入和输出设备
到目前为止,SPC模型仍是所有计算机系统的基础。
冯·诺依曼结构是怎样的?
- 有主存,用来存 放程序和数据
- 有一个自动逐条取出指令的 部件
- 有具体执行指令 (即运算)的部件
- 程序由指令构成
- 指令描述如何对数据进 行处理
- 有将程序和原始数 据输入计算机的部件
- 有将运算结果输出 计算机的部件
冯·诺依曼结构的主要思想
- 计算机应由运算器、控制器、存储器、输入设备和输出设备 五个基本部件组成。
- 各基本部件的功能是:
- 存储器不仅能存放数据,而且也能存放指令,形式上两者 没有区别,但计算机应能区分数据还是指令;
- 控制器应能自动取出指令来执行;
- 运算器应能进行加/减/乘/除四种基本算术运算,并且也 能进行一些逻辑运算和附加运算;
- 操作人员可以通过输入设备、输出设备和主机进行通信。
- 内部以二进制表示指令和数据。每条指令由操作码和地址码 两部分组成。操作码指出操作类型,地址码指出操作数的地 址。由一串指令组成程序。
- 采用“存储程序”工作方式。
- 数据表示
- 二进制(010111…)
- 40 bit Words(计算机中的基本单位)
- 2 x 20位指令(每个字符)
- 寄存器集(CPU中的存储器)
- 内存缓冲寄存器(MBR)
- 内存地址寄存器(MAR)
- 指令寄存器(IR)
- 指令缓冲寄存器(IBR)
- 程序计数器(PC)
- 累加器(ACC)
- 乘商器(MQ)
现代计算机结构
- CPU:中央处理器;PC:程序计数器;
- MAR:存储器地址寄存器 ALU:算术逻辑部件;
- IR:指令寄存器;MDR:存储器数据寄存器
- GPRs:通用寄存器组(由若干通用寄存器组成,早期就是累加器)
- 程序在执行前
- 数据和指令事先存放在存储器中,每条指令和每个数据都有地址, 指令按序存放,指令由OP(操作码)、ADDR(地址码)字段组成,程序起始地址置PC
- 开始执行程序
- 根据PC取指令
- 指令译码
- 取操作数
- 指令执行
- 回写结果
- 修改PC的值
- 继续执行下一条指令
简单的流程图:
计算机的基本部件及功能
- 运算器(数据运算):ALU、GPRs、标志寄存器等
- 存储器(数据存储):存储阵列、地址译码器、读写控制电 路
- 总线(数据传送):数据(MDR)、地址(MAR)和控制线
- 控制器(控制):对指令译码生成控制信号
- 计算机实现的所有任务都是通过执行一条一条指令完成的
硬件发展
基于晶体管的机器
- 晶体管
- 更换真空管
- 更小更便宜
- 散热少
- 硅制固态设备
- 1947年由William Shockley等人在Bell Labs发明。
- 第二代机器
- 基于晶体管的计算机
- NCR和RCA生产的小型晶体管机
- IBM 7000
- DEC-1957年
微电子-集成电路
从字面上看,即“小型电子产品”
计算机由 门,存储单元 和 互连 组成,这些可以在半导体(第三代)上制造,例如:硅片
计算机换代
- 真空管:1946-1957年
- 晶体管:1958年-1964年
- 小规模整合:1965年-芯片上多达100个设备
- 中规模整合:直到1971年-芯片上100-3,000个设备
- 大规模整合:1971年至1977年-芯片上3,000-100,000个设备
- 大规模整合:1978年至1991年-芯片上100,000-100,000,000个设备
- 超大规模集成: 1991至芯片上超过100,000,000个设备
摩尔定律
关于英特尔联合创始人戈登·摩尔(Gordon Moore)提高芯片上组件密度的问题
芯片上的晶体管数量每年将翻一番(1970年之前)
自1970年以来,发展速度有所放缓,晶体管数量每18个月翻一番
好处
- 芯片成本几乎保持不变
- 更高的包装密度意味着更短的电气路径,从而提供更高的性能
- 较小的尺寸增加了灵活性
- 降低功率和冷却要求
- 更少的互连增加了可靠性
随着时间变化,每个CPU上晶体管的数量的变化
英特尔的CPU芯片
- 1971年:4004
- 第一个微处理器
- 所有CPU组件都在单个芯片上
- 4位CPU
- 1972年:8008
- 8位CPU
- 两者均针对特定应用而设计
- 1974年:8080
- 英特尔首款通用微处理器
- 然后8086、80286(16位CPU)
- 80386、80486,Pentium,P2,P3,P4(32位CPU)
- P4 D,Core 2 Duo,Core 2 Quad…,i3,i5,i7,19(64位CPU)
逻辑(CPU)和内存性能差距
典型的I / O设备数据速率
I/O是最慢的,但是我们依据给它们排个名
CPU相对较快,但内存/ IO相对较慢。所以,我们的电脑慢的时候,不要CPU,应该怪内存和I/O的速度慢。
而且,CPU具有
- 板载L1和L2缓存
- 高速 BUS/多 BUS
- 数据流分析
所以,关键在于平衡以下这些
- 处理器组件
- 主存(Main memory)
- I / O设备
- 互连结构
计算机组件,功能和互连
计算机组件
计算机主要是由以下三部分组成
- 中央处理器(CPU)
- CPU =控制单元(CU)+算术和逻辑单元(ALU)
- 两个功能:控制和计算
- IO
- 因为数据和指令需要进入系统
- 并且我们需要输出结果
- 主存(Main Memory)
- 需要临时存储代码(程序)和结果
寄存器(Register):存储信息的地方
- 程序计数器(PC):也称为指令地址寄存器;它存储将要执行的下一条指令的内存地址;在获取指令后它将增加
- 指令寄存器(IR):保存当前正在执行的指令
- 内存地址寄存器(MAR):它存储将从中将数据提取到CPU的内存地址或将数据发送到的内存地址
- 内存缓冲寄存器(MBR):它存储与即时访问存储器之间传输的数据
指令(Instruction)
- 指令是由CPU完成的算术或逻辑运算
- ADD:将两个数字加在一起
- COMPARE:比较数字
- JUMP:跳转到RAM地址
- LOAD:将信息从RAM加载到CPU
- 指令集是计算机支持的指令集
- 取决于硬件–不同的体系结构将支持不同的指令集
程序(Program)是什么
程序:一系列指令
- 不能使用C,Java,Python等高级语言编写程序语句,但可以把他们翻译成程序语句
- 每个程序语句将转换为一系列指令
- 例如:IN,ADD,JUMP,LOAD,OUT
- 旨在实现一定功能
机器语言编写程序不仅难读,难写而且非常不灵活.
用汇编语言开发程序
若用符号表示跳转位置和变量位置,是否简化了问题?
于是,汇编语言出现:用助记符表示操作码,用标号表示位置,用助记符表示寄存器
用汇编语言编写的优点是: 不会因为增减指令而需要修改其他指令 不需记忆指令编码,编写方便 可读性比机器语言强。不过,这带来新的问题,是什么呢?人容易了,可机器不认识这些指令了.所以,我们需将汇编语言转 换为机器语言! 我们用汇编程序作为中介进行转换
但是,我们进一步认识汇编语言,会发现汇编语言(源)程序由汇编指令构成
- 什么是汇编指令?
- 用助记符和标号来表示的指令(与机器指令一一对应)
- 指令又是什么呢?
- 包含操作码和操作数或其地址码
- 机器指令用二进制表示
- 汇编指令用符号表示
- 只能表达这些:取(或存一个数)、两个数加(或减、乘、除、与、或等)、根据运算结果判断是否转移执行
想象用汇编语言编写复杂程序是怎样的情形? (例如,用汇编语言实现排序(sort)、矩阵相乘) 需要描述的细节太多了!程序会很长很长!而且在不同 结构的机器上就不能运行!
机器语言和汇编 语言都是面向机 器结构的语言, 故它们统称为机 器级语言
结论:用汇编语言比机器语言好,但是,还是很麻烦!
高级编程语言
- 它们与具体机器结构无关
- 面向算法描述,比机器级语言描述能力强得多
- 高级语言中一条语句对应几条、几十条甚至几百条指令
- 有“面向过程”和“面向对象”的语言之分
- 处理逻辑分为三种结构 • 顺序结构、选择结构、循环结构
- 有两种转换方式:“编译”和“解释”
- 编译程序(Complier):将高级语言源程序转换为机器级目 标程序,执行时只要启动目标程序即可
- 解释程序(Interpreter ):将高级语言语句逐条翻译成机器 指令并立即执行,不生成目标文件
经典案例:Hello,world的编写
我们用C++ 一个简单的程序
#include <stdio.h>
int main()
{
printf(hello, world\n);
}
数据经常在各存储部件间传送。故现代计算机大多采用“缓存”技术
所有过程都是在CPU执行指令所产生的控制信号的作用下进行的
指令周期(Instruction Cycle)
两个主要步骤:取、执行
指令周期(Instruction Cycle) = 提取周期(Fetch Cycle)+ 执行周期(Execute Cycle), 可能会有中中断周期
所有步骤均由控制单元使用内置时钟(周期)控制:synchronization
因此,一条指令通常消耗一个以上的时钟周期(步骤和顺序的调节器)
提取周期(Fetch Cycle)中的动作
- 程序计数器(PC)已保存要提取的下一条指令的地址
- 指令顺序执行
- 处理器从PC指向的内存位置获取指令(需要先将地址放入MAR)
- 指令加载到指令寄存器(IR)中(需要先将指令放入MBR)
- PC计数器增量(顺序执行)
- 除非在执行周期中另有说明(例如,从IF-THEN-ELSE,循环语句)
- 处理器解释指令并准备执行所需的操作
执行周期(Execute Cycle)中的动作
取决于指令
- 处理器-内存
- CPU和主存储器之间的数据传输
- 处理器-I / O
- CPU和I / O模块之间的数据传输
- 数据处理
- 对数据进行一些算术或逻辑运算(ALU运算)
- 控制
- 操作顺序的变更,例如分支和跳转(来自循环,函数调用等语句)
- 以上组合
程序执行示例
最初:PC:300指令是IR中的第一位
- 首先,程序计数器(也称为指令地址寄存器/PC)中记录了内存中下一条应该执行的指令地址为300
- 之后,IR获取了地址为在内存中地址为300的程序指令1940(虽然我们不知道1940代表的指令是什么意思,我们假设它代表的意思为获取内存地址为940的值,故AC此时编程0003)
- 同时,PC更新为下一个内存地址301。
- 之后,IR获取了地址为在内存中地址为301的程序指令5941,(虽然我们不知道5941代表的指令是什么意思,我们假设它代表的意思为把内存地址为941的值和当前的值进行加和并存储到AC中,故AC此时编程0005)
- 同时,PC更新为下一个内存地址302.
- 之后,IR获取了地址为在内存中地址为302的程序指令2941(虽然我们不知道2941代表的指令是什么意思,我们假设它代表的意思为把当前AC的值存储到内存地址为941的地方,故AC此时编程0003)
- 同时,PC更新为下一个内存地址303.
- …
用图来看是这样的
中断(Interrupts)
中断:其他模块(例如I / O)可以中断正常处理顺序的机制
问题:想象一下,如果你在通话中并接到另一个来电,该怎么办?
也许我会考虑这另一个来电是否重要,重要的话,我会接听。不重要的话,我会等当前的电话打完后再处理另一个,即判断是否有接听的必要
中断源
- 程序,例如溢出,除以零
- 计时器,例如由内部处理器计时器生成
- I / O,例如从I / O控制器
- 硬件故障,例如内存奇偶校验错误
通过中断转移控制(Transfer of Control via Interrupts)
如果发生中断:
- 处理器暂停当前程序的执行并保存其上下文
- 将PC设置为中断处理程序的起始地址
中断周期(Interrupt Cycle)
中断可能不可避免,所以,我们需要制定相关流程
- 处理器检查中断
- 由中断信号指示
- 如果没有中断,则获取下一条指令
- 如果中断待处理:
- 暂停当前程序的执行
- 保存上下文
- 将PC设置为中断处理程序例程的起始地址
- 处理中断
- 恢复上下文并继续中断的程序
带中断的指令周期(Instruction Cycle with Interrupts)
图解
程序流程控制(Program Flow Control)
多次中断(Multiple Interrupts)
无需了解详细信息,仅供参考
多个中断:当前正在处理中断时出现中断
- 解决方案1:顺序处理:中断按顺序发生
- 处理器在处理一个中断时将忽略其他中断
- 中断保持挂起状态,并在处理完第一个中断后进行检查
解决方案2:嵌套处理:允许中断期间的中断
问题:两种方法有什么区别?
- 如何处理? 设置公正和紧急的优先事项
- 低优先级中断可以被高优先级中断打断
- 处理较高优先级的中断后,处理器将返回上一个中断
连接计算机组件(互连)
所有单元必须连接
不同类型的单元有不同类型的连接
- Memory
- Input/Output
- CPU
电脑模块/组件
所有三个组件均通过bus(es)进行通信,如下图
## Bus
Interconnection Scheme (了解即可)
BUS(总线) 是什么
- 连接两个或更多设备的通信路径
- 通常广播,经常分组
- 一条总线中的多个通道,例如32位数据总线是32个独立的单个位通道
- 三种总线类别:数据总线,地址总线和控制总线
- 单总线与多总线结构
- 例如Unibus(DEC-PDP)
- 例如控制/地址/数据总线(PC)
- 专用总线
- 分配给单个功能,例如用于地址或数据的功能,称为地址总线和数据总线
- 不同组件的分离总线
- 多路总线
- 用于地址和数据-共享线
- 优势:行数更少
- 缺点:更复杂的控制和资源的顺序使用将限制性能