【第一章-计算机系统概述】

发布于:2025-06-23 ⋅ 阅读:(20) ⋅ 点赞:(0)

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. 小结

小结部分不定时更新,有新的认知或者收获都会回来补充。


网站公告

今日签到

点亮在社区的每一天
去签到