Проверьте, поддерживается ли сегмент общей памяти System V большими или обычными страницами - PullRequest
0 голосов
/ 20 сентября 2018

Чтобы выделить сегмент совместно используемой памяти System V, можно использовать shmget () с флагом SHM_HUGETLB.

Есть ли способ проверить, поддерживается ли сегмент общей памяти System V большими страницами или обычными страницами, предполагая, что мы не знаем, как первоначальный создатель этого сегмента памяти использовал системный вызов shmget ().

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я не верю, что сегмент разделяемой памяти System V влияет на размер страницы.Это функция конфигурации ОС и ЦП.См. Также Каков размер страницы общей памяти? и друзей.

В 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, например 0 вместо сбоя, дляразмер строки кэша (размер строки кэша равен 64 или 128; никогда не равен 0).Также см. Ошибка 0014599, sysconf (_SC_LEVEL1_DCACHE_LINESIZE) возвращает 0 вместо 128 .

Также см. Как рассчитать размер общей памяти, доступной для системы , гдедругое поддельное значение возвращается в системах Red Hat.

0 голосов
/ 20 сентября 2018

Хорошо, думаю, я понял это.

Один из способов - подключиться к сегменту совместно используемой памяти (или полагаться на уже подключенный процесс) и изучить / proc / [PID] / smaps, чтобы найти интересующий сегмент совместно используемой памяти и посмотреть насоответствующее поле KernelPageSize, чтобы увидеть, что оно совпадает с настроенным сервером Hugepagesize

...