我对应用程序的内存限制感到有些困惑。据我所知,如果我编写一个针对x64的c#应用程序,我的程序将可以访问HD上的8TB虚拟地址空间=空间?
OS> = Windows 7专业版支持192 GB的RAM。所以,如果我有192gig系统(不幸的是我不这样做),我可以将超过8.1TB的数据加载到内存中(假设没有其他进程在运行)?
虚拟内存是否仅在我用完ram时使用?我假设虚拟内存与使用RAM相关的性能影响?
道歉,如果这些问题看起来很愚蠢,但是当涉及到内存管理时,我会相当绿色。
答案 0 :(得分:1)
您的问题实际上是几个相关的问题,每个问题单独进行:
OS> = Windows 7专业版支持192 GB的RAM。所以,如果我有192gig系统(不幸的是我不这样做),我可以将超过8.1TB的数据加载到内存中(假设没有其他进程在运行)?
不,它仍然是8 TB。这是可寻址空间的最大数量,无论是在RAM还是其他地方。
然而,即使你有一些如何卸载Windows本身,你也永远不会有8 TB的使用,因为操作系统需要跟踪所使用的空间。总的来说,你可能大约达到7 TB。
是虚拟内存,仅在我用完可用内存时使用?
不,如果您打开了虚拟内存,则整个RAM通常会预先加载到您的硬盘上(提供或花费几秒钟)。这允许操作系统卸载某些东西以便在感觉需要时腾出空间,而不必保留数据。请注意,操作系统保持彻底的跟踪,因此将知道是否是这种情况。
我假设虚拟内存与使用RAM相关的性能影响?
取决于您的背景。硬盘上的每次搜索都需要计算永恒,但它仍然是一小部分。假设您的流程没有颠覆并反复访问虚拟内存,您不应该注意到高性能计算之外的性能受到重大影响。
道歉,如果这些问题看起来很愚蠢,但是当涉及到内存管理时,我会相当绿色。
你的主要问题是你有一些关于记忆如何与现实不符的先入为主的观念。如果你真的很感兴趣,你应该研究一下现代系统中如何使用内存。
例如,大多数人都认为指针指向内存中的某个位置,因为它是基本结构。这不是真的。实际上,指针包含一条信息,可以将其解码到系统的可寻址空间中的位置,该位置并不总是在RAM中。这个解码过程使用了一些有趣的技巧,但超出了这个问题的范围。
答案 1 :(得分:0)
通常,您应该编写定位Any CPU
的应用程序。然后,.NET加载程序决定(根据它运行的平台)运行时环境的哪个版本将执行应用程序以及将编译它的本机代码类型。除非您使用将加载到为您的应用程序创建的流程中的自定义本机组件,否则无需指定平台。然后,此过程与某些虚拟地址空间相关联 - 映射到物理内存的方式由OS管理...