|
|
1
27
|
|
2
24
physcal和虚拟内存布局入门 您将需要一个64位CPU和O/S构建,并且几乎肯定需要足够的内存来避免对工作集的冲击。一点背景: 32位机器(大体上)具有可存储2^32(4294967296)个唯一值之一的寄存器。这意味着32位指针可以寻址2^32个唯一内存位置中的任何一个,这就是神奇的4GB限制的来源。 有些32位系统(如SPARCV8或Xeon)具有MMU,可以巧妙地允许更多的物理内存。这允许多个进程占用总计超过4GB的内存,但每个进程仅限于其自己的32位虚拟地址空间。对于查看虚拟地址空间的单个进程,32位指针只能映射2^32个不同的物理位置。 我不想谈细节,但是 This presentation Here -感谢上面的FP)操作MMU并在用户级控制下将不同的物理位置交换到虚拟地址空间。 操作系统和内存映射I/O将占用部分虚拟地址空间,因此并非所有4GB都必须可用于进程。例如,Windows默认使用2GB,但如果在引导时调用/3G开关,则可以设置为仅使用1GB。这意味着这种32位体系结构上的单个进程只能在内存中构建略小于4GB的连续数据结构。 PAE 窗户或窗户上的设施 Equivalent facilities on Linux 或者,你可以得到一个有大量内存的64位盒子,这些问题或多或少会消失。至少在理论上,带有64位指针的64位体系结构可以构建一个具有多达2^64(18446744073709551616)个唯一地址的连续数据结构。这允许构建和管理更大的连续数据结构。 |
|
3
22
内存映射文件的优点是,您可以打开一个比4Gb大得多的文件(在NTFS上几乎是无限的!),并拥有多个<4Gb内存窗口。
|
|
|
4
14
对于64位操作系统(以及拥有如此多内存的机器),这应该不是问题。 如果malloc无法应对,那么操作系统肯定会提供允许您直接分配内存的api。在Windows下,您可以使用 VirtualAlloc 应用程序编程接口。 |
|
|
5
12
|
|
|
6
9
您是否考虑过使用内存映射文件?因为您正在加载非常大的文件,所以这似乎是最好的方法。 |
|
|
7
6
这取决于操作系统是否会为您提供允许寻址4GB以上内存的虚拟地址空间,以及编译器是否支持使用new/malloc分配虚拟地址空间。 对于32位窗口,您将无法获得大于4GB的单个块,因为指针大小为32位,因此将虚拟地址空间限制为4GB。(你可以用 Physical Address Extension 获得4GB以上的内存;但是,我相信您必须将该内存映射到4GB的虚拟服饰空间) 对于64位Windows,VC++编译器支持64位指针,理论上虚拟地址空间限制为8TB。
|
|
|
8
4
正如Rob指出的,VirtualAlloc for Windows是一个很好的选择,匿名文件映射也是一个很好的选择。但是,特别是关于您的问题,“如果C或C++可以分配,那么答案是 不,即使在WIN7 RC 64上也不支持此操作 在exe文件的PE/COFF规范中,指定堆保留和堆提交的字段为32位。这与windows CRT中当前堆实现的物理大小限制是一致的,即仅缺少4GB。因此,无法从C/C++中分配超过4GB的内存(CreateFileMapping和VirtualAlloc/VirtualAllocNuma等所有操作系统支持功能都不是C或C++)。 还有,要 意识到的 实际上,做你所关心的事情,为你的更大的请求分配更小的块,即使这发生在内核内存中,也会对整个系统产生影响,这些表是有限的。
AMD64 (AMD系列10h处理器软件优化指南)的最大页表条目大小为1GB。这意味着对于您的情况,假设您刚刚完成了4GB,那么只需要内核目录中的4个唯一条目就可以定位\分配并允许进程的内存。 manual 这清楚地说明了应用程序内存的一些优点,以及它在Vista/2008平台和更新版本中的使用。 目录 介绍4. 关于内存管理器4 虚拟地址空间。5. 内核虚拟资源的动态分配 x86体系结构的详细信息。6. 64位体系结构的详细信息。7. x86中的内核模式堆栈跳转 架构。7. 安全性:地址空间布局 随机化。9 ASLR对图像负载的影响 ASLR的好处。。11 如何动态创建基于 I/O带宽。11 微软超级蚀刻。12 页面文件写入。12 内存管理器与内存管理器的协调 缓存管理器13 预回迁式集群。14 大文件管理15 休眠和待机。16 高级视频模型16 资源分配。17 打断亲和力。19 支持NUMA的系统功能 应用。19 司机。19 寻呼。20 页面帧编号和PFN数据库。20 大页。21 缓存对齐池分配。21 虚拟机。22 负载平衡。22 其他优化。23 系统完整性。23 硬件错误的诊断。23 代码完整性和驱动程序签名。24 错误检查期间的数据保存。24 你应该做什么。24 适用于硬件制造商。24 对于驱动程序开发人员。24 供系统管理员使用。25 |
|
|
9
3
如果系统上的大小\u t大于32位,则您已经越过了第一个障碍。但是C和C++标准不负责确定是否有新的或新的Maloc的特定调用成功(除了具有0大小的Maloc)。这完全取决于操作系统和堆的当前状态。 |
|
|
10
2
PAE . 不幸的是,32位WinXP不能做到这一点(32位Vista吗?)。默认情况下,Linux允许您这样做,但即使使用mmap(),您也将被限制在4gb区域,因为指针仍然是32位的。 不过,您应该做的是让操作系统为您管理内存。进入一个能够处理这么多RAM的环境,然后将XML文件读入数据结构,让它为您分配空间。然后对内存中的数据结构进行操作,而不是对XML文件本身进行操作。 即使在64位系统中,您也无法控制程序的哪些部分实际位于RAM、缓存中或被分页到磁盘,至少在大多数情况下是这样,因为操作系统和MMU自己处理这个问题。 |
|
9-Pin · 释放具有内部空字节的动态分配字符串 1 年前 |
|
Viewed · 如何从popen中获得结果? 2 年前 |
|
|
dhutturi · malloc()没有分配我期望它[复制]的内容 2 年前 |
|
|
vansergh · 如何为malloc分配的数组释放内存? 2 年前 |
|
|
EagleStar · 显示错误的值:C指针还是malloc问题? 2 年前 |