检查 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>0
和 size
是 2
的倍数。将其他任何事情都视为错误并使用默认页面大小:
#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。
要分配 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>0
和 size
是 2
的倍数。将其他任何事情都视为错误并使用默认页面大小:
#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。