从今天开始更新笔者在 MOOC 上自学哈工大计算机组成原理时的笔记,按照每一周的课程进行记录,每周对应一篇 Blog,算上上下两门课程,这个系列大概有个十来篇吧。🧐
课程概貌
这门课主要讲解三个方面的内容:计算机、组成和原理,主要从三个角度入手:
- 基本部件的结构和组织方法
- 基本运算的操作原理
- 基本部件和单元的设计思想
这门课程对应的交材是唐朔飞老师编的那本《计算机组成原理》(第二版),由高等教育出版社出版。另外,老师推荐了两本参考教材:
- Computer Organization & Design: A Hardware/Software Interface, David A.Patterson. John L.Hennessy
- Digital Design and Computer Architecture. Morgan Kaufmann, 2007, David Harris, Sarah Harris
这门课总共有十章内容,上半部分课程会讲解前五章,主要内容为计算机组成原理中与机器相关的部分;下半部分课程会讲解后五章,主要内容为计算机组成原理中数据的存储、表示和运算以及 CPU 的设计思想。
第一周的课程有点 boring🥱,主要讲解计算机系统概论,算是基本概念知识。
计算机系统概论
计算机的软硬件概念
这个地方其实没什么好说的,算是常识性的内容。
计算机系统的层次结构
这里要提到了两个系统复杂性管理方法:抽象和3Y(Hierachy、Modularity 和 Regularity)。如果熟悉一门 OOP 语言的话,这些概念也都是基本常识了。
另外,下面这张图可以注意一下:
计算机体系结构和计算机组成
注意区分这两个概念:
- 计算机体系结构:程序员所见到的计算机系统的属性,概念性的结构和功能特性(指令系统、数据类型、寻址技术、I/O 原理等)
- 计算机组成:实现计算机体系结构所体现的属性(具体指令的实现)
计算机的基本组成
冯·诺依曼计算机的特点
- 计算机由五大部件组成
- 指令和数据以同等地位存于存储器,可按地址寻访
- 指令和数据用二进制表示
- 指令由操作码和地址码组成
- 存储程序
- 以运算器为中心
冯·诺依曼计算机存在一个缺陷,那就是运算器承担了很多工作,大部分事情都是亲力亲为,这就导致了运算器的速度直接成了整台电脑的速度(实际上就是木桶效应)。
计算机硬件框图
针对冯·诺依曼计算机的改良措施就是将整个体系的中心从运算器换成了存储器。
现代计算机也是按照上图中的结构搭建起来的,此时各部分硬件设备都有了自己的名字,从这里体现的设计思想就是前面提到的 3Y——层次化(Hierachy)、模块化(Modularity)和规则性(Regularity)。
存储器的基本组成
存储器由主存储器(主存,内存条)和辅存储器(辅存,硬盘)。
主存储器由许多存储单元组成,每个存储单元包含若干个存储元件(也就是在 Nand2tetris 这门课中接触到的 Bit 芯片,可以用来存储一位二进制信息)。
这里还有一个存储字长的概念,也就是指存储单元中二进制代码的位数。
除了存储单元外,主存储器还包括了地址寄存器(MAR)、数据寄存器(MDR)和一些逻辑电路。
地址寄存器(MAR)存放访存地址,经过地址译码后找到所选的存储单元,从而拿到数据(类比一下指针的概念)。MAR 用于寻址,故其位数对应着存储单元的个数
数据寄存器(MDR)是主存和其他部件的中介机构,用于暂存要从存储器中读或写的信息(类比临时变量)。MDR 的位数和存储字长相等。
现代 CPU 中的缓存(Cache)在概念上也是主存。
运算器的基本组成
运算器的基本组成包括:算术逻辑单元(ALU)、累加器(ACC)、乘商寄存器(MQ)和操作数寄存器(X),各寄存器运算后存储的内容见下图:
控制器的基本组成
控制器的基本组成包括:控制单元(CU)、程序计数器(IR)和指令寄存器(PC),各部分功能见下图:
计算机的性能指标
这一部分又是一堆概念性的内容🤐:
- 机器字长:CPU 一次能处理数据的位数与 CPU 中的寄存器位数有关
- CPU 主频、核心数、CPI(执行一条指令所需时钟周期数)、MIPS(每秒执行百万条指令)、FLOPS(每秒浮点运算次数)
- 存储容量,包括主存容量和辅存容量
总结
做了张思维导图:
之前一直在听 Nand2tetris 的课,现在一时换回国内老师的课,听的还有点不习惯。哎,听完一周,这种为了应试而听课、学习的感觉又回来了。
相比之下,感觉国外课程往往把复杂的理论讲的很简单,在你理解的差不多了之后,会给你一个任务,让你通过实践来继续加深理解。但国内课程为了应试,在理论上的讲解往往就比较复杂...😓
仔细想了一下,国内的课程真的很容易打消学生的兴趣,当然如果能坚持下来,确实能获得不错的理论能力,但是没有实践还是不行啊,哎,原本之前在自学 Nand2tetris 时,就已经感慨过国外学生的实践能力很强,现在这种体会又加深了。
不扯这些闲篇了...回过头来谈一谈这门课的感受,在学习《组成原理》之前一定要把 C 语言的指针、地址这两个概念玩明白个大概,不然,这些硬件的设计思想会非常难以理解。只要能理解硬件中地址的设计思想理解透彻,应该就不会有太大的问题了。
另外,从国内应试(期末考、408 之类)的角度来讲,哈工大开的这门课讲的还是很清晰的,推荐学习,如果你听的过程中感觉很吃力,那说明可能对一些基础概念还不熟悉,还是先把基础打扎实。
好了,这周还有一件事情,那就是把书上的题做完😑,卧槽,突然想起来,好久没写过作业了...🤣