如何在 Unix 中查找虚拟内存块大小
How to find virtual memory block size in Unix
>我有一个程序在一个循环中分配 4096 字节 (4KB),在第 4 次迭代后,我可以看到虚拟内存大小增加了 16 KB。 因此,这意味着块大小为 16 KB。什么是 unix 命令来查找此内容?我可以使用getconf PAGE_SIZE来获取4KB的页面大小,但需要找到块大小。
假设您在正常配置中使用glibc
,我实际上希望您的内存分配一次增长 4KB。但是,也许您用来查看大小的工具不够细粒度,无法显示如此小的差异?
显然,可能是您的glibc配置与我得到的源不同,但它确实分配(通过sbrk
,这反过来调用系统调用brk
)您要求的块的大小,四舍五入到4KB(确切来源:size = (size + pagemask) & ~pagemask;
,紧随其后的是if (size > 0) brk = (char*)(MORECORE(size));
。
当然,如果你做x = malloc(4096);
,实际分配将是大于4KB的少量字节,因为malloc
需要一些额外的数据来跟踪分配本身(例如当前分配的大小,以前的分配是什么大小)。在 32 位系统上,整个开销至少为 2 * sizeof(size_t) + 2 * sizeof(某些指针)= 16 字节,在 64 位系统上至少为 32 字节。可能不止于此。
相关文章:
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 为什么我只能在 4 GB 的虚拟内存空间上分配 2 GB?
- AWS pandas 安装出现错误:虚拟内存已耗尽:无法分配内存
- 如何判断虚拟内存页是否已锁定
- 如何使用一个 VirtualFree 调用删除多个相邻的虚拟内存分配?
- C++如何使用读取进程内存查找进程内存中使用的最后一个(偏移量 - 地址)
- Windows 32 位 mfc 应用程序的虚拟内存中的地址
- 如何将x64机器代码写入虚拟内存并在C++中为Windows执行
- 读取虚拟内存时C++缓冲区溢出
- 在 Linux C++ 中获取虚拟内存最大映射计数
- GlobalMemoryStatusEx() 提供的总虚拟内存为 127 TB
- 在虚拟内存中分配大型类C
- 程序C++中的虚拟内存大小增加
- CC1PLUS:虚拟内存耗尽
- Linux的VirtualQueryEx替代方案-如何获得另一个进程的虚拟内存范围
- 在Linux中,多个进程使用文件指针读取文件时使用的共享虚拟内存
- 我已经将虚拟内存设置为20GB,但由于内存不足,代码仍然无法工作
- C++/Win32 在虚拟内存中创建文件
- 优化数据结构,使其充分利用虚拟内存
- 如何在 Unix 中查找虚拟内存块大小