信息在程序中的表示
系统中的所有信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的。区分不同数据对象的唯一方法是我们读到这些数据对象的上下文。
编译系统
程序在系统上运行,需要先经过编译,转化为一系列的低级语言指令,这些指令并被以可执行文件的格式打包,以二进制磁盘文件的形式存放起来。整个编译系统由四部分组成:预处理器、编译器、汇编器和链接器。
以C语言程序为例解释这四个阶段:
- 预处理阶段:预处理器将源程序进行修改,根据源文件的命令读取对应系统文件的内容,将其插入到程序文本中,得到另一个被修改的源程序(文本文件);
- 编译阶段:经过编译器将修改后的源文件翻译成汇编语言程序(文本文件);
- 汇编阶段:汇编器将汇编程序翻译成机器语言指令,并将其按照格式打包成可重定位目标程序(二进制);
- 链接阶段:将外部的函数程序文件合并到我们的可重定位目标程序中,链接器完成合并并得到可执行目标文件(二进制)。
系统的硬件组成
一个计算机系统由以下四部分组成:
- 总线:信息的传输通道,传输定长的字节块(64位系统字长为8个字节);
- 输入/输出(I/O)设备:系统与外部世界的联系通道:键盘、鼠标、显示器、磁盘等;
- 主存:临时存储设备,由一组动态随机存取存储器(DRAM)芯片组成,用来存放处理器执行程序时的程序和程序处理的数据。
- 处理器:也叫中央处理单元(CPU),核心是寄存器(负责与其他单元的信息交换)。CPU主要执行下面四种操作:加载、存储、操作、跳转。
系统对程序的处理往往需要将文件从一个地方复制到另外一个地方,这种复制造成了大量的开销,减缓了程序真正的工作。而处理器从主存储器、磁盘中读取一个字的开销又严重大于寄存器,因此高速缓存(RAM)至关重要。
程序在系统上运行
进程与线程
进程:CPU通过上下文切换在一个处理器上病发地执行多个程序
线程:一个进程往往可以由多个线程组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据,使程序运行更高效。
虚拟存储器使每个进程看起来都在独占地使用内存,虚拟地址空间有不同的区构成(以下按照地址从低到高的顺序):
- 程序代码和数据:按照可执行目标文件的内容初始化,存储程序全局变量相对应的数据位置;
- 堆:可以在运行时动态地扩展和收缩;
- 共享库:存放类似C标准库和数学库这样的共享库的代码和数据的区域;
- 栈:实现函数调用,可以动态地扩展和收缩;
- 内核虚拟存储器:总是驻留在内存中,是操作系统的一部分,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。
并发与并行
并发是指一个同时具有多个活动的系统,并行指的是用并发使一个系统运行得更快。
常用方法:
- 分时:使一台计算机在他正在执行的进程间快速切换;
- 超线程并发:允许一个CPU执行多个控制流;
- 指令级并行:使处理器同时处理多个指令或者同时处理一个指令的多个阶段;
- 单指令、多数据并行:允许一个指令产生多个可以并行执行的操作。
一些抽象表示
文件:对I/O的抽象 虚拟存储器:对程序存储器的抽象 进程:对一个正在运行的程序的抽象 虚拟机:提供对整个计算机的抽象