Общая память без блокировки в C ++ для записей переменной длины - PullRequest
2 голосов
/ 02 февраля 2012

Я новичок в МПК.Процесс Writer записывает данные в общую память. Многие процессы чтения считывают данные.Данные, которые должны быть записаны, имеют уникальный идентификатор, должны быть проиндексированы по уникальному ключу для более быстрого доступа (например, STL :: map или hashmap для поиска).Также данные представляют собой запись переменной длины (XML) (средняя длина составляет 200-250 байт).Операционная система Solaris 10 (i86pc) на четырехъядерном сервере Intel Xeon.

Общий объем данных превышает 200 ГБ.Но мы будем хранить только последние данные в общей памяти.Исторические данные хранятся в файле.размер разделяемой памяти будет около 4G ~ 6G.

Нет доступных внешних библиотек, таких как Boost :: interprocess

У меня есть пара вопросов, может быть много

  1. Какиеболее эффективен: shared_memory или mmap (файлы с отображением в памяти)
  2. Как создавать индексы для записи переменной длины.[Понятия не имею, может быть какое-то хеширование?].
  3. Будет ли это аккуратно, если XML преобразуется в структуру фиксированного размера (Компромисс - размер структуры будет огромным, почти 300+ возможных полей)
  4. Можем ли мы поместить любой STL в shared_memoryпредоставляя пользовательский распределитель.
  5. Возможно ли реализовать без семафоров (реализация без блокировки с использованием CAS).

Спасибо

Как насчет этого.

|--------------------------|
| start_id   |   end_id    |   ->  range of msg id present in the segment
|--------------------------|
| id1 | start_mem | length |   ->
|--------------------------|   ->
| id2 | start_mem | length |   -> table of index for the actual data
|--------------------------|   ->
| id3 | start_mem | length |   ->
|--------------------------|   ->
| id4 | start_mem | length |   ->
|--------------------------|   ->
|                          |
|                          |
|                          |
|       data segment       |
|       varibale length    |
|       xml are stored     |
|                          |
|                          |
|--------------------------|

Когда поступают новые данные и сегмент полон.самые старые данные стираются по кругу.Может быть возможность удаления более 1 записи.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

Самое простое решение: если вам требуется сложная индексация и другие подобные вещи, вам следует рассмотреть сервис-ориентированную архитектуру вместо общей памяти. Просто назначьте один процесс как ваш основной процесс кэширования, и пусть он принимает локальные соединения (через сокеты домена unix, или сокеты TCP, или что угодно) от других процессов, которым требуются данные. Это делает вещи намного, намного проще.

Если вы не выберете этот маршрут, имейте в виду, что общая память жесткая . То, что вы спрашиваете, определенно выполнимо в общей памяти - вы можете создать распределитель кучи в этом блоке shmem и т. Д. И т. Д. Распределители STL могут работать, но не ожидайте, что сторонние библиотеки будут довольны STL распределители с использованием пользовательских типов указателей. Вам понадобятся блокировки (если вы умны, вы можете избежать их в некоторых случаях, но не во всех, и в этом случае определенно попрощаетесь с STL), и вам придется восстанавливать все, что вы обычно принимают как должное.

Опять же, я настоятельно рекомендую вам начать с простого демона кэша. В большинстве случаев это прекрасно масштабируется, просто добавляет немного больше задержки.

0 голосов
/ 02 февраля 2012

Возможно ли реализовать без семафоров (реализация без блокировки с использованием CAS).

Поскольку реализации без блокировки (без блокировки) сложно спроектировать, и мы можем оказаться в хаосе, прежде чемПри поиске решения без блокировок вы должны рассмотреть следующие аспекты и альтернативы:

  • Если в системе много потоков, так что планировщик, вероятно, будет вытеснять поток, удерживающий блокировку, следовательно, все остальные потокибудет ожидать блокировки (если не без блокировки, то это не даст существенного улучшения).
  • Если это можно решить с помощью блокировки чтения-записи.(писателей значительно меньше, чем читателей).
  • Если конфликт блокировок менее вероятен, вы можете рассмотреть спин-блокировки, которые будут равны производительности без блокировок.
...