重读CSAPP系列-第一章

本次重读CSAPP系列笔者将结合CSAPP英文原文和相应的代码实验lab对CSAPP作一次全面的梳理,即是为了完善本
人相应的知识体系,也能为计算机初学者提供一些入门的指南。本系列将延续CSAPP原文的目录结构,对每一章每
一小节的重要概念和理论作出相应的描述,并且会结合实践讲解相应的代码实验lab。
复制代码

Chapter 1 计算机系统之旅

首先从跟踪一个简单的hello程序的生命周期来探究计算机系统。相应的C语言代码如下图所示:
复制代码
    #include <stdio.h>
    
    int main()
    {
        printf("Hello, world\n");
        return 0;
    }
   //hello.c
复制代码

1.1 信息是比特(bits)+上下文(context)

hello程序的生命周期开始于上述的源代码hello.c。源程序文件的存放方式是字节序列,每个字节都代表了特定的
字符,例如整数值35表示字符#,整数值105表示字符i,整数值10表示换行符\n。像hello.c这种用ASCII码表示的
文件一般称为文本文件,而其他文件称为二进制文件。
hello.c文件说明了一个基本的思想:磁盘文件、内存数据、网络传输的数据等等一切计算机信息都是由比特构成,
不同数据类型的区别仅仅在于通过不同的上下文来解析这段数据(这段原文的表述是:The only thing that 
distinguishes different data objects is the context in which we view them).
复制代码

1.2 程序被其他程序转换成不同的形式

为了执行hello程序,我们必须把hello.c源程序转换成为相应的机器指令(machine-language instructions)表示
的可执行文件(executable object program),在Unix系统中,执行linux>gcc -o hello hello.c,转换流程如图
所示,主要包括了以下几个阶段:
1.预处理阶段:根据#标记符处理原来的程序。
2.编译阶段:将C语言编写的源代码转换为汇编代码。
3.汇编阶段:将汇编代码转换为机器码表示的重定位文件。
4.链接阶段:将第三方库和主程序链接成可执行文件。
复制代码

hello编译.jpg

1.3 理解编译系统如何工作是有好处的

1.优化程序性能
2.理解编译阶段的错误
3.避免安全漏洞
复制代码

1.4 处理器读取和解析内存中的指令

当在unix系统中执行linux> ./hello时,会在shell中打印出Hello,world。为了理解这一过程,首先必须知道系统的硬件
组织架构
复制代码

1.4.1 系统硬件组织架构

如图所示,主要包括了以下几个部分:
1.总线(Buses)
2.输入/输出设备(I/O Devices)
3.主内存(Main Memory)
4.处理器(Processor)
复制代码

硬件组织架构.jpg

1.4.2 运行hello程序

1.首先shell程序等待hello的输入,当输入./hello指令时,shell将字符串读取到寄存器上随后存储到
主内存中。
2.当按下回车的时候shell程序执行hello文件,hello文件的指令和数据从磁盘转移到内存中。
3.一旦转移完成后,CPU将执行相应的机器指令将Hello,world打印到屏幕上。
复制代码

1.5 缓存问题

从上面简单的例子中得到的一个教训是程序往往会将信息从一个地方复制到另外一个地方。通过局域性原理
(The idea behind caching is that a system can get the effect of both a very large memory
 and a very fast one by exploiting locality, the tendency for programs to access data and
 code in localized regions.)利用缓存往往可以大幅提高程序的运行效率。
 
复制代码

1.6 存储设备的层次结构

存储设备层次如图所示,越往上的存储设备速度越快,价格越昂贵。
 
复制代码

内存结构.jpg

1.7 操作系统管理硬件

 回到hello程序例子中,hello程序是不会直接操作CPU、内存和输入输出设备,这些设备由操作系统
 进行管理。可以把操作系统看成应用程序和硬件之间的一层程序。操作系统包括了进程,虚拟内存和
 文件等概念。
 
复制代码

操作系统.jpg

操作系统2.jpg

1.8 系统之间通过网络进行通信

系统之间通过网络进行通信.jpg

1.9 重要的主题

1.9.1 Amdahl's Law

Amdahl's Law主要思想是当我们加速系统的某一部分时,对整个系统的影响取决于加速的程度和该部分的重要性。
Tnew = (1-a)Told + (aTold)/k = Told[(1-a)+a/k];
S = 1(1-a)+a/k;
复制代码

1.9.2 并发和并行

1.9.2 抽象在计算机系统中的重要性

文件是对I/O设备的抽象,虚拟内存是对程序内存的抽象,进程是运行中程序的抽象。
复制代码

猜你喜欢

转载自juejin.im/post/7022646154605101092