检查 System V 共享内存段是否由大页面或常规页面支持

Check if a System V shared memory segment is backed by huge pages or regular pages

要分配 System V 共享内存段,可以使用带有 SHM_HUGETLB 标志的 shmget()。

假设我们不知道此内存段的原始创建者如何使用 shmget() 系统调用,是否有方法检查 System V 共享内存段是由大页面还是常规页面支持的。

好的,我想我明白了。

一种方法是附加到共享内存段(或依赖已附加的进程),并检查/proc/[PID]/smaps 以找到感兴趣的共享内存段并查看相应的KernelPageSize 字段以查看它是否与服务器配置的 Hugepagesize 相匹配

我认为 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>0size2 的倍数。将其他任何事情都视为错误并使用默认页面大小:

#include <unistd.h>
long size = sysconf(PAGESIZE);
if (size <= 0)
    size = 4096;

虽然 -1 是一个失败,但我在 PowerPC 上有 Glibc return 伪值,比如 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 系统上被 returned。