一、位/字节&文件&存储
看一段简单的C程序:
#include <stdio.h> int main() { printf("Hello world! "); return 0; }
上面这个源程序在计算机内是一串由0/1数字组成的位序列
我们用ASCII码来表示该程序中的每个字符,如字符#对应的ASCII码为35,而字符i对应的ASCII码为105
我们用7位二进制数表示1个字符的ASCII码,则ASCII码的范围是0~127,为了与字节相符,所以我们用8位二进制数表示(D7=0)
于是上面那段C程序的ASCII文本表示为:
35 105 110 99 108 117 100 32 60 115 100 105 111 46 104 62 10 ...
于是回到上面那句话“源程序在计算机内是一串由0/1数字组成的位序列”,上面的ASCII文本又换成了下面的二进制序列:
00100011 01101001 ...
我们知道一个字节为8位,所以上面这个源程序我们也可以称为是以字节序列的方式存储在文件中的。
二、源程序到可执行文件
hello.c ====> hello
1. 预处理器
读取系统头文件stdio.h的内容,并把它直接插入到程序文本中
结果是另一个C程序,通常以.i作为文件扩展名
2. 编译器
将文本文件hello.i翻译成文本文件hello.s
3. 汇编器
将hello.s翻译成机器语言指令,并将这些指令打包成可重定位目标程序的格式,并将结果保存到目标文件hello.o中
4. 链接器
源程序中用到了标准C库的printf函数,故需要用链接器将目标文件printf.o合并到我们的hello.o程序中
结果是hello文件,它是一个可执行文件
三、进程&并发运行
并发运行:一个进程的指令和另一个进程的指令交错执行
通过CPU在进程间切换,使得一个CPU看上去都像是在并发地执行多个进程
无论单处理器还是多处理器,我们都可以说程序可以并发运行,区别仅仅是多处理器可以同时执行多个程序,而单处理器在一个时刻只可以执行一个程序;但是并发运行是指程序交错执行