系统中的所有信息——包括磁盘文件、程序、用户数据以及网络中传输的数据,都是由一串位表示的,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应用程序在远程主机上执行:
- 用户在本地键盘输入”./helloworld”
- 客户端将执行命令发送至远程主机
- 远程服务器运行程序
- 远程服务器向本地发送字符串”hello,world\n”
- 本地显示器显示
并发和并行
并发
是一个通用的概念,指系统同时具有多个活动。并行
是指使用并发使一个系统运行的更快。
线程级并发
单核处理器
中进程之间的切换就形成了并发,而使用线程,我们可以在一个进程中执行多条控制流,这是一种模拟出来的并发。
当构建一个由单操作系统内核控制的多处理器组成的系统时,就得到一个多处理器系统
,多核处理器将多个cpu集成到一个芯片上,他们都分别有各自的L1,L2缓存,共享更高级别的缓存以及主存接口。
超线程
即同时多线程,是一种允许一个CPU执行多个控制流的技术,可以更好的利用硬件资源。如I7处理器能够使一个核执行两个线程,4个核可以执行8个线程。
指令级并行
现代处理器可以同时执行多条指令的属性成为指令级并行
。流水线
将一条指令的活动划分为不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤,它们之间是并行的。
单指令、多数据并行
特殊的硬件可以允许一条指令产生多个可以并行的操作,这种方式成为单指令、多数据
,即SIMD并行。
总结
综上,我们要运行的一段程序,首先要被其他程序从ASCII文本翻译成计算机能够识别的二进制可执行文件。
执行进程时,处理器把大量的时间浪费在数据的复制上,所以就产生了高速缓存等部件。
并发和并行使得计算机的处理速度、硬件利用率等得以提高。