第一章 计算机系统漫游
1.1 信息就是位+上下文
源程序:由值为0和1组成的位(比特)序列
.c文件:以ASCII
字符组成的文本文件,以字节序列的方式储存在文件中,每个文本行以\n
结尾,对应数字10
字节:八个位被组成的一组称为字节
二进制文件:除了只由ASCII
码组成的文本文件,其他都是二进制文件,系统中的所有信息都是由一串比特表示
区分不同数据对象的唯一方法:数据对象的上下文
相关组织: ANSI
美国国家标准学会 ISO
国际标准化组织
1.2程序被其他程序翻译成不同的格式
二进制磁盘文件:机器语言指令按照可执行目标程序的格式打包好之后以二进制磁盘文件的形式存放
目标程序:也称为可执行目标文件,或可执行文件,可以被加载到内存中,由系统执行
编译器驱动程序:用于将源文件转化为目标文件
编译系统:预处理器 + 编译器 + 汇编器 + 链接器
将源程序转化为目标文件的四个阶段
阶段 | 工具 | 结果 | 扩展名 | 文件性质 |
---|---|---|---|---|
预处理阶段 | 预处理器 cpp | 根据以# 开头的命令进行预处理,读取系统头文件中的内容并且直接插入到程序文本中 | .i | 文本文件 |
编译阶段 | 编译器 ccl | 将.i 文件翻译成汇编语言程序 | .s | 文本文件 |
汇编阶段 | 汇编器 as | 将.s 文件翻译成机器语言指令,打包成可重定位目标程序格式 | .o | 二进制文件 |
链接阶段 | 连接器 ld | 将程序中调用的函数的单独编译好的.o 目标文件和汇编得到的.o 文件合并成可执行文件,存在磁盘 | \ | 二进制文件 |
GNU项目:完整的类Unix
系统,源代码能不受限制的被修改和传播,其环境包括EMACS
编辑器,GCC
编译器,GDB
调试器,汇编器,链接器,处理二进制文件的工具等
1.3了解编译系统是如何工作的是大有益处的
-
优化程序性能
-
理解链接时出现的错误
-
避免安全漏洞,比如限制从不受信任的源接收数据的数量和格式
1.4处理器读并解释储存在内存中的指令
shell
:命令行解释器
1.4.1系统的硬件组成
总线
作用:携带、传递定长的字节块
补充:字节块 = 字, 属性: 字节数 = 字长, 机器字长: 32位中字长为4字节,64位中字长为8字节
I/O设备
功能:通过控制器或适配器与I/O
总线相连,在I/O
主总线和I/O
设备之间传递信息
封装方式的区别:控制器是I/O设备本身或系统主印制电路板(即主板)上的芯片组,适配器是插在主板插槽上的卡
主存
作用:用来存放程序和程序处理的数据的临时存储设备
组成:由一组动态随机存取存储器(DRAM)芯片组成的线性的字节数组
处理器
别称:中央处理单元、CPU
、中央处理器
功能:解释或执行存储在主存中的指令的引擎,不断执行PC
指向的指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC
指向下一条指令(不一定相邻)
简单指令:围绕着主存、寄存器文件、算术/逻辑单元ALU
进行,例如:加载、存储、操作、跳转
寄存器文件:是一个小的存储设备,由一些单个字长的寄存器组成
PC
:区别于个人计算机,在计算机硬件中指程序计数器,大小为一个字的存储设备或寄存器,是处理器的核心,指向主存中的某条机器语言指令
ALU
:在计算机硬件中指算术/逻辑单元,用于计算新的数据和地址值
指令集架构:描述每条机器代码指令的效果
微体系结构:描述处理器实际上是如何实现
1.4.2运行程序
从磁盘加载可执行文件到主存:shell执行指令加载可执行文件,将目标文件中的代码和数据从磁盘复制到主存
直接存储器存取DMA
技术:可以不通过处理器直接从磁盘到主存
从磁盘读取hello
命令
从磁盘加载可执行文件到主存
将输出字符串从存储器写到显示器
1.5高速缓存至关重要
高速缓存
别称:高速缓存存储器、 cache
分类:L1
处理器芯片上、 L2
特殊总线连接到处理器、 L3
实现:静态随机访问存储器SRAM
的硬件技术
作用:存放可能经常访问的数据,大部分的内存操作都能快速在高速缓存中完成
优势:系统可以获得很大的存储器,同时访问速度也很快,利用了高速缓存的局部性原理
1.6存储设备形成层次结构
主要思想:上一层的存储器作为低一层存储器的高速缓存,了解不同的高速缓存和对整个存储器层次结构可以提高程序性能
1.7操作系统管理硬件
操作系统
功能
-
防止硬件被失控的应用程序滥用
-
向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备,所有应用程序对硬件的操作都必须通过操作系统
实现:通过进程、虚拟内存、文件实现
1.7.1进程
进程:操作系统对正在运行的程序的一种抽象
并发运行:一个进程的指令和另一个进程的指令是交错执行的
上下文:操作系统保持根据进程运行所需的所有状态信息,这种状态成为上下文
上下文切换:操作系统实现交错执行的机制,执行的是内核代码
单处理器系统:只能执行一个进程代码,系统绝对把控制权从当前进程转移到新进程就会上下文切换,控制权传递到新进程
内核kernel:从一个进程到另一个进程的转换是由操作系统内核管理的,内核时操作系统代码常驻主存的部分,不是一个独立的进程,而是系统管理全部进程所用代码和数据结构的集合。
系统调用:应用程序需要系统的某些操作时,执行系统调用将控制权传递给操作系统内核,内核执行被请求的操作并返回应用程序
1.7.2线程
线程:组成进程的执行单元,运行在进程的上下文中,每个线程共享同样的代码和全局数据
多线程的优点:容易共享数据,高效,运行的快
1.7.3虚拟内存
虚拟内存:是一个抽象概念,为每个进程提供了独占的使用主存的假象,其运作需要硬件和操作系统软件的交互
虚拟地址空间:每个进程看到的一致的内存
虚拟地址空间的区域(由低地址到高地址)
区域名称 | 内容 |
---|---|
程序代码和数据 | 代码从固定地址开始,接着是C全局变量对应的数据位置 |
堆 | 动态扩展和收缩 |
共享库 | 存放例如C标准库、数学库这样的共享库的代码和数据的区域 |
栈 | 用户虚拟地址空间顶部的是用户栈,用于实现函数调用,动态扩展和收缩,调用函数时栈增长,反之收缩 |
内核虚拟内存 | 地址空间顶部,不允许应用程序读写或直接调用内核代码定义的函数,必须调用内核来执行 |
基本思想:把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存
1.7.4文件
文件:是字节序列,向应用程序提供了一个统一的视图来看待各种I/O
设备。每个I/O
设备包括磁盘、键盘、显示器、网络都可以看成文件。系统所有输入输出都是通过称为Unix I/O
的系统函数调用读写文件来实现
1.8系统之间利用网络通信
网络:可视为I/O
设备,系统从主存复制字符串到网络适配器时经过网络到达另一台机器,系统可以读取从其他机器发送来的数据并且直接复制到主存而不用通过本地磁盘
1.9重要主题
计算机系统:是硬件和系统软件相互交织的集合体,它们要共同协作才能运行应用程序
1.9.1 Amdahl定律
公式:S=1/((1-a)+a/n)
解释:
S 加速比,结果表示的倍数用X表示,例如2.2X
a 系统某部分所需执行时间 / 系统执行某应用程序需要的时间
n 该部分性能提升比例
主要观点:要想显著加速整个系统,必须提示全系统中相当大的部分的速度
1.9.2并发和并行
并发:一个同时具有多个活动的系统
并行:用并发来使一个系统运行更快
由高到低的三个层次
-
线程级并发
-
多处理器系统:由单个操作系统内核控制的多个处理器组成的系统
-
多核处理器:将多个CPU(称为核)集成到一个集成电路芯片上
-
多核:多个处理器集成在一个芯片上,每个核都有自己的L1和L2高速缓存,L1高速缓存一部分保存最近取到的指令,另一部分保存数据。这些核共享更高层次的高速缓存以及到主存的接口
-
超线程:又称为同时多线程,允许一个CPU执行多个控制流的技术,区别于常规处理器需要20000个时钟周期做不同线程的转换,超线程的处理器在单个周期的基础上决定要执行哪个线程,更好的处理资源
-
多处理器:减少了执行多个任务是模拟并发的需要,使程序运行的更快。要求程序以多线程的方式来书写,可以并行地高效执行
-
-
指令级并行
-
指令级并行:较低的抽象层次上,现代处理器可以同时执行多条指令的属性
-
超标量处理器:处理器可以达到比一个周期一条指令更快的执行速率
-
-
单指令、多数据并行
-
SIMD并行:单指令、多数据,允许一条指令产生多个可以并行执行是操作
-
优点:提高处理影像、声音、视频数据应用是执行速度
-
1.9.3计算机系统中抽象的重要性
指令集架构:提供了对实际处理器硬件的抽象
虚拟机:提供对整个计算机的抽象