计算机基础总论¶
适用人群:第一次系统学习计算机、准备进入开发或运维工作的读者 前置要求:无 最后更新:2026-07-20
1. 为什么先建立计算机全局模型¶
学习计算机最容易遇到的问题,不是缺少命令,而是知识彼此割裂:会用 git push,却不知道网络连接为什么会超时;会运行 Python,遇到虚拟环境和动态库冲突时却无从判断;会启动 Docker,磁盘和内存耗尽时又不知道该从哪一层检查。
本章提供一张贯穿全站的地图。可以把一台计算机看成五层协作系统:硬件提供计算与存储资源;操作系统管理硬件并抽象出进程、文件和网络;Shell 与编程语言让人表达任务;Git、SSH、Docker 等工程工具组织协作和交付;应用最终通过网络为用户提供服务。排错时也应沿这五层逐层收缩范围,而不是随机尝试命令。
读完本章,你应该能够解释数据如何被表示、程序如何运行、文件为何有权限、终端与 Shell 有何区别,以及遇到故障时如何先判断问题属于哪一层。
2. 数据表示:所有内容最终都是二进制¶
计算机底层只区分两种稳定状态,因此用二进制位表示数据。一个 bit 是一个二进制位,取值为 0 或 1;8 bit 组成一个 byte。无符号的 \(n\) 位整数可表示的范围为:
例如 8 位无符号整数范围是 0 到 255。常见有符号整数采用二进制补码,\(n\) 位范围为:
所以 32 位有符号整数最大值是 \(2^{31}-1\)。当运算结果超出类型范围,就可能发生整数溢出。高级语言可能抛出错误、自动扩容或静默回绕,不能假设所有语言行为相同。
存储容量通常使用 byte 计量。操作系统常以二进制倍率显示容量:
| 单位 | 二进制含义 | 常见用途 |
|---|---|---|
| KiB | \(2^{10}\) byte | 小型配置、文本 |
| MiB | \(2^{20}\) byte | 图片、进程内存 |
| GiB | \(2^{30}\) byte | 内存、磁盘 |
| TiB | \(2^{40}\) byte | 大型磁盘、数据集 |
硬盘厂商常用十进制 GB(\(10^9\) byte),操作系统可能按 GiB 显示,因此标称 1 TB 的磁盘不会显示为整整 1024 GiB。这不是容量丢失,而是计量口径不同。
2.1 文本与编码¶
文本也必须先映射为数字。ASCII 只覆盖基础英文字符;Unicode 为全球字符分配统一码点;UTF-8 再把码点编码为 1 到 4 个 byte。UTF-8 与 ASCII 向后兼容,已成为网络和开源项目的默认选择。
乱码通常不是文件“坏了”,而是写入和读取采用了不同编码。排查时先执行:
换行符也有平台差异:Linux/macOS 常用 LF(\n),Windows 传统上使用 CRLF(\r\n)。Git 可以规范换行,但团队应通过 .gitattributes 明确约定,而不是依赖每个人的本地默认值。
2.2 浮点数为什么会有误差¶
浮点数通常遵循 IEEE 754,用符号位、指数和尾数近似表示实数。许多十进制小数在二进制中是无限循环,因此:
这不是 Python 的错误,而是有限位二进制表示的结果。金融金额应使用十进制定点数或最小货币单位整数;科学计算比较浮点数时应使用容差:
3. 硬件:程序真正消耗的资源¶
CPU 执行指令,内存保存正在使用的代码和数据,磁盘负责长期保存,网卡负责传输。性能问题通常是某种资源成为瓶颈。
CPU 有核心和线程。多核心允许多个任务并行执行,但程序是否能加速取决于可并行比例。Amdahl 定律描述了并行化的上限:若程序中可并行部分占比为 \(p\),使用 \(N\) 个处理单元,理论加速比是:
如果只有 80% 的工作可并行,即使处理器无限多,加速比也不会超过 5。增加机器之前应先判断串行部分和 I/O 等待是否才是瓶颈。
内存比磁盘快得多,但断电后内容消失。程序申请的内存长期不释放会导致泄漏;系统物理内存不足时可能使用 swap,性能会明显下降;再严重时 Linux 的 OOM Killer 会终止进程。磁盘问题除了容量不足,还包括 inode 耗尽、随机 I/O 过多和日志无限增长。
常用观察命令:
# CPU、负载和进程
uptime
top
ps aux --sort=-%cpu | head
# 内存与交换空间
free -h
vmstat 1
# 磁盘容量、inode 与目录占用
df -h
df -i
du -sh ./* | sort -h
# 块设备和 I/O(部分系统需要 sysstat)
lsblk
iostat -xz 1
平均负载不是 CPU 使用率。Linux load average 近似表示正在运行或等待不可中断资源的任务数。8 核机器负载为 8 可能只是满载,2 核机器负载为 8 往往代表明显排队。判断时必须结合 CPU 核数、I/O 等待和业务延迟。
4. 操作系统:把硬件抽象成可管理对象¶
操作系统内核拥有最高权限,负责进程调度、内存管理、文件系统、设备驱动和网络协议栈。普通程序不能随意访问硬件,必须通过系统调用请求内核服务,例如打开文件、分配内存、创建进程和建立网络连接。
4.1 程序、进程与线程¶
程序是磁盘上的静态文件,进程是程序的一次运行实例。一个进程拥有独立的虚拟地址空间、文件描述符、环境变量和权限身份。线程是进程中的执行流,同一进程的线程共享内存,因此通信快,但错误同步会产生竞态条件。
进程退出时会返回退出码:0 通常表示成功,非 0 表示失败。Shell 可以通过 $? 读取上一条命令的退出码,自动化脚本应基于退出码判断成功,而不是只看输出文字。
信号用于异步通知进程。SIGTERM 请求进程优雅退出,使其有机会保存数据;SIGKILL 由内核强制终止,进程无法清理资源。生产环境应先 TERM,确认无响应后再 KILL。
4.2 虚拟内存与地址空间¶
每个进程看到的是独立虚拟地址空间,操作系统通过页表映射到物理内存。这样既能隔离进程,也允许共享库、内存映射文件和按需加载。常见的“内存占用”指标口径不同:虚拟内存包含已映射但未实际驻留的空间;RSS 更接近当前驻留物理内存,但共享页可能被多个进程重复统计。
4.3 文件描述符¶
Linux 把普通文件、终端、管道和网络套接字统一抽象为文件描述符。每个进程默认有三个描述符:0 是标准输入,1 是标准输出,2 是标准错误。Shell 重定向正是在改变这些描述符的连接关系:
command >output.log # 只重定向标准输出
command 2>error.log # 只重定向标准错误
command >all.log 2>&1 # 合并输出和错误
producer | consumer # producer 的 stdout 接到 consumer 的 stdin
“Too many open files”通常意味着进程没有关闭文件或连接,或者系统限制过低。可用 lsof -p <PID> 和 ulimit -n 分别检查实际打开对象和限制。
5. 文件系统、路径与权限¶
文件系统把块设备组织为目录树。绝对路径从根目录 / 开始;相对路径从当前目录开始;. 表示当前目录,.. 表示父目录,~ 表示当前用户家目录。脚本应尽量显式处理工作目录,避免“在我的终端能运行,换个目录就失败”。
Unix 权限分为所有者、用户组和其他用户,每组具有读 r、写 w、执行 x 三个位。八进制中 r=4、w=2、x=1,所以 755 表示所有者可读写执行,其他人可读执行;600 适合私钥,只有所有者可读写。
目录的执行权限表示“允许进入和访问目录项”,不是执行目录。只有读权限而没有执行权限时,可以列出名字却无法读取内容;只有执行权限时,知道精确文件名可能可以访问,但不能列出目录。
删除文件本质上是从目录中删除名字,只要某个进程仍然打开该文件,磁盘空间可能暂时不释放。遇到“文件已经删除但磁盘仍满”,可以用 lsof +L1 查找被删除但仍打开的文件。
6. 终端、Shell、编辑器与包管理器¶
终端是输入输出界面,Shell 是读取命令并解释执行的程序。macOS 常见 Terminal/iTerm2 搭配 Zsh,Linux 常见终端模拟器搭配 Bash,Windows 可使用 PowerShell 或 WSL。Shell 的配置文件也不同:Bash 常用 ~/.bashrc,Zsh 使用 ~/.zshrc,PowerShell 使用 $PROFILE。
查命令来源时,不要只依赖记忆:
文本编辑器是开发环境的核心。初学者至少应掌握“打开文件、搜索、替换、跳转行、保存退出、查看编码和换行符”。服务器上可用 Nano 或 Vim,本地开发可使用 VS Code 等编辑器。无论选择什么工具,都应理解实际修改的是普通文本文件,而不是编辑器内部的私有格式。
包管理器负责下载、校验、安装、升级和卸载软件。操作系统包管理器(APT、DNF、Homebrew)安装系统工具;语言包管理器(pip、npm、Cargo)安装语言生态依赖;项目应使用锁文件或明确版本,避免“今天安装”和“下个月安装”得到不同依赖。
# macOS
brew update && brew upgrade
# Ubuntu / Debian
sudo apt update
sudo apt install curl git
# Python 项目应在虚拟环境内安装
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
不要混用 sudo pip install 和项目虚拟环境。前者会污染系统 Python,造成权限和依赖冲突。
7. 网络、身份与最小安全模型¶
网络通信至少要回答四个问题:目标名称如何解析成 IP;数据包通过哪条路由到达;目标端口是否监听并允许通过;应用协议是否正确。浏览器访问 HTTPS 时,大致经历 DNS 解析、TCP 连接、TLS 握手、HTTP 请求和应用处理。
安全上应区分身份认证与权限授权。认证回答“你是谁”,例如密码、SSH 私钥或 Token;授权回答“你能做什么”,例如文件权限、仓库角色和云平台策略。最小权限原则要求只授予完成任务所需的最少权限,并设置有效期、轮换和审计。
基础安全习惯包括:不在仓库提交密钥;账号启用多因素认证;私钥设置权限和密码短语;生产服务避免以 root 运行;定期更新依赖;不直接执行来源不明的 curl ... | sh;备份必须实际验证可恢复。
8. 性能与容量的基本公式¶
延迟(Latency)表示一次操作耗时,吞吐量(Throughput)表示单位时间完成多少操作。降低单次延迟不一定提高总体吞吐量,因为系统还受并发数和瓶颈资源约束。稳定系统常近似满足 Little 定律:
其中 \(L\) 是系统内平均请求数,\(\lambda\) 是平均到达率,\(W\) 是平均停留时间。若服务每秒接收 100 个请求,平均每个请求停留 0.2 秒,则系统中平均约有 20 个并发请求。
网络传输的粗略耗时由固定延迟与数据传输时间组成:
传输大量数据时带宽更重要,频繁发送小请求时往返延迟更关键。优化前应先测量,不要凭感觉调整。至少同时观察平均值、P95/P99 分位数、错误率和资源饱和度。
9. 通用故障诊断方法¶
可靠排错遵循“先确认事实,再缩小范围,最后改变系统”。建议固定使用以下顺序:
- 明确期望与实际现象,记录完整错误、时间、环境和复现步骤。
- 判断影响范围:单用户还是全部用户,单机还是所有节点,新版本还是旧版本。
- 检查最近变化:代码、配置、证书、依赖、权限、网络策略和数据。
- 从底层到上层验证:资源 → 进程 → 端口 → 协议 → 应用 → 数据。
- 每次只改变一个变量,并保留回滚方案。
- 修复后验证原问题、相关路径和监控指标,再记录根因与预防措施。
一个 Web 服务无法访问时,可以按下面的证据链检查:
# 1. 主机资源是否正常
uptime && free -h && df -h
# 2. 进程和服务是否运行
systemctl status myapp
journalctl -u myapp -n 100 --no-pager
# 3. 端口是否监听
ss -lntp
# 4. 本机协议是否正常
curl -v http://127.0.0.1:8080/health
# 5. DNS 和远程连接是否正常
dig example.com
curl -v https://example.com/health
不要一开始就重启系统。重启可能暂时消除现象,也会销毁关键证据。
10. 常用命令速查¶
| 目标 | 命令 | 说明 |
|---|---|---|
| 查看系统信息 | uname -a、sw_vers |
Linux/macOS 系统与内核 |
| 查看命令位置 | type -a cmd |
比 which 提供更多信息 |
| 查看退出码 | echo $? |
0 通常表示成功 |
| 查看环境变量 | env、printenv PATH |
定位配置差异 |
| 查看进程 | ps aux、top |
进程状态与资源 |
| 查看端口 | ss -lntp、lsof -i |
监听和连接状态 |
| 查看文件 | file、stat |
类型、编码和元数据 |
| 查看磁盘 | df -h、du -sh |
文件系统和目录占用 |
| 查看内存 | free -h、vm_stat |
Linux/macOS 内存 |
| 查看日志 | journalctl、tail -F |
系统服务和文件日志 |
| HTTP 诊断 | curl -v |
DNS、TLS、请求响应 |
| DNS 诊断 | dig、nslookup |
域名解析证据 |
| 帮助手册 | man cmd、cmd --help |
参数的权威入口 |
11. 后续学习路线¶
完成本章后,建议按任务链学习,而不是孤立背命令:先学习 Linux 与 Shell 掌握本机与服务器操作,再学习 网络诊断 和 SSH 建立远程排错能力;之后用 Git 与 GitHub 组织协作,通过 Docker 理解可重复交付;需要自动化时进入 Python。准备学习人工智能时,先阅读 AI 学习总览,再按机器学习、深度学习、大语言模型或强化学习路线深入。
延伸阅读¶
- Computer Systems: A Programmer's Perspective:从程序员视角连接硬件、编译、进程、内存与网络
- MDN Web Docs:Web、HTTP、浏览器与 JavaScript 的权威学习入口
- Linux man-pages:Linux 系统调用和命令手册
- The Missing Semester of Your CS Education:MIT 面向工程工具与命令行的公开课程
本文档持续维护更新。如有错误或建议,欢迎提交 Issue 或 PR。