#include <stdio.h>
int main()
{
printf("hello, world ");
return 0;
}
hello 程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创 建并保存的文本文件,文件名是hello.c。源程序实际上就是一个由值0和1组成的位(又称 为比特)序列,8 个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符,现代计算机系统都使用 ASCII 标准来表示文本字符,只由 ASCII 字符构成的文件称为文本文件,所有其他文件都称为二进制文件。hello.c的表示方法说明了一个基本思想:系统中所有的信息—— 包括磁盘文件、内 存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。
GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello的四个阶段,之后被放在磁盘上。
在Unix系统上运行该文件,需要将它的文件名输入到称为shell的应用程序中,shell将加载并运行hello程序,然后等待程序终止,当我们敲击回车键时,shell程序收到了终止命令。
系统的硬件组成
总线:贯穿整个系统的一组电子管道,负责携带信息字节在各个部件间传递。
I/O设备:系统与外部世界的联系通道,每个I/O设备都通过一个控制器或适配器与I/O总线相连,用于访问设备。
主寸:
主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从 物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储 器是一个线性的字节数组。
处理器:
中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理 器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。xCPU 在指令的要求下可能会执行加载,存储,操作,跳转等操作。
数据串“hello, World/n”开始时在磁盘上,然后被复制到主存,最后从主存上复制到显示设备,为了快速完成,应尽可能快地完成这些复制操作,同时,针对处理器和主存之间的差异,设计者采用了高速缓存储存器,存放处理器近期可能会需要的信息。其实这里 shell 加载和运行 hello 程序时,以及 hello 程序输
出自己的消息时,shell 和 hello 程序都没有 直接访问键盘、显示器、磁盘或者主存,而是依靠操作系统提供服务,操作系统有两个基本功能:(1)防止硬 件被失控的应用程序滥用;(2)向应用程序 提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。操作系统通基本的抽象概念(进程 、虚拟、内存和文件)来实现这两个功能。进程是操作系统对一个正在运行的程序的一种抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。一个 CPU 看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。操作系统保持跟踪进程运行所需的所有状态信息,就像读文章兼顾上下文,包括很多信息。假设两个并发的进程:shell 进程和 hello 进程。最开始,只有 shell 进程在运行,即等待命令行上的输人。当我们让它运行 hello 程序时,shell 通过调用一个专门的函数,即系统调用,来执行我们的请求,系统调用会将控制权传递给操作系统。操作系统保存 shell 进程的上下文,创建一个新的 hello 进程及其上下文,然后将控制权传给新的 hello 进程。hello 进程终止后,操作系统恢复 shell 进程的上下文,并将控制权传回给它,shell 进程会继续等待下一个命令行输人,俩个进程的转换由操作系统内核管理。在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。虚拟内存使每个进程都在独占地使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间,虚拟内存运作基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓。图所示的是 Linux 进程的虚拟地址空间。
同一个程序可以在使用不同磁盘技术的不同系统上运行是因为文件向应用程序提供了一个系统的视图,来看待系统中含有的各种I/O设备。