第一章 计算机世界漫游
如何避免由计算机表示数字的方式引起的奇怪数字错误。优化自己的C代码,充分利用现代处理器和存储器系统的设计。如何实现过程调用,避免缓存溢出错误,如何识别和避免连接时的错误。编写UNIX shell,自己的动态存储分配包,WEB服务器。
1.1 信息就是位+上下文
系统内所有信息,文件,程序,数据,网络,都是一串比特,区分不同数据对象的唯一方法时我们读到这些数据对象时的上下文。在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
1.2 程序被其他程序翻译成不同的格式
每条C语言都被转换为一系列的低级机器语言指令。这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件。

1.预处理阶段: 会把代码里的头文件导入到代码中,生成新的文件 .i 的文件
2.编译阶段:编译器(ccl)把文件翻译成文件.s ,包含一个汇编语言程序。
3.汇编阶段:生成.o文件,是一个二进制文件。
4.链接阶段:程序调用printf函数,该函数在一个名为printf.o的单独预编译好了的目标文件中,连接器负责合并到hello.o程序中。结果就得到hello文件,一个可执行目标文件。
1.3 了解编系统如何工作时大有益出的
编译器时如何工作的。
1.优化程序性能。
2.理解连接时出现的错误。
3.避免安全漏洞。
1.4 处理器读并解释储存在内存中的指令
1.4.1 系统硬件组成
1.总线 总线被设计成传送定长的字节块,一个基本系统参数,大多时8个字节
2.I/O设备 输入和输出设备,通过控制器和适配器于I/O总线相连。控制器时I/O设备本身或者系统的主印制电路板上的芯片组。设配器是一块插在主板插槽上的卡。
3.主存 零时存储设备,用来存放程序和处理的数据。逻辑上存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引)
4. 处理器 解释或执行存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备,称为程序计数器。在任何时刻,都指向主存中的某条机器语言指令的地址。指令按照严格的顺序执行,包含一系列的步骤。处理器从程序计数器指向的内存处读取指令,解释指令中的位,执行该指令的简单操作,然后更行PC,指向下一条指令,而这条指令不一定和刚执行的指令相邻。寄存器文件时一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。ALU计算新的数据和地址值。
处理器指令架构和处理器微体系架构区分,指令集架构描述的时每条机器代码指令的效果;微体系结构描述的时处理器实际上如何实现的。
1.4.2 运行程序
shell程序执行指令,等待输入命令,输入命令后,shell程序将字符逐行读入寄存器,在放到内存中。敲击回车时,shell程序知道我们已经结束了命令的输入。然后shell执行一系列指令加载程序,这些指令将文件代码和数据从磁盘复制到主存。最后输出。文件中代码和数据加载到主存之后,处理器开始执行hello程序的main程序中的机器语言指令。从主存复制到寄存器文件,在从寄存器文件中复制到显示设备,最终显示到屏幕。
1.5 高速缓存
上面程序证明,复制时最大的开销,减慢了操作,系统设计者一个主要目标就是使这些复制操作尽量快的完成。系统设计者采用小而快的存储设备,告诉存储器,L1和L2高速缓存叫静态随机访问存储器。利用告诉缓存的局部性原理,即程序具有访问局部区域里的数据和代码的趋势。通过让高速存放经常访问的数据,大部分内存操作能在快速的告诉缓存中完成。
1.6 存储设备形成层次结构
每个计算机中的存储设备都被组织成一个储存器层次结构。
1.7 操作系统管理硬件
程序运行时,shell和Hello程序都没有直接访问键盘、显示器、磁盘或主存。它们依靠操作系统提供服务。可以把操作系统看作时应用程序和硬件之间插入的一层软件。操作系统的两个基本功能:1.防止硬件被失控的应用程序滥用;2.向应用程序提供简单一致的机制来控制复杂而又不同的低级硬件设备。
1.7.1 进程
进程是操作系统对一个正在运行的程序的一种抽象。每个进程都好像在独占使用硬件。并发运行是指一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换。
操作系统保持跟踪进程运行所需的所有状态信息。这种状态是上下文,包括许多信息,比如PC和寄存器文件的当前值,主存的内容。切换进程时,就会切换上下文,保存当前进程上下文,回复新进程上下文,然后将控制权传递到新进程。新进程就会从它上次停止的地方开始。从一个进程到另一个进程是由操作系统内核管理的。内核是操作系统代码常驻主存的部分。内核执行请求的操作并返回应用程序。内核不是一个独立的进程。它是系统管理全部进程所用代码和数据结构的集合。
1.7.2 线程
一个进程由多个线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
1.7.3 虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供一个假象,即每个进程都独占使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的告诉缓存。
1.7.4 文件
文件时字节的序列。
1.8 系统之间利用网络通信
网络也是I/O设备,系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器。
1.9 重要主图
系统是硬件和软件的集合体。
1.9.1 Amdahl定律
要想显著加速系统,必须提升全系统中相当大的部分的速度。性能提示比例 Told/Tnew,如果由所改进值大于1
1.9.2 并发和并行
并发指的是同时多个活动的系统,并行指的是用并发来使一个系统运行更快。
1.线程级并发 这种并发是模拟出来的,通过一台计算机快速切换进程实现的。超线程,有时称为同时多线程,时一个允许一个cpu执行多个控制流的计数。多处理器使用从两方面奇高系统性能。减少在执行多个任务时模拟并发的需要。并且可以让应用程序运行更快。要求这些程序是以多线程方式来书写的。
2. 指令级并行 比较低的抽象层,现代处理器可以同时执行多条指令是指令级并行。
3. 单指令,多数据并行 最低层次上,现代处理器用由特殊的硬件,允许一条指令产生多个并行执行的操作,这种方式是单指令,多数据,即SIMD并行。这个指令多是为了提高处理影像/声音和视频。
1.9.3 计算机系统中抽象的重要性
三个抽像,文件是对I/O设备的抽象,虚拟内存是对程序存储器的抽象,进程是对一个正在运行的程序的抽象。虚拟机提供对整个计算机的抽象。

浙公网安备 33010602011771号