Как предотвратить тупик Reader-writer, используя семафор n + 1 в C - PullRequest
0 голосов
/ 07 ноября 2011

Эй, ребята, я думал о том, как мы можем сделать файл прочитанным n читателями и только одним писателем, у которого каждая операция имеет различное смещение и размер.С этим мотивом я хотел бы иметь: -

1) Максимальный параллелизм 2) Предотвращение читателей от чтения областей файла, где писатель пишет с любым смещением в этой области 3) однако несколько читателей могут читать перекрывающиеся области файлавсякий раз, когда у писателя нет совпадений с читателями 4) Наконец, читатели также не должны голодать писателя

Как мы можем достичь этой ситуации, используя семафор n + 1.Есть ли пример решения, на которое я могу сослаться?Спасибо

Вот мой код псевдо: -

lock
lock lockarray[m+1]
lockentry = set Lock Entry[Item number] 
writer code:
wait(mutex[item number]);
readcount[item number]--;
if read count[item number]==0
signal (wrt[item number]);
signal (mutex[item number])
}

lock
lock lockarray[m+1]
lockentry = set Lock Entry[Item number] 
Reader code:
wait(mutex[item number]);
read count[item number]++;
if read count[item number]==1
wait (wrt[item number]); 
wait(mutex[item number]);
signal mutex[item number];

1 Ответ

0 голосов
/ 07 ноября 2011

Если вы хотите сделать это для файла, вы можете определить некоторую гранулярность и объявить блокировки на основе этой гранулярности.Например, для больших файлов вы можете использовать размер 4 КБ (размер страницы в системе) и сказать, что каждая ч / б блокировка имеет гранулярность 4 КБ для файла, а количество блокировок просто равно размеру файла / 4 КБ.Вы можете использовать любой произвольный размер, который вам нужен, и, конечно, есть компромисс между более точной блокировкой зерна (больше памяти для отслеживания блокировок региона) и достижением наилучшей производительности.

Вы можете попробовать что-то вроде

#define MYGRANULARITY 4096
lock filelocks[file_size / MYGRANULARITY];

/* Code to do read or write */
int lock_idx = location_to_rw / MYGRANULARITY;
lock(filelocks[lock_idx]);
/* do work with it */
unlock(filelocks[lock_idx]);

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

...