计算机系统是由硬件和软件组成的,它们共同工作来运行应用程序。
源程序实际上就是一个由值0和1组成的位(bit)序列,8个位被组织成一组,成为字节。每个字节表示程序中某个文本字符。
大部分的现代系统都使用ASCII标准来表示文本字符,这种方式实际上就是一个唯一的单字节大小的整数值来表示每个字符。
系统中所有的信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的。区别不同数据对象的唯一方法是我们读到这些数据对象时的上下文。
编译系统(compilation syste)
- 预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。
- 编译阶段。编译器(ccl)将文本文件hello.i翻译成文本文件hello.s它包含一个汇编语言程序。
- 汇编阶段。接下来,汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式。并将结果保存在目标文件hello.o中。
- 链接阶段。请注意,hello程序调用了printf函数,它是每个C编译器都会提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中。连接器(ld)就负责处理这种合并。结果就得到hello文件,它是一个可执行目标文件,可以被加载到内存中,由系统执行。
系统的硬件组成
- 总线
贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节快,也就是字(word)。 - I/O设备
输入/输出设备是系统与外部世界的联系通道。 - 主存
主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器芯片(DRAM)组成的。从逻辑上说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(即数组索引),这些地址是从零开始的。 - 处理器
中央处理器简称处理器,是解释或者执行存储在主存中指令的引擎。
处理器的核心是一个字长的存储设备(或寄存器),成为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令。
利用直接存储器存取(DMA)的技术,数据可以不通过处理器而直接从磁盘到达主存。
操作系统有两个基本功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一直的机制来控制复杂而又通常大相径庭的低级硬件设备。
操作系统通过几个基本的抽象概念(进程、虚拟存储器和文件)来实现着两个功能。
进程是操作系统对一个正在运行的程序的一种抽象。
无论是在单核还是多核系统中,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换。
操作系统保持跟踪进程运行所需的所有状态信息。这种状态,也就是上下文。
在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程。新进程就会从上次停止的地方开始。
线程,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
多线程之间比多进程之间共容易共享数据,线程一般来说都比进程更高效。
虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间。
文件就是字节序列,仅此而已。
数字计算机的整个历史中,有两个需求是驱动进步的持续动力:一个是我们想要计算机做得更多,另一个是我们想要计算机运行的更快。当处理器同时能够做更多事情时,这两个因素都会改进。我们用得术语冰法(concurrency)是一个通用的概念,指一个同时具有多个活动的系统;而术语并行(parallelism)指的是用并发使一个系统运行得更快。
- 线程级并发
- 指令级并发
- 单指令、多数据并行
抽象的使用是计算机科学中最为重要的概念之一。
在学习操作系统时,我们介绍了三个抽象:
文件是对I/O的抽象,虚拟存储器是对程序存储器的抽象,而进程是对一个正在运行的程序的抽象。虚拟机提供了对整个计算机的抽象。
References:
深入理解计算机系统