我对虚拟地址空间的含义感到困惑。在32位机器上,一个进程可以寻址2^32个内存地址。那么每个进程的虚拟地址空间是否都是2^32(4GB)?下面是一个进程虚拟地址空间的快照。它是否可以增长到4GB?在这样的系统中,进程数量是否有限制?
地址空间的大小受唯一指针值的数量限制。对于32位处理器,32位值可以表示2 ^ 32个不同的值。如果允许每个这样的值寻址不同的字节内存,那么你将得到2 ^ 32字节,相当于四千兆字节。
因此,是的,进程的虚拟地址空间理论上可以增长到4GB。然而在现实中,这也可能取决于系统和处理器。如下所示:
请注意,从系统中分配内存有两种方法。您可以使用C的然而,在Pentium类处理器上无法达到这个理论最大值。其中一个原因是段值的低位编码了关于选择器类型的信息。因此,在65536个可能的选择器值中,只有8191个可用于访问用户模式数据。这会使你降到32TB。
malloc
(您的问题标记为c)隐式地为您的进程分配内存,当然也可以显式地映射文件字节。
一个进程包括一个或多个实际上在进程中执行代码并由内核线程对象表示的线程(技术上说,进程不运行,线程运行)。
根据此处进行的一些测试,具有2GB默认地址空间的32位Windows XP系统可以创建大约2025个线程:
然而,确切的线程和进程限制极其不确定,这取决于很多因素。线程指定它们的堆栈大小的方式,进程指定它们的最小工作集的方式,可用的物理内存量以及系统提交限制。无论如何,在现代系统上,你通常不需要担心这个问题,因为如果你的应用程序真的超过了线程限制,你应该重新考虑你的设计,因为几乎总是有其他合理的方法来实现相同的目标。
回答被忽略的部分...
进程数量是有限制的。内核在虚拟地址空间中保留了所有进程数据结构(否则您将无法在每个进程中访问内核),这些数据结构需要一些空间。例如,如果有1GB可用于此数据,并且每个进程在内核中只需要4KB页面,则最多可以达到大约250,000个进程。实际上,这个数字通常要小得多,因为事情更加复杂,并且为每个进程保留了各种物理内存。有关详细信息,请参见Mark Russinovich在Windows中进程和线程限制的文章。