这是一个非常开放的问题,有许多不同术语的混淆用法。我将尽可能多地回答你的问题,并提供一些可能有帮助的有用信息。
- “我听说每个进程在32位系统中都有4gb的地址空间。”不完全是真的。在32位系统中,每个进程的最大可寻址空间为3.2GB。这并不意味着这个内存被分配过,而且进程一启动就没有分配它。“这就是我们谈论的虚拟内存吗?”不是的。虚拟内存与进程的可寻址空间没有直接关系。稍后再谈这个。
- 这个问题没有真正的意义,因为我将在下面解释。但是,值得注意的是,多个进程一次确实适合内存,因为进程不会自动分配它们全部的潜在可用内存。(如果文本编辑器一打开就分配了4GB内存,它就不会是一个流行的文本编辑器!)
- 我不是专家,但我非常怀疑每个程序在运行时都有自己的内核代码副本。仅仅是安全和性能问题就使得这是一个非常不可能的解决方案。
所以现在,一些可能对你有帮助的定义。
- 物理内存是(通常!)你电脑里的内存。在运行任何程序时,CPU直接使用的是快速的物理内存。当您指定物理内存地址时,您将根据内存硬件本身在内存中指定确切的位置。
- 虚拟内存是(典型的!)存储在较慢的介质上,如硬盘驱动器(通常称为分页文件)。当计算机运行内存不足以运行进程时,它将将某些当前物理内存内容复制到页文件中,通常是从空闲或后台应用程序中复制。这将在物理内存中腾出空间,以便活动进程能够运行。如果已不在物理内存中的程序需要处理数据,则必须将其数据从页面文件重新加载到物理内存中--这可能反过来需要将另一个程序从物理内存中分页以腾出空间。“虚拟”和“物理”内存是用来突出显示这个内存实际上并不存在,但它仍然是计算机可用的。虚拟内存的使用在性能上是非常昂贵的,但它可以支持更大的大小:的确,可以有任意数量的虚拟内存可用,但是性能上的影响阻止了这是一个超出某些限制的实用解决方案。
- 逻辑内存地址是单个进程使用的地址,允许进程处理自己的内存,而不必关心进程在物理内存中的位置。您的
00000000到fffffff范围是进程可用的逻辑范围,这是进程中将用来引用内存的地址。内核将根据进程内存的物理偏移量(和分段)将其转换为CPU在实际执行代码时使用的物理地址。此物理位置可以位于可用内存空间中的任何位置,如果将应用程序分页和分页,则物理位置可能在应用程序的生存期内发生变化。然而,应用程序本身只需要引用它自己的逻辑地址空间。术语“逻辑”与“物理”地址被用来突出显示地址不是真正的地址,而是相对于内存的相关子集的地址--也就是说,相对于进程本身的内存空间。
我不是这方面的专家,但我希望这有助于澄清你的一些问题。