计算机系统由硬件和系统软件组成。
1.1 信息就是位+上下文
源程序(源文件)是由0和1组成的位(又称比特)序列,八个位称为字节。
ASCII标准:唯一的单字节大小整数值表示每个字符。
只由ASCII字符构成的文件称为文本文件。
系统中的所有文件都是由一串比特表示的,区分不同数据对象的唯一方法是上下文。
1.2 程序被其他程序翻译成不同的格式
编译系统:预处理器 编译器 汇编器 链接器
预处理阶段:替换头文件,将.c变为.i文件
编译阶段:.c变为.s,变成汇编语言
汇编阶段:.s变为.o,变为机器语言指令
链接阶段:将调用的函数合并,变为可执行目标文件
1.3 了解编译系统如何工作是大有益处的
优化程序性能、理解链接时出现的错误、避免安全漏洞
1.4 处理器读并解释储存在内存中的指令
shell 命令行解释器,可以打开可执行目标文件
1.4.1 系统的硬件组成
总线:贯穿整个系统的一组电子管道,设计成传送定长的字节块,也就是字。大多数机器的字长为4字节32位或者8字节64位
I/O设备:系统与外部世界的联系通道。每个设备都通过控制器或适配器与I/O总线相连,控制器与适配器的区别主要在于封装方式。控制器是主板上的芯片组,适配器是插在主板插槽上的卡。
主存:临时存储设备,用来存放程序和程序处理的数据。是一个线性的字节数组,每个字节都有唯一的地址。
处理器:中央处理单元CPU,是解释或执行存储在主存中指令的引擎。核心是一个大小为一个字的存储设备或寄存器,称为程序计数器PC。在任何时刻,PC都指向主存中的某条机器语言指令。
1.4.2 运行hello程序
shell程序将字符读入寄存器,再放到内存中。
敲入回车后,shell执行一系列指令来加载可执行的hello文件,将代码和数据从磁盘复制到主存。
利用DMA技术,可以不通过处理器直接到主存。
加载到主存后,执行hello文件main函数里的机器语言指令,将字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。
1.5 高速缓存至关重要
系统花费大量时间把信息从一个地方挪到另一个地方,处理器从寄存器文件中读数据要比从主存中读取几乎要快100倍。
1.6 存储设备形成层次结构
在处理器和一个较大较慢的设备(主存)之间插入一个更小更快的存储设备(高速缓存)。
1.7 操作系统管理硬件
shell运行程序时依靠操作系统提供服务访问硬件。
操作系统基本功能 1、防止硬件被失控的应用程序滥用 2、向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
通过进程、虚拟内存和文件来实现。
1.7.1 进程
进程是操作系统对一个正在运行的程序的一种抽象。
并发运行指一个进程的指令和另一个进程的指令是交错执行的。
通过上下文切换来在进程间切换。
1.7.2 线程
一个进程可以由多个线程组成,每个线程都在进程的上下文中,并共享同样的代码和全局数据。
1.7.3 虚拟内存
让每个进程都认为是独占地使用主存。每个进程看到的内存一致,称为虚拟地址空间。
程序代码和数据:从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。
堆:代码和数据区后紧随着的是运行时堆。堆可以在运行时动态地扩展和收缩。
共享库:存放C标准库和数学库这样的共享库的代码和数据的区域。
栈:用来实现函数调用。调用时栈增长,返回时栈收缩。
内核虚拟内存:不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数,反而必须调用内核来执行。
1.7.4 文件
即字节序列
1.8 系统之间利用网络通信
网络可以视为一种IO设备。
1.9 重要主题
1.9.1 Amdahl定律
当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。
1.9.2 并发和并行
并发是一个同时具有多个活动的系统。并行指的是用并发来使一个系统运行得更快。
1.线程级并发。单处理器的并发执行只是模拟出来的。多核处理器将多个CPU集成到一个集成电路芯片上。
2.指令级并行。如今处理器每个时钟周期执行2-4条指令,因为同时执行100条左右指令。
3.单指令、多数据并行。一条指令产生多个可以并行执行的操作。
1.9.3 计算机系统中抽象的重要性
虚拟机提供对整个计算机的抽象。