Спец часть (часть 2) (3 поток) (2015) (by Кибитова) (1161602), страница 8
Текст из файла (страница 8)
ПослеПосле этогоэтого происходитпроисходитсменасменапроверкувнутрифункцииTestитакжеполучаетположительныйответ,иуправлениепроцессанапроцессоре,управлениеполучаетсоседэтогофилософа.Тоттожеделаетуправлениепереходитк первойкомандевнутри if-блока.После этого происходитсменапроцессауправлениеполучаетпроцессанапроцессоре,процесса нана процессоре,процессоре, управлениеуправление получаетполучает соседсосед этогоэтого философа.философа.
ТотТот тожетоже делаетделаетпереходитк первойинструкцииif-блока.Дальнейшаяработабудет некорректной.проверкувнутрифункцииTestитакжеполучаетположительныйпроцессанапроцессоре,управлениеполучаетсоседэтогофилософа.ТоттожеделаетпроверкувнутрифункцииTestитакжеполучаетответ,иуправлениепроверкупроверку внутривнутри функциифункции TestTest ии такжетакже получаетполучает положительныйположительный ответ,ответ, ии управлениеуправлениепереходиткпервойинструкцииif-блока.Дальнейшаяработабудетнекорректной.проверкувнутрифункцииTestитакжеполучаетположительныйответ,иуправлениепереходиткпервойинструкцииif-блока.Дальнейшаяпереходитпереходит кк первойпервой инструкцииинструкции if-блока.if-блока. ДальнейшаяДальнейшаяработаработабудетбудетнекорректной.некорректной.Задача«читателейи писателей».Представимпереходитк первойинструкции if-блока.Дальнейшаяработа будетпроизвольнуюнекорректной.
систему резервированияресурса.Например,этоможетбытьсистемарезервированияместа вЗадача«читателейиписателей».ПредставимпроизвольнуюЗадача«читателейиписателей».системуЗадачаЗадача «читателей«читателей ии писателей».писателей». ПредставимПредставим произвольнуюпроизвольную системусистемурезервированияресурса.Например,этоможетбытьсистемарезервированияместагостинице.В даннойсистемесуществуетдватипапроцессовработы с информацией.резервированияресурса.Например,этоможетЗадача«читателейи писателей».Представимпроизвольнуюсистемурезервированияресурса.Например,этобытьсистемарезервированияместаввврезервированияресурса.Например,это можетможетбытьсистемадлярезервированияместагостинице.ВВсистемесуществуеттипапроцессовдляработыгостинице.даннойсистемесуществуетдваинформацией.Однипроцессымогутчитатьинформацию,а другие— ееизменять,корректировать.резервированияресурса.Например,это дваможетбытьсистемарезервированияместа вгостинице.Вданнойсистемесуществуетдватипапроцессовдляработыгостинице.Вданнойданнойсистемесуществуетдватипапроцессовдляработысссинформацией.информацией.Однипроцессымогутчитатьинформацию,адругие—ееизменять,Однипроцессымогутчитатьинформацию,корректировать.Соответственно,возникаетвсетотжевопрос,какорганизоватькорректнуюсовместнуюгостинице.В даннойсистемесуществуетдва типапроцессовработыкорректировать.с информацией.Однимогутчитатьинформацию,аа другие—изменять,Одни процессыпроцессымогутчитатьинформацию,другие— ееее дляизменять,корректировать.Соответственно,возникаетвсетотжевопрос,какорганизоватькорректнуюСоответственно,возникаетвсетотжевопрос,совместнуюработуэтихпроцессов.Этоозначает,чтовлюбоймоментвременичитатьданныемогутОднипроцессымогутчитатьинформацию,адругие—ееизменять,корректировать.Соответственно,Соответственно, возникаетвозникает всевсе тоттот жеже вопрос,вопрос, каккак организоватьорганизовать корректнуюкорректнуюсовместнуюсовместнуюработуэтихпроцессов.Этоозначает,чтовчитатьданныемогутработуэтихпроцессов.Этоозначает,чтовлюбоймоментвременилюбоеколичествопроцессов-читателей,ноеслипроцесс-писательначалсвоюработу,Соответственно,возникаетвсетотжевопрос,какорганизоватькорректнуюсовместнуюработуработу этихэтих процессов.процессов.
ЭтоЭто означает,означает, чточто вв любойлюбой моментмомент временивремени читатьчитатьданныеданныемогутмогуттолюбоеколичествопроцессов-читателей,ноеслипроцесс-писательначалсвоюработу,толюбоеколичествопроцессов-читателей,новсеостальныепроцессы(и читатели,и писатели)будутблокированынасвоювходев систему.работуэтихпроцессов.Этоозначает, чтов еслилюбоймоментвремениначалчитатьданныемогутлюбоеколичествопроцессов-читателей,ноработу,толюбоеколичествопроцессов-читателей,ноесли процесс-писательпроцесс-писательначалсвоюработу,товсеостальныепроцессы(ичитатели,иписатели)навходевсистему.всеостальныепроцессы(ичитатели,иписатели)будутблокированыЗадачазаключаетсявпланированииработытакойсистемы.любоеколичествопроцессов-читателей,ноеслипроцесс-писательначалсвоюработу,товсе остальныеостальные процессыпроцессы (и(и читатели,читатели, ии писатели)писатели) будутбудут блокированыблокированынанавходевходеввсистему.систему.ЗадачазаключаетсявпланированииработыЗадачазаключаетсявпланированииработытакойсистемы.всеостальныепроцессы(и читатели,и писатели)будутблокированына входе вследующейсистему.
Рассмотримреализациюданнойзадачипри выбраннойЗадачазаключаетсявмодельнуюработытакойсистемы.Задачазаключаетсяв планированиипланированииработытакойсистемы.РассмотриммодельнуюреализациюследующейРассмотриммодельнуюреализациюданнойзадачипривыбраннойЗадачазаключаетсявпланированииработытакойсистемы.стратегии:будемсчитать,чтонаиболееприоритетнымиявляютсячитающиепроцессы.РассмотриммодельнуюреализациюданнойзадачипривыбраннойследующейРассмотрим модельную реализацию данной задачи при выбранной следующейТостратегии:будемсчитать,чтонаиболееприоритетнымипроцессы.Тостратегии:будемчтоприоритетнымиявляютсячитающиеРассмотриммодельнуюреализациюданнойзадачипри читающиевыбраннойследующейестьпроцесс-писательбудетожидатьмомента,когдавсежелающиепроцессы-читателистратегии:будемсчитать,чтонаиболееприоритетнымиявляютсяпроцессы.Тостратегии:будемсчитать,считать,чтонаиболеенаиболееприоритетнымиявляютсячитающиепроцессы.Тоестьпроцесс-писательбудетожидатьмомента,когдавсежелающиепроцессы-читателиестьбудетмомента,стратегии:будемсчитать,что ожидатьнаиболееприоритетнымиявляютсячитающиепроцессы.
Тоесть процесс-писательпроцесс-писательожидатьжелающиепроцессы-читателиокончатсвоидействиявбудетсистемеи покинутее. когдапроцесс-писательбудетожидатьмомента,когда всевсежелающиепроцессы-читателиокончатсвоидействияввсистемесистемепокинутее.окончатсвоиииипокинутокончатсвоидействиясистемеее.естьпроцесс-писательожидатьмомента,окончатсвоидействиядействияввбудетсистемепокинутее. когда все желающие процессы-читатели /*переопределениетипасемафорокончат свои действия в системе и покинут ее.*//*переопределениетипасемафор*//*типатипа/* переопределениепереопределениетипа семафорсемафор */*/typedefint semaphore;typedefintsemaphore;typedefintsemaphore;typedefintдляsemaphore;/*переопределениетипа всемафор*//*семафордоступакритическуюсекцию - контроль за/*семафордлявкритическуюза/*семафордлядоступавкритическуюсекциюконтрольдоступасекцию--- контроль/*семафордлядоступавкритическуюсекциюконтроль зазаtypedefintsemaphore;доступом к «rc» (разделямый ресурс) */доступомк«rc»ресурс)*/доступомк«rc»(разделямыйресурс)(разделямый*/доступомк«rc»(разделямыйресурс)*//*семафор mutexдля доступаsemaphore= 1; в критическую секцию - контроль заsemaphoremutex1;semaphore=== 1;semaphoremutex1;доступомк mutex«rc»(разделямый/*семафордля доступак базересурс)данных */*//*семафордлякбазеданных*/доступа*//*семафордлядоступакбазеданных/*семафордлядоступакбазеданных*/semaphore= 1;semaphore mutexdb = 1;semaphoredb1;semaphoredb===читателей1;semaphoredb1;/*семафордлядоступак внутрибазе данных*//*количествохранилища*//*количествочитателейхранилища*/внутрихранилища*//*количествочитателейхранилища/*количествочитателейвнутрихранилища*/semaphoredb=1;int rc = 0;intrc0;intrc === 0;0; читателей внутри хранилища */intrc/*количествоintrc = 0;/* процесс-читатель*/ /*процесс-читатель*//* процесс-читательпроцесс-читатель */*//* 128/* процесс-читатель */128128128128voidvoidvoid{{{}}}Reader(void)Reader(void)Reader(void)while(true)while(true)while(true){{{down(&mutex); /* получить эксклюзивный доступ к «rc»*/down(&mutex);/* получитьполучитьэксклюзивныйдоступ«rc»*/down(&mutex);/*доступrc = rc + 1; /*ещеоднимэксклюзивныйчитателем больше*/к к«rc»*/rc=rc+1;/*ещеоднимчитателембольше*/rc=rc+1;/*ещеоднимчитателембольше*//* если это первый читатель, нужно заблокировать/*есличитатель,нужно/*если этоэто первыйпервыйчитатель,нужнозаблокироватьзаблокироватьэксклюзивныйдоступк базе */эксклюзивныйдоступкбазе*/эксклюзивныйif(rc == 1) доступ к базе */if(rc==if(rc down(&db);== 1)1)down(&db);down(&db);up(&mutex); /*освободить ресурс rc */up(&mutex);/*освободитьресурс rcup(&mutex);/*освободитьrc*/*/ReadDataBase();/* доступресурск данным*/ReadDataBase();/*доступккданным*/ReadDataBase();/*доступданным*/down(&mutex); /*получить эксклюзивный доступ к «rc»*/down(&mutex);/*получитьэксклюзивныйдоступк к«rc»*/down(&mutex);/*получитьэксклюзивныйдоступ«rc»*/rc == rcrc –– 1;1; /*/*теперьоднимоднимчитателемменьшеменьше*/*/rcтеперьчитателемrc= rc это– 1;был/* последнийтеперь однимчитателемменьше *//*есличитатель,разблокировать/*если/*если этоэто былбыл последнийпоследний читатель,читатель,разблокироватьразблокироватьэксклюзивный доступк кбазебазе данных*/*/эксклюзивныйэксклюзивный доступдоступ к базе данныхданных */if(rc == 0)0)if(rcif(rc ==== 0)up(&db);up(&db);up(&db);up(&mutex);/*освободить разделяемыйресурсресурс rc*/up(&mutex);up(&mutex); /*освободить/*освободить разделяемыйразделяемый ресурсrc*/rc*/UseDataRead(); /*некритическаянекритическая секция*/*/UseDataRead();UseDataRead(); /*/* некритическаясекциясекция */}}} /* процесс-писатель */*//*/* процесс-писательпроцесс-писатель */voidWriter(void)voidvoid Writer(void)Writer(void){{{while(TRUE)while(TRUE)while(TRUE){{{ThinkUpData();/*/*некритическаянекритическаясекциясекция*/*/*/ThinkUpData();ThinkUpData();/*некритическаясекцияdown(&db);/*получитьэксклюзивныйдоступк данным*/down(&db);/*получитьэксклюзивныйдоступданным*/down(&db); /* получить эксклюзивный доступ кк данным*/WriteDataBase();/*записатьданные*/WriteDataBase(); /*/* записатьзаписать данныеданные */*/WriteDataBase();up(&db);/*отдатьэксклюзивныйдоступ*/*/up(&db);/*отдатьэксклюзивныйдоступup(&db); /* отдать эксклюзивный доступ */}}}}}} ВВприведенномциклесвоейработывходитв вприведенномрешениирешениипроцесс-читательпроцесс-читательв вкаждомв каждомкаждомциклесвоейработывходитВприведенномрешениипроцесс-читательциклесвоейработывходитвкритическуюсекцию(опускаетсемафорmutex),увеличиваетсчетчикчитателей,критическуюсекцию(опускаетсемафорmutex),увеличиваетсчетчикчитателей,критическую в секцию(опускаетсемафор mutex),увеличиваетсчетчикчитателей,находящихсялилиононпервымчитателемнаходящихся ввхранилище,хранилище,нана1.1.1.ЗатемЗатемпроверяет,проверяет,чточтоявляетсяявляетсяпервымчитателемнаходящихсяхранилище,наЗатемпроверяет,чтоявляетсялионпервымчитателем(т.е.вв данныймоментонединственныйклиентв вхранилище).Еслида,да,то тоон онопускает(т.е.данныймоментонединственныйклиентхранилище).Еслиопускает(т.е.