开始看《深入理解计算机系统》(豆瓣)这本书,才看了一点,顿时感觉收获颇多,所以记录下读书笔记,方便以后复习。

计算机系统概论

文章以hello程序入手,介绍了计算机系统的概念。

1
2
3
4
5
#include <stdio.h>
int main()
{
printf("hello, world\n");
}

信息就是位 + 上下文

上文的hello.c源程序以字节序列的方式存储在文件中,下面展示hello.c的ASCII文本表示。

这里写图片描述

像hello.c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。

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

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

这里写图片描述

如上图所示,执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。

了解编译系统如何工作是大有益处的

  1. 优化程序性能
  2. 理解链接时出现的错误
  3. 避免安全漏洞

处理器读并解释存储在存储器中的指令

系统的硬件组成

这里写图片描述

运行hello程序

初始时,外壳程序执行它的指令,等待我们输入一个命令。当我们在键盘上输入字符串”./hello”后,外壳程序将字符逐一读入寄存器,再把它存放到存储器中。
这里写图片描述
当我们在键盘上敲回车键时,外壳程序就知道我们已经结束了命令行的输入。然后外壳程序执行一系列指令来加载可执行的hello文件,将hello目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串“hello, world\n”。
利用直接存储器存取(DMA)的技术,数据可以不用通过处理器而直接从磁盘到达主存。这个步骤如下图所示。
这里写图片描述
一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将”hello, world\n”字符串中的字节从主存复制到寄存器文件中,再从寄存器文件中复制到显示设备,最终显示在屏幕上。这个步骤如下图所示。
这里写图片描述

高速缓存至关重要

处理器与主存之间的差异,系统设计者采用了更小、更快的存储设备,即高速缓冲存储器,作为暂时的集结区域,用来存放处理器近期可能会需要的信息。
这里写图片描述

存储设备形成层次结构

这里写图片描述

操作系统管理硬件

这里写图片描述
这里写图片描述

系统之间利用网络通信

从一个单独的系统来看,网络可视为一个I/O设备,如下图所示。当系统从主存将一串字节复制到网络适配器时,数据流经过网络到达另一台机器,而不是其他地方,例如本地磁盘驱动器。相似地,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存。
这里写图片描述
这里写图片描述


参考资料:

  1. 《深入理解计算机系统》