《深入理解计算机系统》
深入理解计算机系统
读书先看书之序言:明确他面向的读者——本书是一个导论课本,是面向程序员的,所以并不是那么深入(因为程序员也不需要了解那么多)所以这对于初学者来说是比较容易的,合适的入门之选
第一章:计算机系统漫游
相当于是一个粗略的介绍,导言,但是短小精干
1.1信息就是位+上下文
就像是离散数学里面的谓词逻辑公式,在没有具体的公里系统、结构,模型的情况下,完全就是字符串。所以有了解释才表达具体有效信息
1.2程序被其他程序翻译成不同格式
在 Unix 系统上,从源文件到目标文件的转化是由编译器完成的。主要是4个阶段的程序(预处理器cpp、编译器ccl、汇编器as、链接器ld)一起构成了编译系统(compilation system)
想一想先有鸡还是先有蛋?——当然是长期演化才形成的
1.3了解编译系统如何工作是大有裨益的
- 优化程序性能
- 理解链接时出错
- 避免安全漏洞。如缓冲区溢出漏洞
1.4处理器读并解释储存在内存中的指令
1.4.1系统的硬件组成
-
1.总线。贯穿整个系统的一组电子管线,它携带信息字节并且负责在各个部件之间传递,通常被设计成为传输定长的字节块,也就是字(word),具体取决于系统
-
2.I/O设备。系统与外部世界的连通通道
-
控制器和适配器的区别在适配器相当于可拓展的I/O
-
图1-4 一个典型的系统硬件组成
CPU:中央处理器单元;ALU:算术/逻辑单元;PC:程序计数器;USB:通用串行总线
-
-
3.主存
- 一个临时储存设备,在处理器执行程序时,用来存放程序和程序处理的数据
- 物理上,主存是一组动态随机存取储存器(DRAM)芯片
- 逻辑上,存储器是一个线性的字节数组
-
4.处理器
-
中央处理器(CPU)是解释(或执行)储存在主存中指令的引擎。其核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)
-
从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。处理器看起来就像是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集架构决定的
-
更深入的还有抽象化简的图灵机模型
-
可能的操作
-
加载:主存到寄存器覆盖
-
存储:寄存器到主存覆盖
-
操作:把两个寄存器的内容复制到ALU计算,并放回一个寄存器覆盖
-
跳转:从指令中抽取一字复制到程序计数器覆盖
-
现代处理使用了非常复杂的机制来加速程序执行;注意区分处理器指令集架构和处理器的微体系结构
指令集架构描述每一条机器码效果
微处理器结构描述处理器是如何实现
-
-
1.4.2运行hello程序
1.5高速缓存至关重要
系统花费大量时间把信息从一个地方挪到另一个地方,在程序员看来这就是花销,减慢了程序"真正"的工作。因此,系统设计者的一个主要目标就是使这些复制操作尽可能快完成or减少复制
1.6储存设备组成层次结构
根据局部性原理,可以在处理器和一个较大较慢的设备(如主存)之间插入一个更小更快的储存设备(如高速缓存)
思想就是将上一层次的储存器作为低一层次储存器的高速缓存
1.7操作系统管理硬件
可在图1-4中画出信息流,涉及一系列复制
操作系统两个基本功能:
(1)防止硬件被失控应用程序滥用;
(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备
操作系统通过几个基本抽象概念(进程、虚拟内存和文件)来实现这两个功能
Unix,Posix和标准Unix规范
不同的发展分支难以那一形成统一,阻碍兼容性,标准应运而生
1.7.1进程
进程是操作系统对于一个正在运行程序的抽象
看似是每个进程独占硬件,实则不是
并发运行则是说一个进程的指令和另一个进程的指令是交错执行的。这种实现机制称为上下文切换。当然,多处理器系统更加复杂
操作系统会保持跟踪进程运行所需的所有状态。这种状态就是上下文,包含许多信息,如PC和寄存器文件的当前值,以及主存的内容
如图 1-12 所示,从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的
内核是操作系统代码常驻主存的一部分
应用程序执行系统调用(system call)控制权传递给内核,然后内核执行请求操作并返回应用程序
注意:内核不是一个独立的进程,她是系统管理全部进程所用代码和数据结构的集合
1.7.2线程
通常认为一个进程只有单一的控制流,但是现代系统中一个进程实际上可以由多个线程执行单元
每个线程都运行在进程的上下文中,并共享同样的代码和全局数据
网络服务器中对并行处理需求很大,线程成为越来越重要的编程模型。
因为多线程之间比多进程之间更容易共享数据,也因此线程比多进程更高效
1.7.3虚拟内存
虚拟内存是一个抽象概念,它为每一个进程提供了一个假象(虚拟),即每个进程都在独立的使用主存。
每个进程看到的内存都是一致的,称为虚拟地址空间。
每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能
- 程序代码和数据。对所有程序来说,代码都是从同一固定地址开始,紧接着的是和C全局变量对应的数据位置
- 堆。
- 共享库。大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样的共享库的代码和数据的区域。共享库的概念非常强大
- 栈。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩
- 内核虚拟内存。地址空间顶部区域是为内核保留的。不允许程序读写这个区域的内容或者直接调用内核代码定义函数。它们必须调用内核来执行这些操作
虚拟内存的运作需要硬件和操作系统软件之间精密复杂的交互,包括堆处理器生成的每个地址的硬件翻译。
基本思想是把一个进程虚拟地址内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存
1.7.4文件
文件就是字节序列,仅此而已
若要显得高端一些,可以将数据的转移过程称之为流
1.8系统之间利用网络通信
现代系统经常通过网络和其他系统连接到一起。从单独的系统来看,网络可以视为一个I/O设备
网络也可以看做总线的抽象的拓扑伸展
1.9重要主题
1.9.1Amdahl定理
Gene Amdahl,计算领域的早期先锋之一,对提升系统某一部分性能所代来的效果做出了简单却有见地的观察。
主要思想是,当我们对系统的某个部分加速时,其对于系统整体性能的影响取决于该部分的重要程度和加速程度。
若系统执行某个应用程序需要时间为
由此,可以计算出加速比
注意,此处表示相对性能,但其实还有其他方法,比较模糊
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~