计算机工作原理详解

当我们敲击键盘、运行程序时,底层究竟发生了什么?本文从计算机发展史、冯·诺依曼体系出发,逐步拆解 CPU 的执行流程、编程语言的演进,以及操作系统如何管理进程与内存。理解这些底层原理,是迈入 Java EE 高阶开发前不可或缺的技术铺垫。

目录

  • 一、计算机发展史
  • 二、冯·诺依曼体系结构
  • 三、CPU 基本工作流程(逻辑门 / ALU / 寄存器 / 控制单元 / 指令)
  • 四、编程语言
  • 五、操作系统(进程 / 调度 / 内存管理 / 进程间通信)

一、计算机发展史

人类对计算的需求贯穿历史,推动着计算工具不断演进,大致经历了从一般计算工具到机械计算机,再到如今电子计算机的历程。目前我们处于“电子计算机”时代,其发展潮流是更快、更稳、更微型。

示例:早期的算盘是简单的计算工具,只能进行基本的加减乘除;而如帕斯卡计算器之类的机械计算机,通过齿轮的转动来实现计算,相比算盘在效率上有了一定提升。

推荐书籍:《计算机简史》

二、冯·诺依曼体系结构(Von Neumann Architecture)

现代计算机大多遵循冯·诺依曼体系结构,该体系包含输入设备、存储器、输出设备、运算器和控制器,其中运算器和控制器共同组成 CPU。各部分之间通过数据流、指令流和控制流相互联系。

  • CPU(中央处理器):负责算术运算与逻辑判断。
  • 存储器:分为外存与内存,以二进制方式存储数据。
  • 输入设备:用户向计算机下达指令的设备,如键盘、鼠标。
  • 输出设备:计算机向用户反馈结果的设备,如显示器、打印机。

针对存储空间大小,存在如下关系:

硬盘 > 内存 >> CPU 寄存器

针对数据访问速度,存在如下关系:

CPU 寄存器 > 内存 > 硬盘

示例:当我们用键盘(输入设备)输入文字时,文字先被暂存到内存(存储器)中,CPU 对其进行处理后,再通过显示器(输出设备)呈现出来。

三、CPU 基本工作流程

(一)逻辑门与门电路

  1. 电子开关——机械继电器:类似于水龙头,线圈通电后产生磁场吸引机械臂闭合电路,断电则断开。借助电子开关即可实现 1 位(bit)的逻辑运算。

  2. 门电路(Gate Circuit):由电子开关构建而成,能实现 1 位(bit)的基本逻辑运算,包括非门、与门、或门、异或门等。

    • 非门:输入与输出相反,真值表如下:

      输入输出
      TRUEFALSE
      FALSETRUE
    • 与门:只有全部输入均为 TRUE 时,输出才为 TRUE,真值表如下:

      输入 1输入 2输出
      TRUETRUETRUE
      TRUEFALSEFALSE
      FALSETRUEFALSE
      FALSEFALSEFALSE

(二)算术逻辑单元 ALU(Arithmetic & Logic Unit)

ALU 是执行算术与逻辑运算的核心部件,堪称计算机的“数学大脑”。

  1. 算术单元:负责数字运算,如四则运算。以 8 位加法器为例,它由半加器和全加器组合而成。

    • 半加器:对两个 1 位(bit)数进行相加,真值表如下:

      AB进位和
      0000
      0101
      1001
      1110
    • 全加器:对三个 1 位(bit)数进行相加(两个加数 + 低位进位)。

  2. 逻辑单元:负责逻辑运算,如与、或、非操作,此外还有 8 位非零判断器等。

示例:当进行 1+1 的运算时,ALU 中的半加器会计算出和为 0、进位为 1,全加器再结合可能的进位,完成更复杂的加法运算。

(三)寄存器(Register)与内存(RAM)

  1. 寄存器:由锁存器(门锁)构建,8 位寄存器拥有 8 条数据线,可存储 8 位数据。

  2. 内存:构建原理与寄存器类似但更为复杂,称为 RAM(Random Access Memory,随机存取存储器)。它支持以 O(1) 的时间复杂度访问任意位置的数据,这正是数组按下标随机访问能达到 O(1) 的硬件基础。

示例:寄存器就像工作时手边的临时记事本,能够快速存取少量常用数据;而内存则像一个较大的文件柜,存储着正在运行的程序及其相关数据。

(四)控制单元 CU(Control Unit)

控制单元负责指挥 ALU 执行何种运算,它与 ALU 协同工作,驱动 ALU 完成具体的计算任务。

(五)指令(Instruction)

指令是指导 CPU 工作的命令,由操作码和操作数组成。操作码表示要执行的动作,操作数则是操作所针对的数据(可能是内存地址、寄存器编号等)。指令以二进制形式保存在内存中。

指令表示例:

指令功能说明4 位 opcode操作的地址或者寄存器
LOAD_A从 RAM 的指定地址,将数据加载到 A 寄存器00104 位 RAM 地址
LOAD_B从 RAM 的指定地址,将数据加载到 B 寄存器00014 位 RAM 地址

(六)CPU 的基本工作流程

CPU 的指令周期包括取指阶段、译码阶段和执行阶段。

  1. 取指阶段:CU 根据 PC(程序计数器)的值将指令数据读入 IR(指令寄存器)中。
  2. 译码阶段:CU 分析 IR 中的指令,确定要执行的操作及其操作对象。
  3. 执行阶段:CU 执行相应的操作。

示例:对于指令 00101110(LOAD_A 指令,RAM 地址为 1110,即十进制 14),首先在取指阶段将该指令从内存地址 0 读入 IR;译码阶段分析出“将 RAM 地址 14 的数据加载到 A 寄存器”;执行阶段完成数据的加载,同时 PC 寄存器的值加 1,准备执行下一条指令。

四、编程语言(Programming Language)

(一)程序(Program)

程序是一组指令以及这些指令所要处理的数据,狭义上表现为一组文件。

(二)编程语言的发展

  1. 机器语言:用 0 和 1 编写,可直接被 CPU 执行。
  2. 汇编语言:与机器语言一一对应,用符号代替 0 和 1,需经汇编器翻译成机器语言。
  3. 高级语言:屏蔽底层硬件细节,一条语句往往对应多条指令,需经编译器与连接器翻译成机器语言。

示例:计算 1+2,机器语言可能是一串 0 和 1 的组合;汇编语言可能是 ADD 1,2;而 Java(高级语言)则是 int sum = 1 + 2;。

五、操作系统(Operating System)

exe 可执行文件(一个可执行文件可能会创建出多个进程)

dll,即 exe 执行时所用到的动态链接库

操作系统是管理计算机软硬件资源的系统软件统称,常见的有 Windows、Unix、Linux 等。

(一)操作系统的定位

操作系统具备两个基本功能:

  1. 防止硬件被失控的应用程序滥用。
  2. 向应用程序提供简单一致的机制,用以控制复杂的底层硬件设备。

(二)进程 / 任务(Process / Task)

进程是操作系统对正在运行的程序的抽象,是程序的一次执行过程,也是操作系统进行资源分配的基本单位。

(三)进程控制块抽象(PCB,Process Control Block)

PCB 是描述进程的一组数据结构,包含进程的标识、程序信息、资源分配、调度信息等。操作系统通过组织 PCB 来管理进程。

pid 由系统自动分配。

Java 伪代码示例:

class PCB {
    // 进程的唯一标识 —— pid
    // 进程关联的程序信息,例如是哪个程序、加载到内存的哪个区域等
    // 分配给该进程使用的各项资源
    // 进程调度信息(留待下文讲解)
}

(四)CPU 分配 —— 进程调度(Process Scheduling)

并行

两个 CPU 分别执行各自的指令。

并发

一个 CPU 通过时间片分时复用,制造出“同时”执行的假象。

进程状态
  1. 就绪:随时可以被调度并占用 CPU 执行。
  2. 阻塞:该进程暂时无法参与 CPU 的调度与执行。例如等待输入时,若不输入,进程便会一直处于阻塞状态。
进程的优先级

进程之间是有优先级之分的。

进程的上下文

一个进程被调度到 CPU 上执行,离开 CPU 后,过一段时间还会回到 CPU 上,并依照之前的位置继续向下执行。

进程的记账信息

在优先级机制下,可能导致部分进程分到的 CPU 资源很少,因此需要借助记账机制来识别这类进程,并为其分配更多资源。

在单 CPU 单核计算机中,操作系统采用时间片轮转的方式为进程分配 CPU 资源,不同进程在不同时间段交替使用 CPU。

示例:当我们同时打开浏览器和音乐播放器时,操作系统会让 CPU 在这两个进程之间快速切换,使我们感觉它们在“同时”运行。

(五)内存分配 —— 内存管理(Memory Management)

操作系统采用空间隔离的方式为进程分配内存,不同进程使用内存的不同区域、互不干扰(每个进程拥有各自独立的运行空间,以指针为例,进程不能指向并修改其他进程的内存数据)。

(六)进程间通信(Inter-Process Communication)

Java 对进程间通信的支持相对有限(相较于线程通信),但通信机制本身并不少。

进程之间需要进行信息交换,主流的通信机制包括管道、共享内存、文件、网络、信号量、信号等。其中,网络可支持不同主机上进程之间的通信。

示例:我们在浏览器中向好友发送消息,正是通过网络这种进程间通信机制,实现了浏览器进程与好友聊天软件进程之间的信息交换。

小结

本文围绕“计算机如何工作”这一主线展开:从冯·诺依曼体系结构(输入、存储、输出、运算、控制五大部件)出发,揭示了 CPU 经由取指—译码—执行周期、借助逻辑门、ALU、寄存器与控制单元完成运算的底层过程;进而梳理了从机器语言到高级语言的演进,并说明了操作系统如何通过进程调度、内存隔离与进程间通信来统筹管理硬件资源。掌握这些基础原理,有助于我们更深刻地理解上层 Java EE 程序的运行机制。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐