boxmoe_header_banner_img

Hello! 欢迎来到LLsdogのblog!

加载中

文章导读

CS:APP3e 第一章概述笔记


avatar
llsdog 2025年9月4日 896

CS:APP3e 第一章: 计算机系统漫游

CS:APP的第一章并不是从计算机系统底层架构开始, 而是使用了一个巧妙的手法从C语言的Hello World程序的编译运行过程直达系统底层, 这也正符合书名中的”程序员视角”, 然后再去阐述底层的各个部分, 作为之后进一步带着优化的目的去探索计算机系统的前言, 所以我打算详解此程序的底层执行流程来更加深入理解计算机系统

hello.c的编译与运行

Step 1.编译

一个内容为打印出Hello World的名为hello.c的程序:

编译系统的四个阶段

  1. 预处理阶段:cpp → hello.i
  2. 编译阶段:ccl → hello.s
  3. 汇编阶段:as → hello.o
  4. 链接阶段:ld → hello

此时hello.c就完成了编译, 等待执行

Step 2.在shell键入”hello”的过程

典型的计算机系统硬件组织结构如下图所示(以单核为例)

在原书中, 此时阐述大量概念和过程, 放进来阅读体验不好, 所以我选择继续绘制刚刚的hello执行的流程, 使初学者也能初步理解底层基础知识

键入”hello后按下回车, shell执行一些指令, 下一步硬件将会读取hello这个二进制程序”

Step 3.硬件读取hello二进制程序

过程如下

这样, hello被读入主存等待执行

Step 4.hello被执行

过程如下

这样, hello被逐步读取进CPU执行, 并在屏幕上显示Hello World

小结

此过程从硬件和系统层面向你详细的描述了一个hello.c从编译到执行的过程, 但这只是一个简化的模型, 事实上, 现代处理器采用了许多技术来优化和加速这些过程, 可以观察到, 此过程中, 有以下部分起到了关键作用

  • 缓存和存储设备
  • 系统对硬件行为的控制

缓存和存储设备

前言

你可能注意到, 在命令执行过程中, 命令实际上会在不同的存储设备间移动, 这种移动通常会花费大量的时间, 所以增加存储设备的读写速度是加速运行的关键之一, 但是读写速度越快的存储设备, 造价就越昂贵, 于是, 就有了存储空间大于寄存器, 读写速度大于磁盘的被称为缓存的存储设备出现了, 常常采用多级缓存来使储存大小和读写速度达到平衡, 缓存的存在缩小了文件复制和移动的时耗, 增加了计算机的运行速度

存储设备层级

由于存储设备造价的关系, 同一计算机中的存储设备一般保持着存储空间越大, 读写速度越小的关系, 于是便有了如下层级图, 位于层级图上面的存储设备一般读写速度更快但存储空间更小

L1, L2, L3高速缓存一般用于加快主存和寄存器间的文件复制速度, 一般直接与寄存器交互
L1, L2, L3高速缓存形成了一个存储层次结构:

  • L1缓存: 最接近CPU, 容量最小但速度很快
  • L2缓存: 容量和速度介于L1和L3之间
  • L3缓存: 通常为多核共享, 容量最大但相对较慢

这种层次结构利用了程序的局部性原理来提高整体性能

操作系统和硬件

前言

hello.c的编译和执行需要硬件, 但是却不能直接与硬件交互, 一般都是通过操作系统提供的接口, 所以, 系统理所当然是优化的一部分

操作系统通过向外抽象硬件来规范行为和统一操作, 如下图

进程

当有两个进程在单核上进行时, 通常被抽象为两个进程同时进行, 但实际上不同进程是交叉执行的

线程

一个进程可以有不同的线程处于运行状态, 但是属于同一个进程的不同线程只能运行在不同处理器上

虚拟内存

虚拟内存是对一个进程所使用的不同存储设备的总存储空间的抽象概念, 通常包含如下被精准分开的区

文件

文件就是字节序列, 每个I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件, 为系统,硬件,软件的交互提供了一种规范

网络

概述

网络也可被视为一个I/O设备, 你可以向网络存储, 也可在网络取出, 通过网络可以让不同系统或计算机不再孤立, 而是相互连接
以下是一个远程运行hello的示例图

一些其他重要概念

Amdahl定律

一种描述对一系列过程的某一部分优化给整体带来的影响的公式, 对计算机层面的优化起到了一定指导作用, 这里不再赘述

并行和并发

并发是一个概念, 指一个同时有不同活动的系统
并行是指用并发来使系统运行的更快

多核处理器

多核处理器可实现更快地并发, 结构如下

抽象

抽象是计算机科学中一个很重要的概念, 如操作系统对硬件的抽象

总结(666让AI生成的总结比我写的好多了 😡 )


通过追踪一个简单的hello.c程序从源码到执行的完整过程,我们揭开了计算机系统底层的面纱, 这个看似简单的”Hello, World”程序,实际上触发了一系列复杂而精妙的系统行为:

  • 编译链接:源码经历预处理、编译、汇编、链接四个阶段,最终生成可执行文件
  • 存储层次:程序在寄存器、缓存、主存、磁盘间不断迁移,存储系统的层次化设计平衡了速度与容量的矛盾
  • 系统抽象:操作系统通过进程、虚拟内存、文件等抽象概念,为我们屏蔽了硬件的复杂性
  • 并发执行:看似同时运行的多个程序,实际上通过时间片轮转和多核并行来实现
感谢您的支持
微信赞赏

微信扫一扫

支付宝赞赏

支付宝扫一扫



评论(1)

查看评论列表
评论头像
yuyuangongwu 2025年09月05日
感觉长脑子了

发表评论

表情 颜文字
插入代码
llsdog的博客

MP3

封面
Blue Dragon
泽野弘之
0:00 0:00
播放列表 (3)
封面
Blue Dragon
泽野弘之
--:--
封面
For River
Kan R. Gao
--:--
封面
春弦
塞壬唱片-MSR
--:--

广告

这里不送忍法帖,孩子