CS基础
计算机组成原理

【筑基·034】程序员绕不开的四座地基:CS基础体系总览

码农修仙传 · 筑基期 · 第34篇
我是玄芯散人,带你从炼气修到大乘。


境界标识

╔══════════════════════════════════════╗
║     筑基期 · 第34篇                   ║
║     计算机组成/OS/数据结构/网络四座地基    ║
║     预计阅读:12分钟                   ║
╚══════════════════════════════════════╝

修仙引入

修真小说里,筑基不是往丹田里灌灵气就完了。宗门给你一块地,你得在上面建四根柱子。四根柱子的高低粗细决定你这辈子能盖多高的楼。

柱子之间还不是各建各的。数据结构这根柱子歪了,操作系统的进程调度就站不住。操作系统这根柱子短了,网络的Socket通信就悬在半空。四根柱子互相借力,最后撑起的是同一片天花板,就是你写的每一行业务代码。

上一篇033讲了"为什么有人三年还在炼气",拆解了停滞的原因。这篇讲往哪走:筑基要筑的四座地基,它们之间什么关系,先学哪个后学哪个,每座学到什么程度算够。


硬核主体

一、为什么是这四座

计算机科学的知识庞大到一个人一辈子学不完。但站在程序员实战的立场,真正左右你"能不能看懂代码背后发生了什么"的,就四块:

  • 计算机组成原理:硬件怎么工作
  • 操作系统:软件怎么管硬件
  • 数据结构与算法:怎么组织数据让程序跑得快
  • 计算机网络:机器之间怎么通信

有人会问:数据库呢?编译原理呢?软件工程呢?

数据库是数据结构和操作系统的上层组合。B+树索引是数据结构,事务隔离靠操作系统的锁和并发控制。你把数据结构和操作系统两座打牢了,数据库的原理自然能看懂。

编译原理是金丹期的内容,筑基期不碰。软件工程偏经验积累,不在这四座里面。

这四座的选择标准很简单:缺了任何一座,后面学什么都会卡。不懂数据结构,你写不出快的代码。不懂操作系统,你看不懂为什么多线程会出bug。不懂组成原理,你理解不了CPU缓存和内存屏障。不懂网络,你的程序就是个孤岛。

二、四座地基的依赖拓扑

四座地基不是平铺的四块砖,它们之间有明确的依赖关系。先看图:

四座地基依赖关系

OS直接运行在硬件上
调度依赖CPU中断/MMU

OS内部大量用数据结构
红黑树/哈希表/链表

网络通信走系统调用
Socket/epoll在内核里

协议栈用数据结构
路由表/滑动窗口

网卡DMA/中断
物理层收发包

计算机组成原理
硬件怎么工作

操作系统
软件怎么管硬件

数据结构与算法
怎么组织数据

计算机网络
机器间怎么通信

这张图的信息量很大,拆开看:

组成原理是所有地基的地基。操作系统直接跑在硬件上,它管理的进程调度靠CPU的时间片中断,虚拟内存靠MMU做地址翻译,文件系统靠磁盘控制器。你不理解硬件怎么工作,操作系统的很多设计就只是"规定"而不是"道理"。

数据结构是操作系统的工具箱。Linux内核里到处都是数据结构:进程调度器用红黑树管理进程队列,文件系统用B+树管理目录索引,网络协议栈用链表管理socket连接。数据结构不好的人看内核代码像看天书,不是因为内核逻辑多复杂,是连容器都看不懂。

操作系统是网络的支撑。你写一行 socket.connect(),背后是操作系统的TCP协议栈在跑三次握手。epoll的实现完全在内核里,不懂操作系统的人学epoll只能背概念。

组成原理也直接支撑网络。网卡收包靠DMA把数据搬到内存,靠中断通知CPU处理。物理层的每一帧都经过硬件通道,这部分属于组成原理和网络的交叉地带。

三、每座地基学到什么程度

四座地基不是每座都要学到专家级别。筑基期的目标很明确:能看懂代码背后发生了什么。下面逐一说每座学到什么程度算够。

计算机组成原理:理解到"CPU怎么执行指令"

组成原理回答的问题是:你写的代码,CPU怎么执行的?

需要掌握的:

  • CPU的指令周期,也就是取指然后解码然后执行然后访存然后写回
  • 寄存器和内存的层次关系:为什么有L1/L2/L3缓存
  • 汇编语言能读简单的,不是让你手写汇编,是看懂编译器生成的汇编
  • 总线概念:CPU怎么跟内存和外设通信

不需要掌握的(这些在元婴期深入):

  • 具体某款CPU的寄存器位域
  • 外设控制器的编程方法
  • 芯片手册怎么读
// 一行C代码
int a = 1 + 2;

// 编译成ARM64汇编后(筑基期只要求能读懂,不要求手写汇编)
// mov  w0, #1      ; 把1放进寄存器w0
// mov  w1, #2      ; 把2放进寄存器w1
// add  w0, w0, w1  ; w0 = w0 + w1 = 3
// str  w0, [sp, #4]; 把结果存到栈上变量a的位置

你能说出"CPU先取到mov指令,解码后执行寄存器赋值,最后把结果写回内存",组成原理这关就算过了。知道缓存行是64字节,知道CPU缓存命中率左右程序性能,也算加分。

操作系统:理解到"程序跑在OS上"

操作系统回答的问题是:你的程序跑的时候,OS在背后做了什么?

需要掌握的:

  • 进程和线程的区别:调度方式,地址空间隔离,上下文切换的代价
  • 虚拟内存:为什么每个进程以为自己独占4GB
  • 系统调用:用户态到内核态的切换
  • 文件系统概念:inode是什么,目录树怎么组织,VFS在做什么
  • 锁和并发:mutex怎么用,死锁的四个条件,volatile为什么不够用

不需要掌握的(这些在金丹期深入):

  • 内核源码精读
  • CFS调度器的红黑树实现
  • 写Linux内核模块
import os

# fork之后,父子进程各自跑
pid = os.fork()
if pid == 0:
    # 子进程:独立地址空间,独立PC
    print(f"子进程 pid={os.getpid()}")
    os._exit(0)
else:
    os.waitpid(pid, 0)  # 等子进程结束
    print("父进程继续")

你能解释fork之后操作系统为子进程复制了页表(写时复制),能说出waitpid为什么不会阻塞整个系统,操作系统这关就算过了。

数据结构与算法:理解到"选对工具"

数据结构回答的问题是:面对一个具体问题,你选什么数据结构,代价是多少?

需要掌握的:

  • 常见数据结构包括数组、链表、栈、队列、哈希表以及树形结构,掌握每种的基本操作和时间代价
  • 排序算法:冒泡和快排和归并的时间空间代价
  • 大O表示法:能估算自己代码的时间复杂度
  • 缓存友好性:为什么数组比链表快(CPU缓存行)

不需要掌握的:

  • 红黑树的手写实现(知道用途和复杂度就行)
  • 动态规划的所有变体
  • 竞赛级算法技巧
# 同样找第K大元素,不同数据结构差1000倍
import heapq

def kth_largest_sort(nums, k):
    # 方法1:排序后取第K个,O(n log n)
    return sorted(nums)[-k]

def kth_largest_heap(nums, k):
    # 方法2:小顶堆维护K个元素,O(n log k)
    heap = []
    for num in nums:
        if len(heap) < k:
            heapq.heappush(heap, num)
        elif num > heap[0]:
            heapq.heapreplace(heap, num)
    return heap[0]

你看到这段代码,能说出"n=100万、k=10时,方法1要做约2000万次比较,方法2只做约330万次",数据结构这关就过了。

计算机网络:理解到"数据怎么出去怎么回来"

网络回答的问题是:你发一个HTTP请求,数据经过哪些层到达服务器,响应怎么回来?

需要掌握的:

  • TCP/IP四层结构:最上层是HTTP所在的层,传输层负责端到端,网络层负责寻路,链路层负责物理传输
  • TCP三次握手和四次挥手:不是背流程,是知道为什么
  • HTTP请求响应:GET和POST的区别,状态码含义
  • DNS解析:域名怎么变IP
  • Socket编程:能写一个简单的echo服务器

不需要掌握的:

  • TCP拥塞控制的数学理论
  • BGP路由协议
  • QUIC和SCTP等底层传输协议细节
import socket

# 客户端发HTTP请求
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("example.com", 80))  # 三次握手在这步完成
client.send(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
response = client.recv(4096)
client.close()  # 四次挥手在这步完成

你能解释connect背后操作系统做了什么,能说出为什么TIME_WAIT要等2MSL,网络这关就过了。

四、学习顺序建议

四座地基有依赖关系,学习顺序不能乱。

推荐学习顺序

第一步
数据结构

第二步
组成原理

第三步
操作系统

第四步
网络

为什么先学数据结构?因为它是工具箱。后面学操作系统时,进程调度器用红黑树,文件系统用B+树,网络协议栈用链表。不懂这些容器,看什么底层代码都费劲。而且数据结构不依赖其他三座,可以零基础直接入门。

为什么组成原理排第二?因为操作系统直接跑在硬件上。你不知道CPU怎么执行指令、不知道缓存是什么,学操作系统时很多设计只能死记。

操作系统排第三。有了数据结构做工具,有了组成原理做硬件认知,学操作系统时能真正理解"为什么这么设计",而不是背概念。

网络排最后。网络通信走系统调用,协议栈在内核里实现,这些都依赖操作系统知识。你先理解了进程是什么,先理解了文件描述符是什么,先理解了系统调用怎么切换,再看Socket和epoll会顺很多。

当然这不是唯一路线。如果你已经在工作中积累了某块的知识,可以跳过先学其他的。但如果是零基础系统性补课,按这个顺序走效率最高。

五、学习资源和时间预算

四座地基都学一遍需要多久?按每天投入2小时算:

地基推荐资源预计时间
数据结构《算法图解》入门,LeetCode刷100题3个月
组成原理CSAPP前6章2个月
操作系统OSTEP(免费在线)2个月
网络《计算机网络:自顶向下方法》前5章2个月

合计约9个月。听起来很长,但这是在打基础。基础打好了,后面学什么工具、什么语言都快。基础没打好,学什么都像在沙子上盖楼。

def study_plan():
    """筑基四座地基的时间预算"""
    foundations = [
        ("数据结构", 90, "算法图解 + LeetCode"),
        ("组成原理", 60, "CSAPP前6章"),
        ("操作系统", 60, "OSTEP"),
        ("网络", 60, "自顶向下方法前5章"),
    ]
    total_days = sum(d for _, d, _ in foundations)
    total_hours = total_days * 2  # 每天2小时
    return f"总计{total_days}天约{total_hours}小时,约{total_days/30:.0f}个月"

print(study_plan())
# 输出: 总计270天约540小时,约9个月

540小时听起来多,但分到9个月,每天2小时。大多数人每天刷手机的时间远超2小时。

六、常见学习误区

误区一:四座并行学。有人同时开四本书,每本看一章。结果数据结构还在看链表,组成原理已经讲到流水线了,知识之间搭不上。四座有依赖,按顺序学效率最高。

误区二:只看不练。看《CSAPP》觉得都懂了,但从来没写过系统调用的代码。上一篇033讲过这个坑(根因三:知行脱节),这里再强调一次:知识停留在眼睛里,没进手。每学完一个概念,写段代码验证一下。

误区三:钻太深。组成原理学到晶体管原理,操作系统学到内核源码。筑基期的目标是"看懂代码背后发生了什么",不是"成为硬件工程师"或"成为内核开发者"。每个概念学到能讲清楚就够了,深入留到后续境界。

误区四:跳过组成原理。很多人觉得组成原理"离业务太远"直接跳过。结果学操作系统时不懂为什么有缓存行对齐,学并发时不理解内存屏障,学性能调优时看不懂CPU缓存命中率。组成原理是四座里最容易被忽视但牵连最广的。


修仙术语对照表

修仙术语技术现实本篇位置
四座地基组成原理/OS/数据结构/网络全文主线
柱子歪了某块基础没打好,牵连其他模块修仙引入
工具箱数据结构是操作系统的底层工具依赖拓扑
天道规则操作系统管理硬件的法则依赖拓扑
传送阵网络通信依赖拓扑
丹田灌灵往脑子里灌知识但不系统误区一
闭门造车只看不练误区二
走火入魔钻太深超出筑基范围误区三
灵脉硬件通道,CPU和内存之间的通路组成原理
经脉学习路径和知识脉络学习顺序
实修写代码验证概念误区二
宗门传承经典教材系统性学习推荐资源
修炼境界技术能力层级钻太深
孤岛不懂网络时程序的状态为什么四座

进阶条件

  • 能用一句话说清四座地基各自解决什么问题
  • 能画出四座地基的依赖拓扑图,标出谁依赖谁
  • 知道学习顺序:数据结构然后组成原理然后操作系统然后网络,并且能说清为什么
  • 每座地基至少读过一本推荐教材的前三章
  • 能说出组成原理跟操作系统之间的关系(OS调度依赖CPU中断和MMU)
  • 能说出数据结构在操作系统中的三个具体用处(红黑树用于调度队列,B+树用于文件索引,链表用于连接管理)
  • 有一个9个月的学习计划,明确每周投入多少时间

如果你勾掉了5条以上,你的筑基地基已经初具雏形。下一篇带你做一次自测,看看四座地基里你到底缺哪一块。


下期预告 + 互动

下一篇:工作五年还在炼气期?筑基的四座地基你缺哪一块。今天讲了四座是什么,它们之间什么关系,该怎么学。下期给你一套自测题,逐座检查你的掌握程度,找到薄弱环节,精准补课。

互动问题:四座地基里,你觉得哪一座最薄弱?是从来没学过组成原理,还是数据结构只停留在"会用但不懂数据结构"的阶段?评论区说说你的情况,我来帮你判断该怎么补。

我是玄芯散人,带你修到大乘。


本文是「码农修仙传」系列第34篇。系列导航见 xren.ren

Logo

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

更多推荐