C# 64位应用程序,大内存地址可察觉

3

关于应用程序的内存限制,我有点困惑。据我所知,如果我编写一个针对x64的C#应用程序,我的程序将可以访问8TB的虚拟地址空间 = 硬盘上的空间?

操作系统>= Windows 7专业版支持192GB RAM。因此,如果我有192GB的系统(不幸的是我没有),我可以将超过8.1TB的数据加载到内存中(假设没有其他进程在运行)?

只有当我没有可用的RAM时,才会使用虚拟内存吗?我认为,与使用RAM相比,虚拟内存存在性能问题?

如果涉及内存管理,那么请原谅我是否提出了一些愚蠢的问题。


3
您不能将物理内存和虚拟内存相加。虚拟内存只是一种抽象概念,因此您不必担心数据来自哪里。您只需在地址X处访问数据,内存管理器会处理其余部分;从RAM、交换空间等获取数据。但重要的是,这些都是相同的地址空间。 - itsme86
让操作系统处理内存。除非你要一次性读取数据库中的一百万条记录之类的操作,否则不必担心它。 - Steve Wellens
2个回答

1

您的问题实际上包含了几个相关的问题,每个问题单独回答如下:

操作系统版本>=Windows 7专业版支持192GB内存。如果我有一个192GB的系统(不幸的是我没有),我可以将超过8.1TB的数据加载到内存中(假设没有其他进程在运行)吗?

不,它仍然是8TB。这是可寻址空间的最大量,无论它是在RAM还是其他地方。

然而,即使您卸载了Windows本身,您也永远不能使用8TB,因为操作系统需要跟踪正在使用的空间。总体而言,您可能可以达到约7TB。

只有当我用完可用的RAM时,虚拟内存才会被使用吗?

不是的,如果您已经启用虚拟内存,则整个RAM通常预加载到硬盘驱动器上(耗时几秒钟左右)。这允许操作系统卸载某些内容以腾出空间,而无需保留数据。请注意,操作系统会详细跟踪,因此它会知道是否是这种情况。

我假设使用虚拟内存会带来性能影响,与使用RAM相比?

这取决于您的上下文。硬盘上的每次搜索都需要计算时间的漫长,但仍然只有几分之一秒的时间。假设您的处理过程没有崩溃并且重复访问虚拟内存,您不应该在高性能计算以外感觉到显着的性能损失。

如果这些问题看起来很愚蠢,请原谅。但是当涉及到内存管理时,我对此不太熟悉。

您的主要问题是您对内存工作方式有一些误解,它们与现实不符合。如果您真的感兴趣,您应该了解现代系统中内存的使用方式。

例如,大多数人将指针概念化为指向内存中的位置,因为它是基本结构。这并不完全正确。实际上,指针包含一些信息,可以解码为系统可寻址空间中的位置,而这并不总是在 RAM 中。这个解码过程使用了相当多的技巧,非常有趣,但超出了这个问题的范围。


+1 如果您完整回答我的问题。您能否详细说明以下内容:“如果您已经打开虚拟内存,那么通常会将整个RAM预加载到硬盘驱动器上,不会吗?”。您所指的预加载是指硬盘驱动器上有当前在RAM中的精确副本吗?非常感谢您的帮助。 - Hans Rudel
1
@HansRudel:如果可能的话,您的操作系统将尝试在硬盘驱动器上保留RAM的全部副本。这提供了我所提到的好处。实际上,这是不可能的,但它会尽力而为。请注意,此缓存相对较低优先级,因此更频繁使用的扇区不太可能以这种方式备份,因为它们也最不可能被卸载,这在大多数情况下不是问题。 - Guvante

0
通常情况下,您应该编写针对任何 CPU的应用程序。然后,.NET 加载器根据其运行的平台决定将执行哪个版本的运行时环境,并将其编译成什么类型的本机代码。除非您正在使用将加载到为您的应用程序创建的进程中的自定义本机组件,否则无需指定平台。然后,将将此进程与某些虚拟地址空间相关联 - 如何将其映射到物理内存由操作系统管理...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接