Задача читателей и писателей

Задача обедающих философов хороша для моделирования процессов, которые соревнуются за исключительный доступ к ограниченному количеству ресурсов, например к устройствам ввода-вывода. Другая общеизвестная задача касается читателей и писателей (Courtois et al., 1971).
В ней моделируется доступ к базе данных. Представим, к примеру, систему бронирования авиабилетов, в которой есть множество соревнующихся процессов, желающих обратиться к ней для чтения и записи. Вполне допустимо наличие нескольких процессов, одновременно считывающих информацию из базы данных, но если один процесс обновляет базу данных (проводит операцию записи), никакой другой процесс не может получить доступ к базе данных даже для чтения информации. Вопрос в том, как создать программу для читателей и писателей? Одно из решений показано в листинге 2.15.

В этом решении первый читатель для получения доступа к базе данных выполняет в отношении семафора db операцию down. А все следующие читатели просто увеличивают значение счетчика rc. Как только читатели прекращают свою работу, они уменьшают значение счетчика, а последний из них выполняет в отношении семафора операцию up, позволяя заблокированному писателю, если таковой имеется, приступить к работе.

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

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

Чтобы предотвратить такую ситуацию, программу можно слегка изменить: когда писатель находится в состоянии ожидания, то вновь прибывающий читатель не получает немедленного доступа, а приостанавливает свою работу и встает в очередь за писателем. При этом писатель должен дождаться окончания работы тех читателей, которые были активны при его прибытии, и не должен пережидать тех читателей, которые прибывают после него. Недостаток этого решения заключается в снижении производительности за счет меньших показателей параллельности в работе. Куртуа с соавторами (Courtois et al., 1971) представили решение, дающее приоритет писателям. Подробности этого решения можно узнать из их статьи.

Листинг 2.15. Решение задачи читателей и писателей


2.6.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Задача читателей и писателей:

  1. От писателя
  2. От писателя (снова!)
  3. Ф.М. Достоевский. «Дневник писателя». 1876, январь
  4. Ф.М. Достоевский. «Дневник писателя». 1876, март
  5. Ф.М. Достоевский. «Дневник писателя». 1877, декабрь
  6. Писатель или сборщик на конвейере?
  7. СОВЕТ НАЧИНАЮЩИМ ПИСАТЕЛЯМ (Шутка)
  8. Предисловие писателя
  9. Из жизни писателей
  10. КАК ПИСАТЕЛЬ ОБНАРУЖИЛ В СЕБЕ МАГИЧЕСКИЕ СИЛЫ