编译系统

计算机系统漫游_主存

计算机系统漫游_系统架构_02


预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。

编译阶段:编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。

该程序包含函数main的定义,如下:

计算机系统漫游_寄存器_03


汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把在线指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,包含的17个字节是函数main的指令编码。如果用文本编辑器打开会看到一堆乱码。

链接阶段:hello程序调用了printf函数,是每个C编译器都提供的标准C库中的一个函数。printf函数存在与一个名为printf.o的单独的预编译好的目标文件中,二这个文件必须以某种方式合并到我们的hello.o程序中。链接器(Id)就负责处理这种合并。结果就得到hello文件,说一个可执行目标文件(或者简称为可执行文件),可以被加载到内存中,由系统执行。

了解编译系统是如何工作的好处

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

系统的硬件组成

总线

贯穿整个系统的是一组电子管道,称作总线,它携带信息字节负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数(即字长)是一个基本的系统参数,各个系统中都不尽相同。现在大多数机器字长要么是4个字节(32位)要么是8个字节(64位)。

I/O设备

I/O(输入/输出)设备是系统与外部世界的联系通道。包括:作为用户输入的键盘和鼠标、作为用户输出的显示器、长期存储数据和程序的磁盘驱动器(磁盘)等

每个I/O设备都通过一个控制器或适配器与I/O总线相连。控制器和适配器之间的区别在于它们的封装方式。

控制器是I/O设备本身或系统的主板上的芯片组。

适配器是一块插在主板插槽上的卡

它们的功能都是在I/O总线和I/O设备之间传递信息

计算机系统漫游_c++_04


主存

主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。

从物理上:主存是一组动态随机存取存储器(DRAM)芯片组成

从逻辑上:存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),地址都是从零开始。

处理器

中央处理单元(CPU),简称处理器,是解释(执行)存储在主存中指令的引擎,处理器的核心是一个大小为一个字的存储设备(存储器),称为程序计数器(PC)。

在任何时刻,PC都指向主存送的某条机器语言指令(即含义该条指令的地址)

从系统通电开始到系统断电,处理器一直在不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。

处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集架构决定的。

这个模型中,指令按照严格的顺序执行,而执行一条指令包含执行一系列的步骤,处理器从程序计数器指向的内存处读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令,二这条指令并不是和内存中刚刚执行的指令相邻。

执行指令操作围绕着主存、存储器文件(register file)和算术/逻辑单元(ALU)进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。ALU计算新的数据和地址值。

CPU在指令的要求下可能会执行这些操作:

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

运行hello程序

开始时,shell程序执行它的指令,等待我们输入一个命令

当我们在键盘上输入字符串“./hello”后,shell程序将字符逐一读入寄存器,再把它存放到内存中

计算机系统漫游_运维_05


当我们在键盘上敲回车键时,shell程序就知道我们已经结束了命令的输入。

然后shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串“hello,world\n”。

利用直接存储器存取(DMA)数据可以不通过处理器而直接从磁盘达到主存

计算机系统漫游_寄存器_06


一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将“hello,world\n”字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上

计算机系统漫游_主存_07

高速缓存至关重要

针对处理器与主存之间的差异问题,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache memory,简称为cache或高速缓存)作为暂时的集结区域,存放处理器近期可能会需要的信息。

计算机系统漫游_c++_08

存储设备形成层次结构

计算机系统漫游_系统架构_09


存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。因此,存储器文件就是L1的高速缓存,L1是L2的高速缓存,L3是主存的高速缓存,而主存又是磁盘的高速缓存。

操作系统管理硬件

可以把操作系统看成是应用程序和硬件之间插入的一层软件

计算机系统漫游_系统架构_10


所有应用对硬件的操作尝试都必须通过操作系统

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

  1. 防止硬件被失控的应用程序滥用
  2. 向应用程序提供简单一致的进制来控制复杂而又通常大不相同的低级硬件设备

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

计算机系统漫游_运维_11


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

进程

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

在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。

而并发运行,是一个进程的指令和另一个进程的指令是交错执行的

在大多数系统中,需要运行的进程数是多与可以运行它们的CPU个数的

传统系统在一个时刻只能执行一个程序,而先进的多核处理器同时能够执行多个程序

无论是在单核还是多核系统中,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的进制称为上下文切换

操作系统保持跟踪进程运行所需的所有状态信息,这种状态也就是上下文,包括许多信息,比如PC和寄存器文件的当前值,以及主存的内容。

在任何一个时刻,单处理器系统都只能执行一个进程的代码。

当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程。新进程就会从它上次停止的地方开始。

计算机系统漫游_主存_12

线程

通常我们认为一个进程只有单一的控制流,但是在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

虚拟内存

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

计算机系统漫游_运维_13

文件

文件就是字节序列
文件这个简单而精致的概念是非常强大的,因为它向应用程序提供了一个统一的视图,来看待系统中可能含有的所有各式各样的I/O设备

系统之间利用网络通信

我们一直是把系统视为一个孤立的硬件和软件的集合体。实际上现代系统经常通过网络和其他系统连接到一起。从一个单独的系统来看,网络可视为一个I/O设备。当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,而不是到达本地磁盘驱动器。同样,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存

计算机系统漫游_寄存器_14


随着Interner这样的权网络的出现,从一台主机复制信息到另外一台主机已经成为计算机系统最重要的用途之一。

并发和并行

线程级并发

设计处理同时有多个程序执行的系统,这就导致了并发。

传统意义上,这种并发执行只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换来实现的。这种并发形式允许多个用户同时与系统交互。

还允许一个用户同时从事多个任务

在以前,即使处理器必须在多个任务间切换,大多数实际的计算也都是由一个处理器来完成的,这种配置称为单处理器系统。

当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统。

计算机系统漫游_c++_15


多核处理器是将多个CPU(称为“核”)集成到一个集成电路芯片上。

计算机系统漫游_运维_16


上图是一个经典多核处理器的组成结构,微处理器芯片有 4个CPU核,每个核都有自己的L1和L2高速缓存,其中的L1高速缓存分为两个部分–一个保存最近取到的指令,一个存放数据

这些核共享更高层次的高速缓存,以及到主存的接口。

超线程:有时称为同时多线程(simultaneus multi-threading),是一项允许一个CPU执行多个控制流的技术。

超线程的处理器可以在单个周期的基础上决定要执行哪一个线程。使得CPU能够更好地利用它的处理资源。

如:假设一个线程必须等到某些数据被装载到高速缓存中,那CPU就可以继续去执行另一个线程。

比如:i7处理器可以让每个核执行两个线程,所以一个4核的系统实际上可以并行地执行8个线程

指令级并发

在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。

单指令、多数据并行

在最底层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作。这种方式称为单指令、多数据,即SIMD并行

计算机系统中抽象的重要性

抽象的使用是计算机科学中最为重要的概念之一。

如:为一组函数规定一个简单的应用程序接口(API)就是一个很好的编程习惯,程序员无须了解它内部的工作便可以使用这些代码。

计算机系统漫游_寄存器_17


操作系统中文件是对I\O设备的抽象,虚拟内存是对程序存储器的抽象,而进程是对一个正在运行的程序的抽象。

虚拟机提供对整个计算机的抽象,包括操作系统、处理器和程序。