笔记不能是对书本内容的简单搬运,应该加上自己的理解和梳理,为的是方便以后更好的查阅和复习。

《计算机系统:一种程序员的视角》一书经常在知乎上被人推荐,自己基础一直不好,希望能专心把这门书学习完。 但是过往看书,边看边忘,必须养成学习记录的习惯,才能查缺补漏,温故知新。

本书一个优点在于拥有配套的lab,http://csapp.cs.cmu.edu/3e/labs.html

这本书写给那些希望编写更好代码的程序员,专注介绍于计算机通用的概念。

本章借助hello world程序运行粗略讲解其中涉及计算机系统内容。

1.1 信息=比特+上下文

世界是充满信息的世界,信息无处不在,计算机本质是处理信息的工具,计算机中到处也涌动着信息。

信息是什么呢?

信息在计算机中最直观的表示,就是高低闪烁的电平信号,采用二进制表示01的位bit

八位组成一个字节byte,一个字节通过字符编码映射一个字符,hello world源码因此由一个个字节组成。

单纯的bit序列是没有意义的,计算机中的所有信息都通过比特bits表示,上下文context是区分信息的关键。上下文可能是指bit序列的用途。

1.2 源码到可执行文件

hello源码是遍于程序员理解的语言,它并不能直接被计算机执行。需要通过一系列步骤,转换为可执行目标文件executable object file

image.png
unix系统中,gcc complier driver负责执行这一转换步骤。
它包括了预处理器Preprocessor、编译器compiler、装配器assembler和链接器linker。

预处理器Preprocessor,执行预处理命令,执行替换文本、插入头文件等操作。
编译器compiler,将完整代码翻译成汇编语言。
装配器assembler,翻译成机器语言,成目标文件。
链接器linker,将调用的系统函数目标文件,和装配后的目标文件合并,形成可执行文件。

1.3 为什么了解编译系统

因为牛逼。

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

1.4 处理器执行指令

接下来,我们可以敲入命令,使计算机将会执行hello world,在显示器上输出hello world字样。

首先了解一些计算机的基础结构。

  • 总线
    • 总线被设计成传送定长的字节块,通常32位或者64位,称为字word
  • IO设备
    • 包括控制器和适配器,控制器是设备中的主板,设配器是插在电脑上的接口。
  • 主存(内存)
    • 动态随机存取存储器DRAM
  • 处理器
    • 核心是程序计数器PC,一个寄存器,指向内存中某条机器指令地址

执行hello world时,首先从键盘输入shell命令,回车按下后,将输入的命令字符串输入寄存器,然后再存入内存。

shell程序执行一系列指令,加载执行磁盘中的hello可行性文件。

1.5 高速缓存

高速缓冲是为了解决处理器高速和主存读取低速之间的矛盾。由静态随机访问储存器SRAM实现,分为L1、L2、L3不同级别。

1.6 层次存储结构

更大更慢更便宜,更小更快更贵。
image.png

1.7 操作系统管理硬件

所有应用程序都通过操作系统实现对硬件(IO设备、主存、处理器)的操作。

操作系统通过抽象,简化对硬件的管理。
文件是对IO设备的抽象,虚拟内存是对主存的抽象,进程是对处理器的抽象。

进程

进程process是操作系统对一个正在运行的程序的抽象。一个系统可以运行多个进程,每个进程都可以看做独占地使用硬件。
进程运行时所有的状态信息称为上下文context
操作系统内核kernel负责进程上下文间的切换,是操作系统代码常驻内存的部分。
进程中还可以有多种控制流,称为线程thread

虚拟内存

虚拟内存Virtual Memory使每个进程看到的内存空间都是一样的,仿佛独占地使用内存。
image.png
内存地址自底向上递增,从下往上介绍。

  • 程序和数据
    • 通过malooc和free分配变量空间
  • 共享库
    • C标准库和共享库
    • 函数调用
  • 内核虚拟内存

文件

磁盘、键盘、显示器、网络都可以看成文件。

1.8 网络通信

1.9 重要主题

Amdahl定律

局部性能提升和整体性能提升的关系
局部性能占整体性能的比例α,局部性能提升的幅度k,则加速比S
image.png

并发和并行

计算机系统希望更强,要么算的更多,要么算的更快
并发concurrency指系统同时具有多个活动。
并行parallelism指用并发使一个系统运行得更快。

以下从高到底介绍三个层面

  • 线程级并发
    • 多核
    • 超线程,一个处理器同时执行多个线程,比如单核双线程
  • 指令集并行
    • 现代处理器可以同时执行多条指令的属性
  • 单指令、多数据并行SIMD
    • 现代处理器通过某些特殊硬件,使一条指令产生可以并行执行的操作

抽象的重要性

虚拟机是对整个计算机的抽象。