计算机系统概述 笔记记录
2025年6月22日 星期日
今天开始重新捡起大学学习过的《计算机组成原理》,依稀记得当时是在考试前1周光速复习通过了考试,现如今23年毕业后早已经忘记了计算机组成原理所讲的内容。现如今有了代码的实践经验后,再去学习这门理论课,感觉应该会有不错的收获,故而写下这篇笔记。从头开始学习并记录,有种真正的实践与理论相结合的感觉,与当年为应试而学的状态不同,现在的学习带着明确的目标感,希望自己在这次学习过程中能够追根究底,有打破沙锅问到底的精神,真正的刨根问底。
附上大学成绩单,留作纪念!
1. 计算机发展历程
1.1 计算机硬件的发展
1. 计算机的四代变化
从1946年世界上第一台电子数字计算机(ENIAC)问世以来,计算机的发展已经经过了四代。
第一代计算机(1946-1957)-电子管时代。特点: 逻辑元件采用晶体管;运算速度提高到几万次到几十万次每秒;主存储器用延迟线或磁鼓存储信息,容量小;体积庞大,成本高。
逻辑元件是什么?就像是一个个能做简单判断题的小开关,它们按照“数学规则”来决定电流是否通过,是计算机的“脑细胞”。基础单位:像乐高积木的最小块,计算机所有复杂功能都由它们组合而成。
工作方式:类似回答问题:
与门(AND):“爸妈都同意才能出去玩”(全对才通过)
或门(OR):“可乐或雪碧都可以喝”(有一个对就通过)
非门(NOT):“老师说不行就反过来做”(唱反调)
物理形态:现代计算机里,它们是硅芯片上纳米级的晶体管,每秒可开关数十亿次。
主存储器是什么?计算机中直接与CPU交互的临时存储设备,通常指的是内存(RAM,随机存取存储器)。百度百科-主存储器
延迟线是什么?可以把它想象成一条“慢动作传送带”:你在这头扔进去一个信号(比如一段声音、一个电脉冲),它会慢慢蠕动到另一头,出来时已经比原来晚了几秒/几毫秒。【更详尽的解释:什么是"晚了"?想象你在玩"传话游戏":你对着一条10米长的管子(延迟线)喊"喂!"声音在管子里以每秒340米的速度传播,结果:另一头的人0.03秒后才听到你的"喂"这个"0.03秒"就是延迟线制造的"晚了"的效果】
磁鼓是什么?可以把它想象成一个高速旋转的“铁桶”,表面涂着磁性材料(类似磁带),桶外有一圈固定的“读头/写头”(类似录音机的磁头)。当桶转动时,这些磁头就能读取或写入数据,就像老式点唱机用机械臂读取旋转的黑胶唱片一样。第二代计算机(1958-1964)-晶体管时代。特点:逻辑元件采用晶体管;运算速度提升到几万次到几十万次每秒;主存储器使用磁芯存储器;计算机软件也得到了发展,开始出现高级语言及其编译程序,有了操作系统的雏形。
磁芯存储器是什么?磁芯存储器(Core Memory)是早期计算机使用的一种内存技术,流行于1950-1970年代。用最简单的话来说:它是由一堆微型磁环(磁芯)和导线编织成的“网格”,每个磁环可以存储一个二进制位(0或1),就像用一堆小磁铁拼成的记忆板。第三代计算机(1965-1971)-中小规模集成电路时代。特点:逻辑元件采用中小规模集成电路;半导体存储器开始取代磁芯存储器;高级语言发展迅速,操作系统也进一步发展,有了分时操作系统。
集成电路是什么?集成电路(Integrated Circuit,简称 IC),俗称芯片,你可以把它想象成一个电子元件的超级压缩包——把原本需要一屋子笨重零件才能实现的电路功能,压缩到指甲盖大小的硅片上。它是现代所有电子设备的"大脑"和"器官"。
半导体存储器是什么?半导体存储器是现代所有电子设备的“数字记忆棒”,它用半导体材料(主要是硅)制成,能快速存储和读取数据。简单来说,就是用电子的有无来表示0和1的记忆芯片。
第四代计算机(1972-至今)-超大规模集成电路时代。特点:逻辑元件采用大规模集成电路和超大规模集成电路,产生了微处理器;诸如并行、流水线、高速缓存和虚拟存储器等概念用在了这代计算机中。
2. 计算机元件的更新换代
- 摩尔定律:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。也就是说,我们现在和18个月后花同样的前买到的CPU,后者的性能是前者的两倍。【题外话:摩尔定律是否仍然有效的争论日益激烈。】
- 半导体存储器的发展:1970年,美国仙童半导体公司产出第一个较大容量的半导体存储器,半导体存储器经历了存储容量的发展:单芯片:1KB、4KB、16KB、64KB、256KB、1MB、4MB、16MB、256MB、1GB等等,现在可以达到1TB。
- 微处理器的发展:自从1971年Intel公司开发出第一个微处理器Intel4004至今,微处理器经历了8、16、32、64,目前主要是64位机器字长,机器字长是指r计算机一次整数运算所能处理的二进制数据位数。
打开自己电脑的cmd命令窗口,输入echo %PROCESSOR_ARCHITECTURE%,就可以看到自己电脑的机器字长了。
或者输入:systeminfo | findstr /i “系统类型”,得到下面的结果也是64位机器字长。
1.2 计算机软件的发展
- 计算机软件技术的蓬勃发展,也为计算机系统的发展做出了很大的贡献。
- 计算机语言经历了面向机器的机器语言和汇编语言,面向问题的高级语言,其中高级语言的发展真正促进了软件的发展,它经历了从科学计算和工程计算的FORTRAN、结构化程序设计的PASCAL到面向对象的C++和适应网络环境的Java。【作为一名Javaer,希望自己也能够在计算机软件技术发展中,努力提升自我!】
- 与此同时,直接影响计算机系统性能提升的各种系统软件也有了长足的发展,特别是操作系统,如Windows,UNIX,Linux等。【其中Linux代表系统如Ubuntu、CentOS、Debian等在工作中目前比较经常见到。】
2. 计算机系统层次结构
2.1 计算机系统组成
- 硬件系统和软件系统共同构成了一个完整的计算机系统。硬件是指的是有形的物理设备,是计算机系统实际物理装置的总称。软件是指的是在硬件上运行的程序和相关的数据及文档。
- 计算机系统性能的好坏,很大程度上是由软件的效率和作用来表征的,而软件性能的发挥又离不开硬件的支持。对于某一功能来说,如果既可以用硬件实现也可以用软件实现,则称为软/硬件在逻辑功能上是等价的。在设计计算机系统时,要进行软/硬件功能的分配,通常来说一个功能如果使用较为频繁且用硬件实现成本较为理想,则使用硬件解决可以提供效率。
2.2 计算机硬件
1.冯·诺伊曼机基本思想:
冯·诺伊曼在研究EDVAC机时提出了存储程序的概念,存储程序的思想奠定了现代计算机的基本结构,以此概念为基础的各类计算机都统称为冯·诺伊曼机,其有如下特点:
- 采用存储程序的功能方式。
- 计算机硬件系统由运算器、存储器、控制器、输入设备和输出设备5个大部件组成。
- 指令和数据以同等地位存储在存储器中,形式上没有区别,但计算机应能区分它们。
- 指令和数据均为二进制代码表示。
- 指令由操作码和地址码组成。操作码指出操作的类型,地址吗指出操作数的地址。
存储程序的基本思想:将事先编制后的程序和原始数据送入主存储器后才能执行,一旦程序被启动执行,就无须操作人员干预,计算机会自动逐条执行命令,直到程序执行结束。
【存储程序的工作方式是计算机最核心的设计原理之一,用一句话概括就是:计算机把程序像数据一样存储在内存中,然后自动逐条取出指令执行。这种工作方式彻底改变了早期计算机的运作模式,是现代计算机的基础。】
//这里来使用Java实现 存储程序工作方式的简易模拟器代码。
import java.util.Arrays;
/**
* 模拟存储程序计算机的Java实现
* 类比你的工作经验:
* - 内存数组 -> Redis键值存储
* - 指令执行 -> 微服务调用链
* - PC寄存器 -> Kafka消息偏移量
*/
public class VonNeumannSimulator {
// 模拟内存(统一存储程序和数据)
private final int[] memory = new int[256]; // 类比JVM的堆内存
// 寄存器
private int pc; // 程序计数器(类比Kafka的offset)
private int acc; // 累加器(类比微服务的上下文状态)
// 指令编码(模拟机器指令)
private static final int LOAD = 0x01; // 从内存加载到ACC
private static final int ADD = 0x02; // 加法运算
private static final int STORE = 0x03; // 存储ACC到内存
private static final int JUMP = 0x04; // 跳转指令
private static final int HALT = 0xFF; // 停机
/**
* 加载程序到内存(类比Docker镜像加载)
* @param program 程序指令序列
*/
public void loadProgram(int[] program) {
System.arraycopy(program, 0, memory, 0, program.length);
pc = 0; // 重置程序计数器
acc = 0; // 清空累加器
}
/**
* 执行一个指令周期(类比微服务调用链的一个节点)
*/
public void executeCycle() {
// 1. 取指令(类似从Kafka消费消息)
int opcode = memory[pc++]; // 自动递增PC
// 2. 译码执行
switch (opcode) {
case LOAD:
int addr = memory[pc++]; // 取操作数地址
acc = memory[addr]; // 加载数据
System.out.printf("LOAD [%d] -> ACC=%d\n", addr, acc);
break;
case ADD:
addr = memory[pc++];
acc += memory[addr];
System.out.printf("ADD [%d] -> ACC=%d\n", addr, acc);
break;
case STORE:
addr = memory[pc++];
memory[addr] = acc;
System.out.printf("STORE ACC -> [%d]=%d\n", addr, acc);
break;
case JUMP:
pc = memory[pc]; // 直接跳转
System.out.printf("JUMP to %d\n", pc);
break;
case HALT:
System.out.println("HALT");
System.exit(0);
default:
throw new RuntimeException("Unknown opcode: " + opcode);
}
}
/**
* 打印内存快照(类比Arthas的memory命令)
*/
public void printMemorySnapshot() {
System.out.println("---- Memory Snapshot ----");
for (int i = 0; i < 16; i++) { // 只显示前16个单元
System.out.printf("[%02d]: %d\t", i, memory[i]);
if ((i + 1) % 4 == 0) System.out.println();
}
System.out.println("------------------------");
}
public static void main(String[] args) {
VonNeumannSimulator simulator = new VonNeumannSimulator();
// 模拟程序:计算 5 + 10 并存储结果
int[] program = {
LOAD, 0x10, // 加载地址16的值到ACC
ADD, 0x11, // 加地址17的值
STORE, 0x12, // 存结果到地址18
HALT // 停机
};
// 初始化数据区(类比数据库预置数据)
simulator.memory[0x10] = 5; // 地址16存放操作数5
simulator.memory[0x11] = 10; // 地址17存放操作数10
simulator.loadProgram(program);
simulator.printMemorySnapshot();
// 执行模拟(类似微服务调用链执行)
System.out.println("---- Execution Trace ----");
while (true) {
simulator.executeCycle();
}
}
}
2.计算机功能部件:
3. 计算机的性能指标
4. 小结
小结部分不定时更新,有新的认知或者收获都会回来补充。