计算机系统漫游
一、程序的生命周期
1.1 将源程序hello.c从源程序文本到输出可执行文件的命令:gcc -o hello hello.c
该命令执行后,会执行以下四个阶段的程序,最终生成可执行文件。
- 预处理阶段:将以字符#开头的文本内容替换为源程序,宏替换;
- 编译阶段:将高级语言C语言文本文件hello.i翻译成低级语言汇编语言hello.s;
- 汇编阶段:将低级语言hello.s翻译成二进制机器语言,将hello.s打包成可重定位(relocatable)目标程序;
- 链接阶段:将重定位目标程序与C标准库中单独的预编译目标文件(printf.o)合并,生成一个可执行目标文件。可执行文件加载到存储器后,由系统负责执行。
旁注:Linux环境GNU(GNU’s not Unix)项目包括:EMACS编辑器、GCC编译器、GDB调试器、汇编器、链接器、处理二进制文件的工具以及其他一些部件。
1.2 运行可执行文件的命令:./hello
二、系统的硬件组成
- CPU:
- 总线:
- I/O设备:
- 内存:
- 磁盘:
三、操作系统
操作系统的作用:
- 为应用程序提供操作硬件设备简单一致的方法。
- 防止硬件被失控的应用程序滥用。
操作系统通过 进程、虚拟内存和文件实现上述两个功能。
3.1、进程与线程
进程 是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,每个进程都好像在独占的使用硬件(并发运行)。
操作系统保存进程运行所需的所有状态信息。这种状态信息包括PC和寄存器文件的当前值、主存内容,这中状态信息就是上下文,实际上一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为 上下文切换 。
在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。在网络服务器的编程模型中,线程一般都比进程更高效。
3.2、虚拟存储器
虚拟存储器为每个进程提供一个假象,即每个进程都在独占地使用内存。在Linux中,最上面的四分之一的地址空间是预留给系统中的代码和数据的,剩余的四分之三地址空间用来存放用户进程定义的代码和数据。
从最低的地址开始,逐步向上依次是:
- 只读代码段和数据:
- 读/写数据区:
- 堆:
- 共享库:
- 栈:
- 内核虚拟内存存储器:
3.3 文件
文件就是字节序列。每个I/O设备,包括磁盘、键盘、显示器,网络都可以看成是文件。