要分配System V共享内存段,可以将shmget()与SHM_HUGETLB标志一起使用。
假设我们不知道该内存段的原始创建者如何使用shmget()系统调用,有没有一种方法可以检查System V共享内存段是由大页还是常规页支持。
答案 0 :(得分:1)
好吧,我想我明白了。
一种方法是将其附加到共享内存段(或依赖于已附加的进程),并检查/ proc / [PID] / smaps以找到感兴趣的共享内存段并查看相应的KernelPageSize字段使其与服务器配置的Hugepagesize匹配
答案 1 :(得分:0)
我不认为System V共享内存段会影响页面的大小。这是os和cpu配置的函数。另请参阅What is the size of shared memory page?和朋友。
在Linux上,您可以调用getpagesize(2)
来确定页面大小:
#include <unistd.h>
int size = getpagesize();
您也可以致电sysconf(3)
:
#include <unistd.h>
long size = sysconf(PAGESIZE);
不过有一件事……Glibc可能无法确定页面大小。您应该检查size>0
和size
是2
的倍数。将其他内容视为错误,并使用默认页面大小:
#include <unistd.h>
long size = sysconf(PAGESIZE);
if (size <= 0)
size = 4096;
尽管-1
是失败的,但我还是让Glibc在PowerPC上返回了伪造的值,例如0
而不是失败,这是因为缓存行大小(缓存行大小是64或128;永不为0)。另请参见Bug 0014599, sysconf(_SC_LEVEL1_DCACHE_LINESIZE) returns 0 instead of 128。
另请参见How can i calculate the size of shared memory available to the system,其中在Red Hat系统上返回另一个伪造的值。