АкушерствоАнатомияАнестезиологияВакцинопрофилактикаВалеологияВетеринарияГигиенаЗаболеванияИммунологияКардиологияНеврологияНефрологияОнкологияОториноларингологияОфтальмологияПаразитологияПедиатрияПервая помощьПсихиатрияПульмонологияРеанимацияРевматологияСтоматологияТерапияТоксикологияТравматологияУрологияФармакологияФармацевтикаФизиотерапияФтизиатрияХирургияЭндокринологияЭпидемиология

Задача «поставщик — потребитель»

Прочитайте:
  1. Cитуационная задача.
  2. Cитуационная задача.
  3. Cитуационная задача.
  4. В) Задача
  5. В) Задача
  6. В) Задача
  7. В) Задача
  8. В) Задача
  9. В) Задача
  10. В) Задача

Решение задачи «поставщик - потребитель» является характерным примером использования семафорных операций. Содержательная постановка этой задачи уже была нами описана в первом разделе данной главы. Разделяемыми перемен­ными здесь являются счетчики свободных и занятых буферов, которые должны быть защищены со стороны обоих процессов, то есть действия по посылке и по­лучению сообщений должны быть синхронизированы. Использование семафоров для решения данной задачи приведено в листинге 6.11.

Листинг 6.11. Решение задачи «поставщик — потребитель»

var 5_свободно,5_заполнено.5_вэаимоискл: semaphore; begin

InitSem(S_CBo6oflHO.N); 1пП5ет(5_залолнено.О): 1пН5ет($_взаимоискл,1); parbegin

ПОСТАВЩИК: while true do begin

{ приготовить сообщение } Р(5_свободно); Р(5_взаимоискл);

(послать сообщение } \К5_заполнено): У(5_взаимоискл); end and

ПОТРЕБИТЕЛЬ: while true do begin

Р(5_заполнено): Р(5_взаииоискл):

{ получить сообщение } V(S_ceo6oflHo): У(5_взаимоискл):

{ обработать сообщение } end pa rend end.

Здесь переменные 5_свободно, 5_заполнено являются числовыми семафорами, 5_взаиноискл - двоичный семафор. 5_свободно имеет начальное значение, рав­ное N, где N - количество буферов, с помощью которых процессы связываются. Предполагается, что в начальный момент количество свободных буферов рав­но N; соответственно, количество занятых равно нулю. Двоичный семафор S вэаи-моискл гарантирует, что в каждый момент только один процесс сможет работать с критическим ресурсом, выполняя свой критический интервал. Семафоры 5_сво-бодно и 5_заполнено используются как счетчики свободных и заполненных буфе­ров, i


Действительно, перед посылкой сообщения «поставщик» уменьшает значение 5_свободно на единицу в результате выполнения Р(5_свободно), а после посылки сообщения увеличивает значение 5_заполненО на единицу в результате выпол­нения У(5_эаполнено). Аналогично, перед получением сообщения «потребитель» уменьшает значение 5_заполнено в результате выполнения Р(5_заполнено), а после получения сообщения увеличивает значение 5_свободно в результате выполнения У(5_свободно). Семафоры 5_заполнено, 5_свободно могут также использоваться для блокировки соответствующих процессов. Если пул буферов оказался пустым и к нему первым обратится процесс «потребитель», он заблокируется на семафоре 5_заполнено в результате выполнения Р(5_заполнено). Если пул буферов заполнен и к нему в этот момент обратится процесс «поставщик», то он будет заблокиро­ван на семафоре 5_свободно в результате выполнения Р(5_свободно). В решении задачи о «поставщике» и «потребителе» общие семафоры применены для учета свободных и заполненных буферов. Их можно также применить и для распределения иных ресурсов.


Дата добавления: 2015-01-18 | Просмотры: 918 | Нарушение авторских прав



1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |



При использовании материала ссылка на сайт medlec.org обязательна! (0.003 сек.)