深入理解计算机系统——计算机系统漫游

(1)程序编译阶段

以hello world 程序为例,介绍计算机系统的基本组成结构和程序的编译过程。

    

#include <stdion.h>

int main(){

      printf("hello,world\n");
               }

 该程序的执行经历这样一个过程:

  1. 源程序首先经预处理器处理:将#include中的内容插入到源程序中,得到另一个程序hello.i
  2. 编译阶段:hello.i程序经过编译,变成一个汇编程序hello.s
  3. 汇编阶段:hello.s文本程序经过汇编器汇编,变成二进制文件,这里的字节码编码是机器码,其文件为hello.o
  4. 链接器:hello.o程序要经过链接阶段才能将该程序调用的库函数并入进来,结果得到可执行文件hello。

(2)系统的硬件组成

计算机的硬件组成可以分为如下几个部分:

  1. 总线:贯穿整个系统的一组电子管到,它携带信息字节并负责在各个部件之间传递。总线传送的字节单位是字,是系统的基本参数,不同机器之间有差异。
  2. I/O设备:I/O设备是系统与外界的联系通道,每个外设都是通过控制器或适配器与I/O总线连接。控制器和适配器的区别在于控制器是I/O设备的组成部分,而适配器是插在主板上的。
  3. 主存:主存是一个临时的存储设备。当程序运行的时候,就将程序加载到主存中。逻辑上来说,存储器是一个线性的字节数组,每个字节都有自己唯一的地址,这些地址是从零开始的。
  4. 处理器:处理器是解释存储在主存中指令的引擎。处理器的核心是程序计数器。

(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的一小组系统函数调用读写文件实现。

猜你喜欢

转载自snowdancer2009.iteye.com/blog/765201