DLL,Dynamic Link Library,动态链接库(文件)。
C++源代码到可执行程序的编译过程分为以下几步进行:
- 预处理。包括头文件包含指令(#include xxx)的执行、条件编译指令(#ifdef、#ifndef、#endif等)的执行、宏定义的替换等。
- 编译。进行词法分析和语法分析,生成汇编语言代码。
- 优化。中间代码的优化(删除公共表达式、循环优化、无用赋值的删除)等以及根据硬件平台的优化。
- 汇编。将汇编代码翻译成机器指令,生成目标文件。
- 链接。将有依赖的目标文件连接起来,形成能被操作系统装入执行的统一整体。包括静态链接和动态链接。
动态链接库中的全局变量(包括静态变量)在不同进程(不同的可执行程序)中是相互独立的。
内核在加载module的代码时:
- 以SHARED模式mmap(memory map)代码段,所有的application或进程共享同一代码段;
- 以PRIVATE模式mmap数据段,于是当application试图修改数据段时,就会在他自己的内存空间内生成一份拷贝,以后它对数据段的修改在这个拷贝上进行。
windows的做法是,该存放全局变量和静态变量的page,设定copy on write protect属性。当任一线程尝试修改这个page中的内容时,windows负责分配拷贝一个新的page出来,然后修改该线程的地址空间,将这个新分配出来的page的地址设置上去,从此之后,该线程访问、修改全局变量或静态变量,操作的即是这个新的page。这样,多个线程就不会出现全局变量或静态变量互相覆盖的问题了。