本章以hello程序的生命周期("编写→编译→运行→输出")为核心线索,从程序员视角拆解计算机系统的软硬件协同逻辑,建立"系统是软硬件有机整体"的认知,核心内容分为以下的十大模块。
目录
[一、信息的本质:位 + 上下文](#一、信息的本质:位 + 上下文)
[5.2 设计原理](#5.2 设计原理)
[8.1 概念区分](#8.1 概念区分)
一、信息的本质:位 + 上下文
1.1源程序
实际上就是0/1组成的位序列。 计算机中所有信息(程序、数据、文件等)均以位(0/1) 为最小单位,8位组成1字节,字节通过编码(如ASCII)映射为字符(例:hello.c是ASCII文本文件)。
1.2上下文的作用
相同字节序列需结合上下文解读(可表示整数、浮点数、字符串或机器指令),是系统处理信息的底层逻辑。
二、编译系统:从源程序到可执行文件
流程(以 hello.c 为例)
需经过四个阶段 ,由GCC等编译驱动程序整合工具完成:
|-----|-----|---------|---------|------------------------------------------|
| 阶段 | 工具 | 输入文件 | 输出文件 | 核心操作 |
| 预处理 | cpp | hello.c | hello.i | 处理#include、#define等指令,展开头文件,删除注释 |
| 编译 | ccl | hello.i | hello.s | 将C代码翻译为汇编语言指令(与硬件架构相关) |
| 汇编 | as | hello.s | hello.o | 将汇编代码转为二进制机器指令,生成可重定位目标文件(仅包含当前程序代码) |
| 链接 | ld | hello.o | hello | 合并外部库函数(如printf)和其他目标文件,生成可执行目标文件(可直接运行) |
编译系统屏蔽了底层硬件细节,让程序员无需直接编写机器指令,同时决定程序的性能、安全性等关键特性。
三、计算机硬件系统的核心组件
总线:传输管道,按"字长"(32位/64位)传递字节信息,连接所有硬件组件。
I/O设备:系统与外部交互的接口
主存:临时存储设备(DRAM),逻辑上是线性字节数组,存放运行中的程序指令和数据。
处理器(CPU):执行指令的核心,包含三大部件:
1、程序计数器(PC):存储下一条要执行的指令地址;
2、寄存器文件:高速存储单元,临时存放数据和指令;
3、算术逻辑单元(ALU):执行算术运算(+、×)和逻辑运算(与、或);
工作模式:取指-执行循环(从主存取指令→解码→执行→更新PC)。
四、 hello 程序的完整运行过程
1、 用户在Shell(命令解释器)中输入./hello,Shell进程将命令存入主存;
2、处理器执行Shell指令,读取磁盘中的hello可执行文件,将其指令和数据载入主存;
3、处理器从主存依次读取hello程序的指令并执行:(1)计算"hello, world\n"的存储地址(2)调用printf函数,将数据从主存拷贝到寄存器,再通过总线传输到显示器控制器;
4、显示器将接收的字节序列转为字符,显示在屏幕上;
5、程序执行完毕,处理器返回Shell进程,等待下一条命令。
核心特点:数据在磁盘→主存→寄存器→显示器间多次拷贝,依赖软硬件协同。
五、存储层次结构:解决速度与容量的矛盾
5.1层次结构(从快到慢、容量从小到大) 
|-------------|--------------------|----------------|
| 存储层次 | 核心特点 | 作用 |
| 寄存器(CPU内) | 速度最快、容量最小 | 存放当前执行的核心数据/指令 |
| 高速缓存(Cache) | L1/L2/L3三级(CPU内/外) | 作为主存的高速缓存 |
| 主存 | 速度中等、容量中等 | 存放运行中的程序和数据 |
| 磁盘 | 速度最慢、容量最大 | 长期存储程序和数据 |
| 网络存储 | 速度最慢、容量无限(理论上) | 跨系统数据共享 |
5.2 设计原理
局部性原理:程序运行时,大概率重复访问最近使用的数据或相邻数据;
核心逻辑:上一层存储是下一层的"高速缓存",通过缓存常用数据,平衡速度与容量。
六、操作系统的核心角色:三大抽象
操作系统是硬件与应用程序的中间层,通过抽象化 简化编程,通过资源管理协调多程序运行:
6.1核心抽象
|------|---------------|------------------------------|
| 抽象概念 | 本质含义 | 核心作用 |
| 进程 | 对"正在运行的程序"的抽象 | 让程序看似独占CPU,通过上下文切换实现多进程并发 |
| 线程 | 进程内的执行单元 | 共享进程资源,更高效的并发模型 |
| 虚拟内存 | 对主存+磁盘的抽象 | 为每个进程提供连续的虚拟地址空间,屏蔽物理内存限制 |
| 文件 | 对I/O设备的抽象 | 统一数据存储/访问接口(磁盘、键盘、显示器均可视为文件) |
6.2核心功能
隔离与保护:防止应用程序滥用硬件资源;
资源调度:合理分配CPU、内存、I/O设备给多个进程;
提供接口:通过系统调用让应用程序访问硬件(无需直接操作底层)。
七、系统间的网络通信
7.1网络本质
一种特殊的I/O设备,通过网络适配器连接到总线;
7.2通信原理
数据从本地主存拷贝到网络适配器,经网络传输到远程主机的网络适配器,再写入远程主存;
典型示例(telnet远程运行hello):
客户端:发送hello命令到远程服务器;
服务器:通过Shell运行hello程序,将输出结果回传客户端;
核心:网络是系统间信息复制的通道,支撑跨主机应用(邮件、网页、FTP)。
八、并发与并行(现代系统性能提升关键)
8.1 概念区分
并发(Concurrency):多个活动"同时存在"的抽象(如单CPU同时运行Shell和hello进程,交替执行);
并行(Parallelism):多个活动"同时执行"的具体实现(如多核CPU同时运行多个线程)。
8.2三个实现层次
|----------------|-----------------|---------------------------|
| 层次 | 核心特点 | 硬件依赖 |
| 线程级并发 | 进程内多线程执行 | 单CPU(上下文切换模拟)/多核CPU(真正并行) |
| 指令级并行 | 处理器每个时钟周期执行多条指令 | 现代超标量处理器 |
| SIMD并行(单指令多数据) | 一条指令同时操作多个数据 | 处理器硬件支持(如多媒体、AI计算) |
8.3多核处理器
将多个CPU核心集成在一个芯片上,是实现并行计算的主流硬件基础,每个核心可独立执行线程。
九、抽象的重要性(计算机系统设计核心思想)
抽象的目的:隐藏底层复杂性,降低使用和设计难度;
系统中的关键抽象:
1、程序员视角:API(应用程序接口)、指令集架构(ISA);
2、系统视角:文件、虚拟内存、进程、虚拟机;
核心价值:让不同层级的开发者/使用者专注于自身领域(如程序员无需关注磁盘读写细节,只需调用文件API)。
章节核心小结
1、 计算机系统是硬件(CPU、内存、I/O设备)+ 系统软件(操作系统、编译器) 的有机整体,所有操作本质是"位的移动与解读";
2、 程序运行的核心逻辑:经编译系统转为机器指令,通过存储层次结构提升性能,由操作系统管理资源,依赖软硬件协同完成;
3、 关键思维:系统思维(不局限于代码本身,关注底层运行机制)、优化思维(Amdahl定律)、抽象思维(简化复杂系统);