2023-08-30    2023-09-07    1213 字  3 分钟

计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。虽然系统的具体实现方式随着时间不断变化,但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件,它们又执行着相似的功能。一些程序员希望深人了解这些组件是如何工作的以及这些组件是如何影响程序的正确性和性能的,以此来提高自身的技能。本书便是为这些读者而写的。

1
2
3
4
5
6
7
#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}

> code/intro/hello.c

尽管 hello 程序非常简单,但是为了让它实现运行,系统的每个主要组成部分都需要协调工作。从某种意义上来说,本书的目的就是要帮助你了解当你在系统上执行 hello 程序时,系统发生了什么以及为什么会这样。

我们通过跟踪 hello 程序的生命周期来开始对系统的学习 ——从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止。

1.1 信息就是‘位+上下文’

hello 程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件,文件名是 hello.c源程序实际上就是一个由值 0 和 1 组成的位(又称为比特)序列,8 个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。

大部分的现代计算机系统都使用 ASCII 标准来表示文本字符,这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符 。 比如,图 1 -2 中给出了 hello.c 程序的 ASCII 码表示。

![[assets/Pasted image 20230830150257.png]]

hello.c 程序是以字节序列的方式储存在文件中的。每个字节都有一个整数值,对应于某些字符。例如,第一个字节的整数值是 35, 它对应的就是字符 ‘#’。第二个字节的整数值为 105, 它对应的字符是 ‘i’ 依此类推。注意,每个文本行都是以一个看不见的换行符 ‘\n’ 来结束的,它所对应的整数值为 10 。像 hello.c 这样只由 ASCII 字符构成的文件称为文本文件,所有其他文件都称为二进制文件

:: 注意,每个文本行都是以一个看不见的换行符 ‘\n’ 来结束的,它所对应的整数值为 10 。

🌟 hello.c 的表示方法说明了一个基本思想:系统中所有的信息 - 包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

作为程序员,我们需要了解数字的机器表示方式,因为它们与实际的整数和实数是不同的。它们是对真值的有限近似值,有时候会有意想不到的行为表现。这方面的基本原理将在第 2 章中详细描述。

:: 写的真是好,简单明了!信息 = 具体上下文下的位序列。

1.2 程序被其他程序翻译成不同的格式

目录

第 1 章 计算机系统漫游
1.1 信息就是位+上下文
1.2 程序被其他程序翻译成不同的格式 
1.3 了解编译系统如何工作是大有益处的 
1.4 处理器读并解释储存在内存中的指令
    1.4.1 系统的硬件组成
    1.4.2 运行 hello 程序
1.5 高速缓存至关重要
1.6 储存设备形成层次结构
1.7 操作系统管理硬件
    1.7.1 进程
    1.7.2 线程
    1.7.3 虚拟内存
    1.7.4 文件
1.8 系统之间利用网络通信
1.9 重要主题
    1.9.1 Amdahl 定律
    1.9.2 并发和并行
    1.9.3 计算机系统中抽象的重要性
1.10 小结
参考答案、练习题答案