c поместить хеш-таблицу в сегмент общей памяти - PullRequest
4 голосов
/ 22 марта 2011

Надеюсь, мой вопрос имеет смысл: Программируя на C, могу ли я создать хеш-таблицу в сегменте разделяемой памяти, чтобы любой процесс с соответствующими разрешениями имел доступ к ключам / значениям в нем? Если да, как я могу указать при создании хеш-таблицы, что я хочу, чтобы она была помещена в SHM? Есть ли рекомендуемая реализация хеш-таблицы, которая позволяет это? Большое спасибо

Ответы [ 3 ]

5 голосов
/ 22 марта 2011

От макушки головы, я не знаю ни одной библиотеки, которая делает это.

Я знаю, что если вы пишете свою собственную или изменяете существующую библиотеку, вам нужно хитроумно отследить и исправить любой код, использующий указатели, и заменить его кодом, который использует base + offset.

Основой будет указатель, возвращаемый функциями создания / открытия разделяемой памяти, и он будет отличаться в каждом процессе. Смещение заменяет то, что будет указателем. Когда вам нужно найти значение с помощью смещения, вы приводите базу к char*, добавляете к ней смещение, а затем приводите к your_type*. Что-то вроде (bucket_t*)((char*)base + offset).

Это предполагает, что вашей хеш-реализации вообще нужны указатели. Некоторые этого не делают, если используют только однозначные сегменты и не имеют списков значений.

Другая хитрость в том, что вам нужно управлять памятью самостоятельно. Вместо вызова malloc () вы создаете свою собственную функцию, возможно, называете ее shm_hash_alloc (). Быстрый старт состоит в том, чтобы просто сохранить указатель и увеличить его при распределении памяти и не беспокоиться о его освобождении. Позже вы можете использовать массив указателей (смещений) для освобождения списков различной степени двух размеров или, если вы знаете свои типы объектов, список для каждого типа. В каждом свободном блоке вы сохраняете указатель на следующий свободный блок и знаете размер, из-за какого списка он находится. Есть даже более причудливые методы, но, вероятно, они вам не нужны.

3 голосов
/ 31 января 2013

Я загрузил библиотеку хеш-таблиц совместно используемой памяти для linux в SF (libshmht), я разработал ее с производительностью в качестве основной функции и временем доступа для чтения / записи для домашнего доступа. Я думаю, что он полезен как кеш и как система IPC. Также реализует блокировки чтения / записи для совместного использования между многими процессами.

http://sourceforge.net/projects/libshmht/

1 голос
/ 22 марта 2011

Хеш-таблица - это просто структура данных. Пока модули, обращающиеся к разделяемой памяти, знают, как строится структура, они могут получить к ней доступ. Неважно, какую реализацию вы используете, если все задействованные модули знают, как ее читать.

Думай об этом как о газете. Вы создаете свой собственный сегмент памяти - это городская местная газета. Затем вы хотите поделиться им со всеми городами вокруг - вы можете, если люди говорят на одном языке и могут читать. Там нет специального языка для обмена, это просто должен быть тот, который все понимают.

То же самое в вашем случае - вы можете использовать любую реализацию хеш-таблицы, если все потоки используют одно и то же.

...