深入理解计算机系统之计算机系统漫游by zhanyr

系统中的所有信息——包括磁盘文件、程序、用户数据以及网络中传输的数据,都是由一串位表示的,8个位为一个字节。

从helloworld.c说起

#include<stdio.h>
int main(){
	printf("hello,world\n");
}

helloworld.c在计算机中的存储:

该文件以字节序列的方式存储在文件中,每个字符占一个字节,每个字节对应一个整数值:如#的对应的整数值是35。

helloworld.c的执行过程:

从源文件到到可执行的目标文件需要经历以下四个阶段:

  • 预处理阶段:根据代码,读取系统中头文件stdio.h的内容,把它直接插入程序文本中,以.i作扩展名;
  • 编译阶段:转化成汇编语言,汇编语言以一种标准的文本格式描述低级机器语言,以.s为扩展名;
  • 汇编阶段:将上述汇编语言转化成机器语言,并打包成可重定位目标程序的格式,保存在.o文件中;
  • 链接阶段:将各目标文件合并,如hello.o&printf.o,得到可执行文件,加载到内存,由系统执行。

系统的硬件组成

为了了解运行helloworld程序时系统发生了什么,我们必须了解一个典型系统的硬件组织:

  • 总线:负责在各个部件间传递信息字节
  • I/O设备:是系统与外部的联系通道,如键盘、鼠标、显示器等,通过控制器或适配器与总线相连。
  • 主存:临时存储设备,处理器执行程序时,用来存放程序和程序处理的数据。
  • 处理器:CPU,是解释主存中指令的引擎,核心是一个寄存器,成为程序计数器(PC),在任何时刻,PC都指向主存中的某条机器指令。

高速缓存

系统花费了大量的时间把信息从一个地方挪到另外一个地方,针对处理器与主存之间信息复制带来的问题,系统设计者设计了一种更小更快的存储设备高速缓存,用来存在处理器近期可能会需要的信息。处于寄存器和主存之间,又分为一级缓存、二级缓存甚至三级缓存。

操作系统

操作系统是应用程序与硬件之间插入的一层软件,所有应用程序对硬件的操作必须通过操作系统。操作系统有两个基本功能:

  • 防止硬件被失控的应用程序滥用
  • 向应用程序提供简单一致的机制来控制复杂的的低级硬件设备

操作系统使用几个基本的抽象概念来实现上述功能:进程虚拟存储器文件。其中,文件是对I/O设备的抽象,虚拟存储器是对主存和磁盘的抽象,进程是对处理器、主存和I/O设备的抽象。后面还有虚拟机是对整个计算机(包括操作系统、处理器和程序等)的抽象。

进程:

进程是操作系统对一个正在运行的程序的抽象,一个系统中可以同时运行多个进程,每个进程好像在独占的使用硬件。这是基于一种并发运行的概念,即各进程指令交错执行,这种机制称为上下文切换(保存当前上下文,恢复新进程的上下文)。

线程:

一个进程不止有一个单一的控制流,它可以由多个称为线程的执行单元组成,这些线程共享同样的代码和全局变量。

虚拟存储器:

为每个进程提供一个假象:好像每个进程都在独占的使用主存,每个进程看到的是一个一致的存储器,称为虚拟地址空间。从底到上分别为: * 程序代码和数据区:程序开始运行时便确定了大小 * 堆区:可以动态的扩展和收缩,如malloc,free函数的使用 * 共享库:C标准库等 * 栈:实现函数的调用,也可以动态的扩展和收缩 * 内核虚拟存储器:为内核保留,贮存在内存中

文件:

操作系统中的文件就是字节序列,每个I/O设备都视为文件,它向应用程序提供一个统一的视角,看待各式各样的I/O设备。

系统之间利用网络通信

网络可以视为一个I/O设备,当系统从主存将一串字节复制到网络适配器时,数据流经过网络到达另一台机器,相应的,系统也可以通过网络读取另一台机器的数据复制到自己的主存。

如之前的helloworld程序,我们可以使用telnet应用程序在远程主机上执行:

  1. 用户在本地键盘输入”./helloworld”
  2. 客户端将执行命令发送至远程主机
  3. 远程服务器运行程序
  4. 远程服务器向本地发送字符串”hello,world\n”
  5. 本地显示器显示

并发和并行

并发是一个通用的概念,指系统同时具有多个活动。并行是指使用并发使一个系统运行的更快。

线程级并发

单核处理器中进程之间的切换就形成了并发,而使用线程,我们可以在一个进程中执行多条控制流,这是一种模拟出来的并发。

当构建一个由单操作系统内核控制的多处理器组成的系统时,就得到一个多处理器系统,多核处理器将多个cpu集成到一个芯片上,他们都分别有各自的L1,L2缓存,共享更高级别的缓存以及主存接口。

超线程即同时多线程,是一种允许一个CPU执行多个控制流的技术,可以更好的利用硬件资源。如I7处理器能够使一个核执行两个线程,4个核可以执行8个线程。

指令级并行

现代处理器可以同时执行多条指令的属性成为指令级并行流水线将一条指令的活动划分为不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤,它们之间是并行的。

单指令、多数据并行

特殊的硬件可以允许一条指令产生多个可以并行的操作,这种方式成为单指令、多数据,即SIMD并行。

总结

综上,我们要运行的一段程序,首先要被其他程序从ASCII文本翻译成计算机能够识别的二进制可执行文件。

执行进程时,处理器把大量的时间浪费在数据的复制上,所以就产生了高速缓存等部件。

并发和并行使得计算机的处理速度、硬件利用率等得以提高。

Published 10 July 2015