计算机系统概述
- 计算机系统是由硬件和软件系统组成的
- 所有计算机系统都有相似的硬件和软件组件,它们执行者相似的功能
- 程序员需要了解这些组件是如何工作的,以及这些组件是如何影响程序正确性和性能的
1. 信息就是位+上下文
- 8位是1个字节,程序是以字节的方式存储在文件中(根据ASCII码)
- 系统中所有的信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的
- 区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文
2. 程序被其他程序翻译成不同的格式
- 一个程序是由高级语言程序开始的,这种形式能够被人们读懂
- 在系统上运行程序,需要运用其他程序将高级语言语句转化成一系列的低级机器语言指令
- 这种指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来
编译系统(以GCC为例)
- 预处理:预处理器读取头文件stdio.h的内容,并把它直接插入到程序文本中,生成.i文件
- 编译:编译器将高级语言程序翻译成汇编语言程序,生成.s文件;汇编语言每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令
- 汇编:汇编器嫁给你汇编程序翻译成机器语言指令,把这些指令打包成可重定位目标程序,生成二进制文件(.o文件)
- 链接:链接器将预编译好的函数文件(如printf.o)合并到当前的可重定位目标程序中,形成可执行目标文件(二进制)
3. 了解编译系统的益处
- 优化程序的性能:知道不同的语句如何编译,从而选择效率更高的方式
- 理解链接时出现的错误
- 避免安全漏洞:缓冲区溢出错误是造成大多数网络和Ineternet服务器上安全漏洞的主要原因(第三章:堆栈原理和缓冲区溢出错误)
4. 处理器读并解释存储在存储器中的指令
- 在shell中输入要执行文件的文件名,从而在Unix系统上运行可执行文件
- shell是一个命令行解释器,它在接收到非内置的外壳命令时,会将其假设成一个可执行文件名,并加载运行该程序
- 程序终止后,shell输出一个提示符,等待下一个输入的命令行
系统的硬件组成
- 总线:贯穿整个系统的一组电子管道,负责携带信息字节并负责在各个部件之间传递;通常被设计成传送定长的字节块(字长),现在大多数机器字长是4字节(32位)或者8字节(64位),总线每次只传输一个字
- I/O设备:系统与外部世界的联系通道,包括鼠标和键盘、显示器、磁盘驱动器(简称磁盘),I/O设备通过控制器或适配器与I/O总线相连;控制器或适配器的功能是在I/O总线和I/O设备之间传递信息
- 主存:一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。存储器时由一组**动态随机存取存储器(DRAM)**组成的;是一个线性的字节数组
- 处理器:*处理单元(CPU)是解释(或执行)存储在主存中指令的引擎;核心是PC(程序计数器),处理器从程序计数器(PC)只想的存储器中读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令
运行程序流程
5. 高速缓存至关重要
- 系统花费大量时间把信息从一个地方挪到另一个地方
- 系统设计者的一个主要目标就是使这些复制操作尽可能快地完成
- 寄存器存储空间小,读取速度快;主存存储空间大,读取速度慢
- 针对处理器与主存之间的差异,系统设计者采用高速缓存存储器,作为暂时集结的区域
- 高速缓存存储空间比寄存器大,访问速度几乎和访问寄存器文件一样快
- 高速缓存是用一种叫做**静态随机访问存储器(SRAM)**的硬件技术实现的
6. 存储设备的层次结构
- 存储器层次结构:从上至下,设备的访问速度越来越慢、容量越来越大、每字节的造价越来越便宜
7. 操作系统管理硬件
- 操作系统可以看作是应用程序和硬件之间插入的一层软件,所有的应用程序对硬件的操作都必须经过操作系统
操作系统的功能
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而大相径庭的低级硬件设备
- 操作系统提供了几个基本的抽象概念(进程、虚拟存储器、文件)
进程
- 进程是操作系统对一个正在运行的程序的一种抽象
- 每个进程都好像在独占地使用硬件
- 各个进程的指令交错执行,实现交错执行的机制是上下文切换
- 上下文:进程运行所需的所有状态信息
- 当操作系统决定把控制权从当前进程转移到某个新的进程时,就会进行上下文切换(保存当前进程的上下文、恢复新进程的上下文,将控制权传递到新进程)
线程
- 一个进程可以由多个称为线程的执行单元组成
- 每个线程都运行在进程的上下文中,共享同样的代码和全局数据
- 多线程之间比多进程之间更容易共享数据,线程一般比进程高效
- 当有多处理器可用时,多线程是可以使程序更快运行的方法
- 第十二章 并发的基本概念,如何写线程化的程序
虚拟存储器
- 是一种抽象概念,让每个进程以为自己在独占地使用主存
- 每个进程看到的一致的存储器,称为虚拟地址空间
- 程序代码和数据:代码和全局变量
- 堆:当调用malloc和free这样的C标准库函数时,堆可以在运行时动态地扩展和收缩
- 共享库:存放C标准库和数学库这样的共享库的代码和数据的区域
- 栈:存放局部变量,可以在程序执行期间动态地扩展和收缩(函数返回时,收缩)
- 内核虚拟存储器:是操作系统的一部分,不允许应用程序读写这个区域的内容或者调用内核代码定义的函数
文件
- 文件就是字节序列
- 每个I/O设备都可视为文件
8. 系统之间的网络通信
- 网络也是一种I/O设备(借助网络,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存)
- 网络传递信息:电子邮件、即时通信、万维网、FTP、telnet
通过网络传递信息的实例
9. 重要主题
并行与并发
- 线程级并发(线程之间交替)、指令级并行(多个指令同时完成)
计算机系统中抽象的重要性
- 程序员无需了解内部工作,便可以使用这些代码
- 越抽象,用起来越方便