此博客较适合初学者(已学过)浏览。
此系列主要C语言中的冷门知识点或强调易错易混淆的内容。难免会有纰漏,会不断改进。
1972年,贝尔实验室的丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Thompson)在开发UNIX操作系统是设计了C语言,是里奇在B语言的基础上进行设计的。
一个C程序的执行过程:
C实现通过编译和链接完成源代码文件到可执行文件的转换。
一个C程序在被运行前经过预编译、编译、汇编、链接四步骤:
1.预编译:这里我们只需要知道有一个叫预处理器(也称预编译器)的程序会对c程序进行一些预处理工作。比如对一些宏定义的变量进行替换。
2.编译: 编译器把C语言程序翻译成汇编语言程序,一条c语句通常需要好几条汇编代码来取代,C编译器为了提高程序执行的效率有时候会对程序进行优化。
3.汇编: 编译得到的汇编语言通过汇编器再汇编成可重定位目标程序hello.o,与之相反的一个过程被称为反汇编。
4.链接: hello.o不能被系统直接运行,而且通常情况下.o有很多个,程序中还要包含一些共享目标文件,比如hello程序中的printf函数,它位于静态库中,需要用链接器进行链接。
*可执行程序在被CPU执行前存在内存(相对)中
*现代操作系统采取了一种叫虚拟存储器的机制来有效地管理存储器,即把系统的存储设备全部隐藏在背后,无论实际的物理存储器有多大都提供给我们一个固定虚拟的线性空间。
*虚拟存储器主要有以下几个重要组成部分:
①进程控制块:保存了进程hello运行时的存储器图像和寄存器信息,它帮助操作系统在内存中找到hello程序。
②栈和堆:堆用来让程序员手动分配和释放内存空间,若未释放则由垃圾收集器gc代劳。程序中的自动变量都位于栈上,程序的返回地址也通常保存在栈上。
③文本段和数据段:对应的就是程序的代码部分和全局变量,将程序的代码和数据分开处理是有好处的。
④共享库的映射区域:操作系统通过将共享的对象映射到虚拟存储器的“共享区域”来使得代码能够共享,一方面提高存储器的利用率,一方面可以使得进程能够共享一些数据。
ps:部分内容引自《C Primer Plus》