【发布时间】:2020-02-19 18:24:51
【问题描述】:
为了某些目的,分配大量虚拟空间并仅在访问的页面中分页会很有效。分配大量内存是瞬时的,实际上并不抢页:
char* p = new char[1024*1024*1024*256];
好的,上面指出的错误,因为它是一个 32 位数字。
我希望 new 正在调用调用 sbrk 的 malloc,并且当我访问开始后 4Gb 的位置时,它会尝试将任务内存扩展那么多?
这是完整的程序:
#include <cstdint>
int main() {
constexpr uint64_t GB = 1ULL << 30;
char* p = new char[256*GB]; // allocate large block of virtual space
p[0] = 1;
p[1000000000] = 1;
p[2000000000] = 1;
}
现在,当我尝试分配大量时,我得到了 bad_alloc,所以很明显 malloc 不起作用。
我的印象是 mmap 会映射到文件,但由于有人建议我正在研究它。
好的,所以 mmap 似乎支持分配大面积的虚拟内存,但它需要一个文件描述符。创建巨大的内存数据结构可能是一种胜利,但如果它们必须由文件支持,则不是:
以下代码使用 mmap,即使我不喜欢附加到文件的想法。我不知道要在虚拟内存中输入什么数字来请求,所以选择了 0x800000000。 mmap 返回 -1,所以很明显我做错了什么:
#include <cstdint>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
int main() {
constexpr uint64_t GB = 1ULL << 30;
void *addr = (void*)0x8000000000ULL;
int fd = creat("garbagefile.dat", 0660);
char* p = (char*)mmap(addr, 256*GB, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
p[0] = 1;
p[1000000000] = 1;
p[2000000000] = 1;
close(fd);
}
有没有办法分配一大块虚拟内存并稀疏地访问页面,或者这不可行?
【问题讨论】:
-
我对这些东西不是很熟悉或不确定,但我认为
mmap系统调用可以用于此。 -
正如@aschepler 所说,可能使用了
mmap。检查strace。 -
请遵守国际公认的 SI 单位制 - en.wikipedia.org/wiki/International_System_of_Units 请使用 B 表示 bytes 和 b 表示位,所以一兆字节是 1MB,一千兆字节是 1GB (en.wikipedia.org/wiki/Gigabyte),一千兆字节是 1Gb (en.wikipedia.org/wiki/Gigabit)。谢谢。
-
@DanielLangr:这是第一个问题。调查 mmap
-
@MarkSetchell 根据 SI 单位制,G 代表 10^9。如果您需要精确,请在此处使用 GiB。
标签: c++ linux memory-management virtual-memory