这个问题解释起来比较麻烦,建议你还是看看书吧。简单来说:Windows为每一个进程保留了4G的地址空间(因为32位的操作系统,32位最多能表示4G),注意,是保留了4G的空间地址,并不是4G的实际内存。打个比方说,某个城市要新建一个社区,于是,就为这个社区的每个街道起名字并且规划出来门牌号,这仅仅是规划出来了,但是,因为社区并没有建,所以一切门派地址仅仅是预留的。Windows为每个进程也是这样处理,他仅仅是为每个进程预留出来4G的地址空间而已(更形象点说,是4G的地址编号,并没有实际的物理地址与这4G的地址编号对应),预留好地址之后,Windows开始把进程对应的可执行文件,也就是exe采用文件映射的方式加载,于是,在这4G的地址空间中,有Exe文件那么大的地址空间被分配用来和exe的文件映射对应,也就是说,地址空间被用去了exe文件这么大,接着,windows就加载exe用到的dll,这时候,就有说道了,如果这个dll从来没有哪个进程加载过,那么系统就把这个dll加载进来,并把加载之后的内容同进程的4G地址空间对应上,如果这个dll已经被某个进程加载过,那么,系统仅仅是为这个dll在本进程中作下地址映射。注意我上面说的,实际上,windows至少要为每个进程维护一张表,那就是进程的虚拟地址空间和实际的物理内存地址之间的对照表,通过这张表,应用程序访问的内存地址都是虚拟地址空间中的地址,而系统通过这张表,找到应用程序虚拟地址对应的实际地址,并操作实际的物理地址。windows管理的dll,在整个操作系统的实际物理内存中就一份,但是却可以映射到多个进程的虚拟地址空间中。系统在处理dll时,dll中的可变部分,比如变量等,是每个进程一份,而dll中的不变部分,比如dll中的代码(也就是函数什么的)、常量等,所有进程共享,但是这些共享的东西,在每个进程的虚拟地址空间中,并不一定是同一个地址,比如dll中的某个常量,在A进程中,可能对应的虚拟地址是$007001b0,在B进程中对应的虚拟地址是$006054f0,但是,在操作系统的实际物理地址都是一个地址。不知道这么解释你是否能明白,如果不明白,那你还是看看书吧。Windows核心编程 中就有介绍