深入理解计算机系统CH-01

深入理解计算机系统CH-1

源程序

源程序实际上由0和1组成的位(又称比特序列)序列,这些位被组织成8个一组,称为字节。每个字节都表示程序中某个文本字符。大部分现代系统都使用ASCII标准来表示文本字符。

基本思想:系统中所有的信息————包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

编译系统

执行四个阶段的程序(预处理器,编译器,汇编器和连接器)一起构成了编译系统

  • 预处理阶段:预处理器(cpp)根据以字符#开头的命令修改原始c程序。如#include 即告知预处理器读取系统头文件stdio.h内容,将其插入程序文本,得到一个.i程序
  • 编译阶段:编译器(ccl)将文本文件.i翻译成汇编程序文本文件.s,包含一个汇编语言程序
  • 汇编阶段:汇编器(as)将.s文件翻译成机器语言指令,把这些指令打包成为一种叫做可重定位(relocatable)目标程序的格式,并将结果保存在目标文件.o(二进制文件)中。
  • 链接阶段:链接器(ld)负责处理库中的函数以某种方式并入.o程序中,结果得到一个可执行目标文件。可执行文件加载到存储器,由系统负责执行。

编译系统益处

  • 优化程序性能
  • 理解链接时出现的错误
  • 避免安全漏洞

系统硬件组成

  • 总线:贯穿整个系统的一组电子管道,携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字(word)。
  • I/O设备:系统与外界的联系通道,例如USB控制器,图形适配器,硬盘控制器等。每个I/O设备都是通过一个控制器或适配器与I/O总现连接起来的。
  • 主存:主存是一个临时存储设备,在处理器执行程序时,它被用来存放程序和程序处理的数据。物理上来说,是由一组DRAM(动态随机存储器)芯片组成。逻辑上来说,存储器是由一个线性的字节数组组成的,每个字节都有唯一的地址(数组索引),这些地址是从零开始的。
  • 处理器:中央处理单元(CPU)简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个被称为程序计数器(PC)的字节大小的存储设备(或寄存器)。在任何一个时间点上,PC都指向主存中的某条机器语言指令(内含其地址)。

执行hello程序过程

  • 在键盘中输入./hello后,shell逐一读取字符至寄存器。
  • 按回车后,结束命令输入,将hello目标文件中的代码与数据拷至主存,加载hello文件。数据包括输出字符串。
  • 加载完毕后,处理器执行主程序中的机器语言指令。这些指令将字符串中的字节从存储器中拷贝到寄存器文件,再从寄存器中文件拷贝到显示设备。

高速缓存

针对处理器与主存存放字节数,读写速度以及运行速度的差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache memories,简称高速缓存)

存储设备的层次结构

实际上,每个计算机系统中的存储设备都被组织成一个存储器层次模型。其主要思想是一个层次上的存储器作为下一层次上的存储器的高速缓存。利用对整个存储器层次模型的理解,可以提高程序的性能

操作系统管理硬件

操作系统有两个基本功能:

  • 防止硬件被失控的应用程序滥用
  • 在控制复杂而又广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法。

操作系统通过几个基本的抽象概念(进程、虚拟存储器和文件)实现这两个功能。

其中文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。

进程

操作系统运行程序的一种抽象。一个系统上可以同时运行多个进程,称之为并发运行。

实际上进程指令是交错执行的。操作系统实现交错执行的机制称为上下文切换(context switching)。

操作系统保存进程运行所需的所有状态信息,这种状态称之为上下文(context)。当操作系统决定从当前进程转移控制权到某个新进程时候,就会发生上下文切换。

线程

一个进程可以由多个称为线程的执行单位组成,每个线程都运行进程的上下文中,并共享同样的模型和全局数据。

虚拟存储器

虚拟存储器是一个抽象概念。每个进程看到的存储器是一致的,称为虚拟地址空间

每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。

  • 程序代码和数据:由可执行文件目标直接初始化。
  • 堆:堆可以在运行时候动态的扩展和收缩
  • 共享库:存放共享库和数据的区域
  • 栈:位于用户虚拟空间地址顶部,编译器用它来实现函数调用
  • 内核虚拟存储器:内核是操作系统总是驻留在存储器中的部分
文件

文件即是字节序列。