第一章 计算机系统漫游
程序以字节序列存储在文件,每个字节有一个整数值,对应某个字符。
文本文件:由ASCII字符构成。 二进制文件:其他非ASCII字符构成文件。
区别不同数据对象的唯一方法是我们读到这些数据对象的上下文。
数字的机器表示方式是真值的有限近似值。
C语句被编译器程序转化为低级机器语言指令,然后把这些指令按照可执行目标程序的格式打包,然后以二进制存放。
预处理器——编译器——汇编器——链接器
预处理阶段:修改程序内容,插入程序文本。
编译阶段:把文本文件翻译成另一个文本文件,包含一个汇编语言。
汇编阶段:把汇编语言翻译成机器语言指令。
链接阶段:将单独的预编译目标文件合并到程序,加载到内存,系统执行。
了解编译的好处:
优化程序性能
理解链接时的错误
避免安全漏洞
系统硬件组成:
1 总线:一组电子管道,携带信息字节并负责传递。
2 I/O设备:系统与外部连接的通道。
3 主存:临时存储设备,由动态随机存取存储器(DRAM)组成。
4 处理器:执行指令的引擎,核心是寄存器称为程序计数器(PC)。PC指向主存中某条机器语言指令。
CPU在指令可能执行操作:
加载、 存储、操作、跳转
输入命令后,shell程序将字符逐一读入寄存器,再把它放到内存中。
回车键后,将代码数据从磁盘复制到主存。
一旦代码被加载到主存,处理器开始执行main程序的机器指令,这些指令将“hello,world\n”从主存复制到寄存器文件,再从寄存器复制到显示设备。
较大的存储设备要比较小的存储设备运行的慢,磁盘驱动器往往比主存大数倍。
针对以上,设计了高速缓存存储器,暂时存放处理器可能需要的信息。
原理是利用了高速缓存的局部性原理,即程序通常访问局部区域的数据和代码。
存储设备层次结构
思想是上一层的存储器作为低一层的高速缓存。
操作系统管理硬件:
程序没有直接访问键盘、显示器、主存而是依靠操作系统提供服务。操作系统是硬件和应用程序之间插入的一层软件。
1 防止硬件被失控的应用程序滥用
2 向应用程序提供简单一致的机制来控制复杂而不同的低级硬件设备。
通过进程、虚拟内存、文件来实现以上两个功能。
进程是程序运行的抽象概念,每个进程好像在独占使用硬件。一个CPU看上去并发执行多个进程,是通过处理器在进程间切换实现的,叫做上下文切换。
一个进程由多个线程执行单元组成,多线程比多进程更加容易共享数据。
虚拟内存为每个进程提供假象,每个进程都独占主存,每个进程看到的内存都是一致的称为虚拟地址空间。
程序代码和数据:直接按照可执行目标文件的内容初始化。
堆:运行时可动态扩展收缩和代码数据不同。
共享库:存放像C标准库和标准库这样的代码数据的区域。
栈:位于用户虚拟空间顶部的是用户栈,编译器用它来实现函数调用和堆一样动态扩展收缩。
内核虚拟内存:地址空间顶部区域为内核保留,不允许应用程序读写这个区域的内容或者直接调用内核代码定义函数。必须调用内核来执行操作。
文件:字节序列
系统之间利用网络通信:网络视为一个I/O设备。当系统从主存复制一串字节到网络适配器时,数据流经过网络适配器到另一台机器,而不是到达本地磁盘驱动器。
Amdahl定律:堆系统某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。
并发:同时具有多个活动的系统 并行:用并发来使一个系统运行得更快。
线程并发
指令并行
单指令、多数据并行
抽象的重要性:
规定API
机器代码程序表现得像运行在一个一次执行一条指令的处理器上,然而底层硬件远比抽象描述的复杂精细,它并行的执行多条指令。