如果你全力投身学习本书中的概念,完全理解底层计算机系统以及它对应用程序的影响,那么你会步入上成为为数不多的“大牛”的道路。
一、信息=位+上下文
<1>hello.c 这样只由 ASCII 字符构成的文件称为文本文件,其他的所有文件都称为二进制文件
<2>系统中所有的信息-包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
二、程序被其他程序翻译成不同的格式
hello.c文本文件会经过四个阶段的程序(预处理器、编译器、汇编器、链接器)生成一个目标程序(也叫可执行目标程序)
三、处理器读并解释存储在内存中的指令
CPU 在指令的要求下,可能会执行的操作。(一些简单操作的例子)
- **加载:**从主存复制一个字节或者多个字节到寄存器,以覆盖寄存器原来的内容。
- **存储:**从寄存器复制一个字节或者字到主存的某个位置,以覆盖这个位置上原来的内容。
- **操作:**把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器原来的内容。
- **跳转:**从指令本身中抽取一个字,并将这个字复制到寄存器(PC)中,以覆盖PC中原来的值。
四、存储设备层级结构
五、操作系统管理硬件
操作系统有两个基本功能:
- 防止硬件被失控的应用程序滥用。
- 向应用程序提供简单一致的机制来控制复杂而又大不相同的低级硬件设备。
操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。
1、进程
进程是操作系统对一个正在运行的程序的一种抽象。
从一个进程到另外一个进程的转换是由操作系统内核来管理的。内核是操作系统代码常驻内存的部分。当应用程序需要执行操作系统的某些操作时,比如读写文件,它就执行一条特殊的系统调用(System call)指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。
注意:内核不是一个独立的进程。相反,它是系统管理全部进程所有代码和数据结构的集合。
2、线程
每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程比多进程之间更容易共享数据,也更高效。
3、虚拟内存
- **程序代码和数据。**全局变量是存放在读/写代码数据区域。
- **堆。**可以动态扩展的数组之类的数据结构肯定放在这个区域的。
- 共享库。**C标准库和数据库存放在这个区域。共享库的概念非常强大,也相当难懂。
- **栈。**函数调用的时候,使用这块区域
- 内核虚拟内存。
4、文件
文件就是字节序列,仅此而已。每个I/O设备,包括磁盘、键盘、鼠标、显示器,甚至网络,都可以看成文件。系统中的所有输入输出都是使用一小组称为 Unix I/O 的系统函数调用读写文件来实现的。
文件这个抽象概念非常强大。例如:处理磁盘文件内容的程序员可以非常幸福,因为他们无需了解具体的不同的磁盘技术。
六、系统之间通过网络进行通信
我们一直把系统视为一个孤立的硬件和软件的集合体。实际上,现代系统经常通过网络和其他网络连接在一起,例如分布式系统。从一个单独的系统来看,网络可以视为I/O设备。系统可以从主存中复制一串数字到网络适配器。
七、重要主题
1、Amdahl 定律
当我们对系统的某部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。
2、并发和并行
1、并发是指两个进程或者两个线程交替执行。
2、并行是指在同一时刻(计算机同一时钟周期)内,2个进程或线程同时在执行。
3、计算机系统中抽象的重要性
文件是对I/O设备的抽象;虚拟内存是对程序存储器的抽象;而进程是对一个正在运行的程序的抽象,指令集架构是对处理器的抽象,底层的硬件远比抽象描述的要复杂精细。API接口是对函数的抽象;虚拟机是对整个计算机的抽象。