(1)程序编译阶段
以hello world 程序为例,介绍计算机系统的基本组成结构和程序的编译过程。
#include <stdion.h> int main(){ printf("hello,world\n"); }
该程序的执行经历这样一个过程:
(2)系统的硬件组成
计算机的硬件组成可以分为如下几个部分:
(3)hello world程序执行过程
在unix系统的shell上执行下列指令:
unix〉./hello
在键盘上输入回车键后,shell将执行一系列指令,将hello目标文件中的代码和数据从磁盘拷贝至内存,完成加载过程。处理器开始hello程序的主程序中的机器语言指令。这些指令将数据从存储器中拷贝到寄存器文件,再从寄存器中拷贝到显示器上,最终显示在屏幕上。
(4)操作系统管理硬件
shell加载和运行hello程序时,程序并没有直接访问外设, 它依靠操作系统提供服务。
操作系统提供两个基本功能:防止硬件被失控的应用程序滥用;在控制复杂而通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法。操作系统通过几个抽象概念:进程、虚拟存储器和文件 来实现上述功能。
文件是对I/O设备的抽象,虚拟存储器是对主存和磁盘I/O设备的抽象,进程是对cpu、主存和I/O设备的抽象表示。
操作系统通过进程为客户提供一种该程序独占处理器、主存、I/O设备的假象。
1. 进程是操作系统对程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像独占使用硬件,这就是并发运行,也就是说一个进程的指令和另一个进程的指令是交错执行。操作系统实现这种交错执行的机制成为上下文切换。
操作系统保存进程运行所需的所有状态信息,即上下文,包括许多信息,,包括PC和寄存器文件到当前值。
2. 线程是一个进程的多个执行单元,每个线程都运行在进程的上下文中,共享同样的代码和全局数据。
3. 虚拟存储器为每个进程提供了一个假象:每个进程都在独占使用主存。每个进程看到的存储器都是一致的,称之为虚拟地址空间。
虚拟地址空间可以划分为以下几个部分:
程序代码和数据:可执行目标文件
堆:动态分配
共享库:存放c标准库和数学库的代码和数据的区域
栈:实现函数调用
内河虚拟存储器:内核是操作系统总是驻留在存储器的部分。
4. 文件
文件是字节序列,所有的I/O设备都可以看成文件。系统中所有的输入输出都是适用unix I/O的一小组系统函数调用读写文件实现。