深入理解计算机系统(一)——计算机系统漫游

系统中的所有信息——包括磁盘文件、内存中的程序和用户数据以及网络中传输的数据,都是由一串比特表示的。

编译系统

编译系统由四部分组成:

  • 预处理器
  • 编译器
  • 汇编器
  • 连接器

系统的硬件组成

  1. 总线

    贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节快,也就是字(word)。字中的字节数(即字长)是一个基本的系统参数,各个系统中都不尽相同。

  2. I/O 设备

    I/O设备是系统与外部世界联系的通道。每个I/O设备都通过一个 控制器 或者 适配器 与I/O总线相连。区别主要在它们的封装方式。控制器是I/O设备本身或者主板上的芯片组。而适配器则是一块插在主板插槽上的卡。它们的功能都是 在I/O总线和I/O设备间传递信息

  3. 主存

    主存是一个临时的存储设备,在处理器执行程序时,用来 存放程序和程序处理的数据。也就是说,当一个程序在运行时,首先会将自身加载到内存中去。从 物理上来讲 ,主存是由一组动态随机存储器(DRAM)芯片组成的。从 逻辑上讲 ,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。

  4. 处理器

    中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
    从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。处理器从程序计数器指向的内存中读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令,这条指令并不一定和在内存中刚刚执行的指令相邻。他们围绕着 主存、寄存器文件(register file)和算数/逻辑单元(ALU)进行。 寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。ALU计算新的数据和地址值。下面是一些简单操作的例子,CPU在指令的要求下可能会执行这些操作。

    • 加载:主存 ——> 寄存器,覆盖寄存器原来的内容。
    • 存储:寄存器 ——> 主存,覆盖这个地址上原来的内容。
    • 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果放到一个寄存器中,覆盖该寄存器中原来的内容。
    • 跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖(PC)中原来的值。

高速缓存

系统花费了大量时间把信息从一个地方搬到另一个地方。

局部性原理:程序具有访问局部区域里的数据和代码的趋势。

意识到高速缓存存储器存在的应用程序员能够利用告诉缓存将程序的性能提高一个数量级。

在处理器和一个较大较慢的设备(例如主存)间插入一个更小更快的存储设备(例如高速缓存)的想法已经称为一个普遍的观念。

操作系统

操作系统可以被视作应用程序和底层硬件间的一层软件。所有应用程序对硬件的尝试都必须经过操作系统。

操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而通常又大不相同的低级硬件设备。操作系统通过几个基本的抽象概念( 进程、虚拟内存和文件 )来实现这两个功能。文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。

进程

进程是操作系统对一个正在运行的程序的一种抽象。

操作系统中进程交错执行的机制称为上下文切换。 上下文切换是指操作系统保存当前进程上下文(PC和寄存器文件的当前值,以及主存中的内容)、恢复新进程的上下文,然后将控制权传递给新进程,新进程就会从它上传停止的地方开始。

内核不是一个独立的进程,相反它是系统管理全部进程所用代码和数据结构的集合。

线程

一个进程实际上由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

虚拟内存

虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占的使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。

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

虚拟内存的运作需要硬件和操作系统之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。

文件

文件就是字节序列,仅此而已。每个I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件。系统中的所有输入输出都是通过使用一小组称为Unix I/O的系统函数调用读写文件来实现的。