Практично ли реализовать структуру данных, совместно используемую несколькими процессами? - PullRequest
2 голосов
/ 05 января 2012

Я довольно много гуглил для общих (одновременных) структур данных,

все они, кажется, совместно используются для потоков, а не для процессов.

Возьмем, например, общую хеш-таблицу:

если он будет реализован как общий для нескольких процессов,

все malloc или эквивалентные вызовы для таблицы должны быть заменены на shmget и т. Д.

Но я не вижу такого примера.

Практично ли вообще реализовывать структуру данных, совместно используемую несколькими процессами?

Означает ли тот факт, что я не нахожу такой примерчто это непрактично?

Ответы [ 4 ]

1 голос
/ 05 января 2012

Основная проблема в том, что нет платформонезависимого способа.Предполагая, что вы работаете в какой-то Unix-системе, для совместного использования между произвольными процессами я бы, вероятно, использовал mmap для файла.Приятно то, что у вас может быть произвольно много процессов, совместно использующих его, простой способ идентифицировать точку общего доступа (файл), и у вас также есть фактическое постоянное хранилище бесплатно (облегчает отладку).Неважно, насколько сложна ваша структура данных - это просто часть памяти.Таким образом, единственная проблема, которую вам еще предстоит решить, - это как синхронизировать доступ на запись между вашими процессами - и это действительно зависит от приложения (хотя это нелегко, если вы разрешаете запись из нескольких процессов).код:

#include <sys/mman.h>
#include <fcntl.h>
...
struct my_structure *buf; /* just an example - can be arbitrary complex */
...
int fd = open("foo.bin", O_RDWR);
if (fd == -1) { /* if the file doesn't exist create your initial structure */
  fd = open("foo.bin", O_RDWR | O_CREAT, 0700);
  /* ... allocate enough space in the file or pre-fill with the structure ... */
  /* (for safety you may do that in a separate process or using move-in atomically) */
}
buf = (struct my_structure*) mmap(0, sizeof(*buf), PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
...
/* memory in buf is now shared across all processes ... */
/* if you want to synchronize that shared memory with the file use msync, but it's not needed for the sharing */
msync(buf, sizeof(*buf), MS_ASYNC);
/* when you're done, unmap */
munmap(buf, sizeof(*buf));
0 голосов
/ 05 января 2012

Вы можете определенно разделить память (структуру данных) с несколькими процессами и заставить процесс взаимодействовать друг с другом, чтобы заставить их работать синхронно при доступе к общей памяти / структуре данных.

Пожалуйста, ознакомьтесь с различными примерами, приведенными здесь

0 голосов
/ 05 января 2012

Вам нужно будет использовать shmget, и вам нужно будет использовать барьеры памяти, чтобы между ними происходило планирование чтения / записи.Это препятствует тому, чтобы компилятор и центральный процессор планировали программные блокировки и тому подобное.Барьеры могут зависеть от ОС и / или арки, поэтому, если вы опубликуете свою ОС, я смогу помочь с этим.

Поэтому, чтобы ответить на вопросы, да, нет.Но ...

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

0 голосов
/ 05 января 2012

Не реализуйте общие структуры, насколько это возможно, точка, потому что это открывает целое поле проблем, в которые вы можете попасть.

Если вам нужно (и это тоже относится к процессам), вам придется отправиться делать это самостоятельно.

Но, если вы можете использовать IPC , это может быть самый простой вариант.

...