Операционные системы. Управление ресурсами



"Читатели-писатели" и групповые мониторы - часть 2


  • для читателей:

    startRead ( proc ); read( proc, ... ); endRead ( proc );

  • для писателей:

    startWrite ( proc ); write ( proc, ... ); endWrite ( proc );

    где proc - идентификатор процесса.

    Структура самого монитора в общих чертах следующая:

    1 int rdCnt = 0; /* счетчик читателей */ 2 char wrFlag = 0; /* признак активности записи */ 3 /* списки - писателей и читателей */ 4 process *wrCrowd=NULL, *rdrowd=NULL; 5 /* события: МОЖНО_ЧИТАТЬ, МОЖНО_ПИСАТЬ */ 6 event mayRead, mayWrite; 7 /*== процедура регистрации читателя ==*/ 8 void guard startRead ( process *p ) { 9 rdCnt++; /* подсчет читателей */ 10 /* если идет запись - ожидать МОЖНО_ЧИТАТЬ */ 11 if ( wrFlag ) wait (mayRead); 12 /* дублирование сигнала для другого читателя */ 13 signal (mayRead); 14 /* включение в список читателей */ 15 inCrowd ( rdCrowd, p ); 16 } 17 /*== процедура открепления читателя ==*/ 18 void guard endRead ( process *p ) { 19 /* исключение из списка читателей */ 20 fromCrowd ( rdCrowd, p ); 21 /* уменьшение числа читателей, 22 если читателей больше нет - сигнализация МОЖНО_ПИСАТЬ */ 23 if ( --rdCnt==0 ) signal(mayWrite); 24 } 25 /*== процедура регистрации писателя ==*/ 26 void guard startWrite ( process *p ) { 27 /* если есть другие читатели или писатели - ждать */ 28 if ( wrFlag||rdCnt ) wait(mayWrite); 29 /* установка признака записи */ 30 wrFlag = 1; 31 /* писатель включается в оба списка*/ 32 inCrowd ( rdCrowd, p ); 33 inCrowd ( wrCrowd, p ); 34 } 35 /*== процедура открепления писателя ==*/ 36 void guard endWrite ( process *p ) { 37 wrFlag=0; /* сброс признака записи */ 38 /* исключение из списков */ 39 fromCrowd ( rdCrowd, p ); 40 fromCrowd ( wdCrowd, p ); 41 /* если есть претенденты-читатели - разрешение им */ 42 if ( rdCnt ) signal (mayRead); 43 /* иначе - разрешение на запись */ 44 else signal (mayWrite); 45 } 46 /*== процедура чтения ==*/ 47 void read ( process *p, 48 < другие параметры > ) { 49 /* если процесс не зарегистрирован читателем - отказ */ 50 if (!checkCrowd(rdCrowd, p)) <отказ>; 51 else < чтение данных >; 52 } 53 /*== процедура записи ==*/ 54 void write ( process *p, 55 < другие параметры > ) { 56 /* если процесс не зарегистрирован писателем - отказ */ 57 if (!checkCrowd(wrCrowd,p)) <отказ>; 58 else < запись данных >; 59 }




    Содержание  Назад  Вперед