1.一个程序从写出到运行经历了什么?
在IDE上编程的时候,程序写出到运行的过程被隐藏了,于是今天我跟着一个程序经历了它生命的历程。
一个简单的程序 hello.c
//hello.c
#include<stdio.h> int main() { printf("hello my fang ");
return 0;
}
首先我们在编辑器里创建并保存了一个文件,这个文件是源文件,hello.c。源文件里的每一个字符在系统中是用ASCⅡ码来表示,而每一个字符都是用字节来存储的(事实上计算机里所有的文件,数据等全都是用位来表示和存储的,八位代表一个字节)。hello.c源文件在预处理器的作用下处理成hello.i的文件(程序中预处理语句会告诉预处理器),hello.i在编译器的作用下翻译为hello.s的汇编程序,然后在汇编器的作用下,把程序翻译为机器语言指令打包在二进制文件hello.o中。程序中的printf函数存在一个已经单独预编译好了的文件printf.o,在链接器的作用下与hello.o文件合并在一起得到hello文件,而这个hello文件就是以二进制保存的可执行的目标程序,系统把它加载到内存中,然后执行。
一个典型的系统硬件的组成包括CPU(中央处理器,总线,I/O,主存(一个临时的存储器,在处理器处理程序时,存放程序信息和数据的地方)。
hello文件生成后被存在磁盘(I/O设备)中,然后在命令下,hello文件被送入主存,处理器这时候开始处理程序(从程序的入口main()开始),此时文件会被送入处理器里的寄存器中处理,处理完毕后把结果送到显示器上,于是在显示器上便出现了hello my fang。至此这个程序寿终正寝。
2.关于操作系统的一些基本概念
所有程序对硬件的操作都必须经过操作系统,操作系统有两个基本的功能:1.防止硬件被失控的程序滥用 2.向应用程序提供简单一致的机制来控制复杂而又不同的硬件设备。操作系统通过以下几个抽象来实现这两个功能。
1.进程
进程是操作系统对一个正在运行的程序的抽象,操作系统可以同时运行多个进程,但每个进程表现为独自使用硬件。一个进程与另一个进程交错执行叫做并发运行,也就是说在一个时段内多个进程在运行,但在某个时刻,只有一个进程在运行,但宏观上这几个进程都有进度,是因为系统同过上下文(一个进程运行的所有状态叫上下文)切换来并发的执行多个进程。
2.线程
每个进程是由一个或多个进程组成。可以简单的理解为进程是一个大项目,而线程是项目组的工作人员。多线程比多进程更容易共享数据(更高效)。
3.虚拟存储器
因为每一个进程在宏观上表现为单独运行,所以想象每一个进程在运行时单独占了一个主存。虚拟存储器是对程序存储器的抽象。
4.文件
文件就是字节的序列。所以每个I/O设备甚至网络都可以看作文件。文件是对I/O设备的抽象。
此外两个术语。并发:一个同时具有多个进程的系统 并行:使用并发使一个系统运行更快