跳转至

计算机基础总论

适用人群:第一次系统学习计算机、准备进入开发或运维工作的读者 前置要求:无 最后更新:2026-07-20


1. 为什么先建立计算机全局模型

学习计算机最容易遇到的问题,不是缺少命令,而是知识彼此割裂:会用 git push,却不知道网络连接为什么会超时;会运行 Python,遇到虚拟环境和动态库冲突时却无从判断;会启动 Docker,磁盘和内存耗尽时又不知道该从哪一层检查。

本章提供一张贯穿全站的地图。可以把一台计算机看成五层协作系统:硬件提供计算与存储资源;操作系统管理硬件并抽象出进程、文件和网络;Shell 与编程语言让人表达任务;Git、SSH、Docker 等工程工具组织协作和交付;应用最终通过网络为用户提供服务。排错时也应沿这五层逐层收缩范围,而不是随机尝试命令。

用户与业务目标
应用、脚本与数据
Git / SSH / Docker / CI
操作系统:进程、文件、权限、网络
硬件:CPU、内存、磁盘、网卡

读完本章,你应该能够解释数据如何被表示、程序如何运行、文件为何有权限、终端与 Shell 有何区别,以及遇到故障时如何先判断问题属于哪一层。


2. 数据表示:所有内容最终都是二进制

计算机底层只区分两种稳定状态,因此用二进制位表示数据。一个 bit 是一个二进制位,取值为 0 或 1;8 bit 组成一个 byte。无符号的 \(n\) 位整数可表示的范围为:

\[ 0 \le x \le 2^n - 1 \]

例如 8 位无符号整数范围是 0 到 255。常见有符号整数采用二进制补码,\(n\) 位范围为:

\[ -2^{n-1} \le x \le 2^{n-1}-1 \]

所以 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 向后兼容,已成为网络和开源项目的默认选择。

乱码通常不是文件“坏了”,而是写入和读取采用了不同编码。排查时先执行:

file README.md
locale
iconv -f GB18030 -t UTF-8 old.txt > new.txt

换行符也有平台差异:Linux/macOS 常用 LF(\n),Windows 传统上使用 CRLF(\r\n)。Git 可以规范换行,但团队应通过 .gitattributes 明确约定,而不是依赖每个人的本地默认值。

2.2 浮点数为什么会有误差

浮点数通常遵循 IEEE 754,用符号位、指数和尾数近似表示实数。许多十进制小数在二进制中是无限循环,因此:

print(0.1 + 0.2 == 0.3)  # False
print(0.1 + 0.2)         # 0.30000000000000004

这不是 Python 的错误,而是有限位二进制表示的结果。金融金额应使用十进制定点数或最小货币单位整数;科学计算比较浮点数时应使用容差:

import math

assert math.isclose(0.1 + 0.2, 0.3, rel_tol=1e-9, abs_tol=1e-12)

3. 硬件:程序真正消耗的资源

CPU 执行指令,内存保存正在使用的代码和数据,磁盘负责长期保存,网卡负责传输。性能问题通常是某种资源成为瓶颈。

CPU 有核心和线程。多核心允许多个任务并行执行,但程序是否能加速取决于可并行比例。Amdahl 定律描述了并行化的上限:若程序中可并行部分占比为 \(p\),使用 \(N\) 个处理单元,理论加速比是:

\[ S(N)=\frac{1}{(1-p)+\frac{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 可以通过 $? 读取上一条命令的退出码,自动化脚本应基于退出码判断成功,而不是只看输出文字。

curl -fsS https://example.com >/dev/null
echo "$?"

command_that_may_fail && echo "成功" || echo "失败"

信号用于异步通知进程。SIGTERM 请求进程优雅退出,使其有机会保存数据;SIGKILL 由内核强制终止,进程无法清理资源。生产环境应先 TERM,确认无响应后再 KILL。

kill -TERM <PID>
kill -KILL <PID>  # 最后手段

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=4w=2x=1,所以 755 表示所有者可读写执行,其他人可读执行;600 适合私钥,只有所有者可读写。

ls -la
stat filename
chmod 600 ~/.ssh/id_ed25519
chmod 755 script.sh
chown user:group filename

目录的执行权限表示“允许进入和访问目录项”,不是执行目录。只有读权限而没有执行权限时,可以列出名字却无法读取内容;只有执行权限时,知道精确文件名可能可以访问,但不能列出目录。

删除文件本质上是从目录中删除名字,只要某个进程仍然打开该文件,磁盘空间可能暂时不释放。遇到“文件已经删除但磁盘仍满”,可以用 lsof +L1 查找被删除但仍打开的文件。


6. 终端、Shell、编辑器与包管理器

终端是输入输出界面,Shell 是读取命令并解释执行的程序。macOS 常见 Terminal/iTerm2 搭配 Zsh,Linux 常见终端模拟器搭配 Bash,Windows 可使用 PowerShell 或 WSL。Shell 的配置文件也不同:Bash 常用 ~/.bashrc,Zsh 使用 ~/.zshrc,PowerShell 使用 $PROFILE

查命令来源时,不要只依赖记忆:

type -a python
command -v git
which docker
man rsync
git push --help

文本编辑器是开发环境的核心。初学者至少应掌握“打开文件、搜索、替换、跳转行、保存退出、查看编码和换行符”。服务器上可用 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 \]

其中 \(L\) 是系统内平均请求数,\(\lambda\) 是平均到达率,\(W\) 是平均停留时间。若服务每秒接收 100 个请求,平均每个请求停留 0.2 秒,则系统中平均约有 20 个并发请求。

网络传输的粗略耗时由固定延迟与数据传输时间组成:

\[ T \approx T_{latency} + \frac{data\ size}{bandwidth} \]

传输大量数据时带宽更重要,频繁发送小请求时往返延迟更关键。优化前应先测量,不要凭感觉调整。至少同时观察平均值、P95/P99 分位数、错误率和资源饱和度。


9. 通用故障诊断方法

可靠排错遵循“先确认事实,再缩小范围,最后改变系统”。建议固定使用以下顺序:

  1. 明确期望与实际现象,记录完整错误、时间、环境和复现步骤。
  2. 判断影响范围:单用户还是全部用户,单机还是所有节点,新版本还是旧版本。
  3. 检查最近变化:代码、配置、证书、依赖、权限、网络策略和数据。
  4. 从底层到上层验证:资源 → 进程 → 端口 → 协议 → 应用 → 数据。
  5. 每次只改变一个变量,并保留回滚方案。
  6. 修复后验证原问题、相关路径和监控指标,再记录根因与预防措施。

一个 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 -asw_vers Linux/macOS 系统与内核
查看命令位置 type -a cmd which 提供更多信息
查看退出码 echo $? 0 通常表示成功
查看环境变量 envprintenv PATH 定位配置差异
查看进程 ps auxtop 进程状态与资源
查看端口 ss -lntplsof -i 监听和连接状态
查看文件 filestat 类型、编码和元数据
查看磁盘 df -hdu -sh 文件系统和目录占用
查看内存 free -hvm_stat Linux/macOS 内存
查看日志 journalctltail -F 系统服务和文件日志
HTTP 诊断 curl -v DNS、TLS、请求响应
DNS 诊断 dignslookup 域名解析证据
帮助手册 man cmdcmd --help 参数的权威入口

11. 后续学习路线

完成本章后,建议按任务链学习,而不是孤立背命令:先学习 Linux 与 Shell 掌握本机与服务器操作,再学习 网络诊断SSH 建立远程排错能力;之后用 GitGitHub 组织协作,通过 Docker 理解可重复交付;需要自动化时进入 Python。准备学习人工智能时,先阅读 AI 学习总览,再按机器学习、深度学习、大语言模型或强化学习路线深入。

延伸阅读


本文档持续维护更新。如有错误或建议,欢迎提交 Issue 或 PR。