这里是我想要做的:我有一个为64位Linux构build的库。 然后我创build了一个链接该库的应用程序。 我想确保在运行应用程序时,从库中分配的内存始终位于较高的位置(> 4GB)。
在Windows上,用户可以强制分配以便在testing之前从较低地址分配较高地址,在调用VirtualAlloc时指定MEM_TOP_DOWN或将以下registry值设置为0x100000:
HKEY_LOCAL_MACHINE System CurrentControlSet Control Session Manager Memory Management AllocationPreference
我不知道在Linux上是否有类似的策略。 我了解Linux内存pipe理与Window不同,但是我发现了一些线索,例如使用mmap()或者链接器脚本。 但是我一直无法实现这个目标。 任何人都可以提供更多的信息?
Windows:以primefaces级方式暂停整个过程?
是否有可能完全pipe理stream程及其叉的生命周期?
即使二进制大小很大,64位C ++二进制文件也会消耗巨大的内存
写入超过2.5GB后性能下降。 为什么?
如何开始一个进程,当我的SSH会话结束时不会结束?
#include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define handle_error(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0) int main() { void *addr1=0,*addr2=0; long sz = sysconf(_SC_PAGE_SIZE); // get page size size_t length = sz*1000*1000; // 1,000,000 pages int fd = -1; printf("page size = %ldn",sz); // find some available address int *p = (int*)malloc(sizeof(int)); long start = (long)p + sizeof(int); free(p); // free it anyway start += (sz-(start % sz)); // page alignment printf("start = 0x%lxn",start); // mmap fixed addr1 = mmap((void*)start,length,PROT_NONE,MAP_PRIVATE|MAP_norESERVE|MAP_ANONYMOUS|MAP_FIXED,fd,0); if (addr1 == MAP_Failed) handle_error("mmap"); printf("first map: %txn",addr1); //msync(addr1,0); // another mmap addr2 = mmap(NULL,sz*10,MAP_ANONYMOUS|MAP_PRIVATE,0); if (addr2 == MAP_Failed) handle_error("mmap"); printf("second map: 0x%txn",addr2); // test whether the memory is still available p = (int*)malloc(sizeof(int)*10); printf("allocated address: 0x%txn",p); return 0; }
输出:
page size = 4096 start = 0x1d77000 first map: 1d77000 second map: 0x7f5f26c2f000 allocated address: 0x1d76030
有没有一种方法来识别Windows命令提示符而不pipe文件名或位置?
获取进程的历史命令
当Windows可以访问的总内存也被限制为4GB时,Windows如何为多个进程分配4GB的地址空间?
如何杀死运行时间超过30分钟的Windows进程
模拟和CreateProcess
我不明白你为什么要这样做 (避免mmap在前四个千兆字节给一些地址)。
Hoever,你可以在你的程序很早的时候(例如main启动,甚至是一些构造函数)在几个内存段上调用mmap(2)和MAP_FIXED和MAP_norESERVE来实现你的目标。 所以你可以确保4G以下的所有地址空间都被“填充” – 既可以通过程序的预先存在的部分,也可以通过对mmap的这种调用来完成。
然而,你的图书馆(可能是间接的)可能会在程序后开始。
一旦在地址空间中使用了前四千兆字节,大多数普通的mmap调用(例如由malloc完成的)就会出现在外面。
当然,你应该在第一个malloc (它可能会调用mmap或sbrk ) 之前的某个时间进行 mmap 。 你应该照顾现有的内存段(也许你可以通过解析/proc/self/maps来得到它们),因为你需要在你的mmap MAP_FIXED|MAP_norESERVE避免它们。
你也可以定义你自己的malloc 。 也许你可以使用MAP_norESERVE一个巨大的区域(例如一个TB),并使用你自己的malloc只使用内部地址(再次通过mmap -ing)。
我想你正在试图解决错误的问题。做我的建议可能会很棘手…我没有看到有效的理由,以避免在前4 GB的地址。
顺便说一句,在Linux上查找内存泄漏的好工具是valgrind 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。