Спец часть (часть 2) (3 поток) (2015) (by Кибитова) (1161602), страница 7
Текст из файла (страница 7)
ФункцияTestиспользуетсядлясинхронизациивходавв критическуюсекцию.критическойиспользуетсядлясостояниесинхронизациивхода(помечаемкритическуюсекцию. ВнутриВнутрикритическойсекциименяемфилософаего состояниемHUNGRY).Затем секциименяемсостояниефилософа(помечаемегосостояниемHUNGRY).Затемсекции меняем состояниефилософаего функциясостояниемHUNGRY).предпринимаетсяпопытка начатьесть(помечаем(вызываетсяTest).Функция ЗатемTestпредпринимается(вызываетсяпредпринимается попыткапопытка начатьначать естьесть 127(вызывается функцияфункция Test).Test).
ФункцияФункция TestTest127127127проверяет, что если i-ый философ голоден, а его соседи в данный момент не едят (т.е.правая и леваявилкисвободны),то этот афилософначинаетприемпищи(состояниепроверяет,чтоеслиi-ыйфилософголоден,егососедивв данныймомент нене едятедят (т.е.(т.е.проверяет,чтоеслиi-ыйфилософголоден,аегососедиданныймоментEATING),а еслиегосемафорподнимается(заметим,чтоизначальноэтотсемафорпроверяет,чтоi-ыйфилософголоден,соседивданныймоментедят(т.е.проверяет,чтоеслиi-ыйфилософаегососедивданныймоментнеедят(т.е.проверяет,чтоеслиi-ыйфилософголоден,аегососединеедят(т.е.праваяилеваявилкисвободны),тоэтотфилософначинаетприемпищи(состояниеправая и левая вилкисвободны),то этотфилософ начинаетприемпищи (состояниеинициализированнулем).ПослеэтогомывозвращаемсяобратновфункциюTakeForks,праваяилеваявилкисвободны),тоэтотфилософначинаетприем(состояниеправаяилеваявилкисвободны),философначинаетприемпищи(состояниеправаяилеваявилкисвободны),тоэтотфилософначинаетпищи(состояниеEATING),аа егосемафорподнимается(заметим,чтоизначальноэтот семафорсемафор вEATING),егосемафорподнимается(заметим,чтоизначальноэтоткоторойдалеепроисходитвыходиз критическойсекции(поднимаемсемафорmutex),в аEATING),егосемафорподнимается(заметим,чтоизначальноэтотсемафорEATING),ааа егосемафорподнимается(заметим,чтоизначальносемафорEATING),егонулем).семафорподнимается(заметим,чтоэтотсемафоринициализированПослеэтогообратновв функциюфункциюTakeForks,инициализированнулем).Послеэтого мымы возвращаемсявозвращаемсяобратноTakeForks,взатемопускаемсемафорэтогофилософа.ЕсливнутрифункцииTestфилософуудалосьинициализированнулем).Послеобратновв функциюTakeForks,вававинициализированнулем).ПослеПослеэтогомы возвращаемсявозвращаемсяTakeForks,инициализированнулем).этогомывозвращаемсяобратнофункциюTakeForks,которойдалеепроисходитвыходизкритическойсекции(поднимаемсемафорmutex),которойдалеепроисходитвыходизкритическойсекции(поднимаемсемафорmutex),начатьприемпищи,то семафорподнят,и операцияdownобнулитего,не блокируясь.которойдалеепроисходитвыходсекции(поднимаемmutex),ааакоторойдалеепроисходитпроисходитвыходиз критическойкритическойсекциисемафорmutex),которойдалеевыходизсекции(поднимаемmutex),затемопускаемсемафорфилософа.ЕслифункцииTestфилософуудалосьзатемопускаемсемафор этогоэтогофилософа.Если внутривнутрифункцииTest семафорфилософуудалосьЕслижефункцияTestнеизменитсостояниефилософа,атакженеподниметегосемафор,затемопускаемсемафорэтогофилософа.ЕсливнутрифункцииTestфилософуудалосьзатемопускаемопускаемсемафорэтого философа.философа.внутрифункциифилософуудалосьзатемсемафорэтоговнутрифункцииTestего,удалосьначатьприемтоподнят,операцияdownобнулитего,не блокируясь.блокируясь.начатьприем пищи,пищи,то семафорсемафорподнят, ииЕслиоперацияdownобнулитнетооперацияdown(вфункцииTakeForks)вэтойточкезаблокируетсядотехпор,пока обаначатьприемпищи,тосемафориоперацияdownобнулитего,неблокируясь.начатьприемпищи,тосемафорподнят,иоперацияdownнеблокируясь.начатьприемпищи,тосемафорподнят,операцияdownобнулитего,блокируясь.Еслиего семафор,семафор,Если жеже функцияфункция TestTest нене изменитизменит состояниесостояние философа,философа, аа такжетакже нене подниметподнимет егососеданефункцияосвободятвилки.ЕслижефункцияTestнеизменитсостояниефилософа,ааатакжеегоЕслижефункцияTestнеизменитизменитсостояниефилософа,такжененеподниметподниметегосемафор,семафор,Еслиженефилософа,семафор,тооперацияdown(вTakeForks)вв этойточкедо техтех пор,пор,пока обаобатооперацияdownTest(в функциифункцииTakeForks)этойточке заблокируетсязаблокируетсядопокаВнутрифункцииосвобождениявилокPutForksсначалапроисходитопусканиетооперацияоперацияdown(вфункцииTakeForks)ввв этойточкезаблокируетсядотехпор,покаобаоперацияdown(вфункцииTakeForks)этойточкезаблокируетсятехпор,покаобатоdown(вфункцииTakeForks)этойточкезаблокируетсядопокаобасоседанеосвободятвилки.соседа не освободят вилки.семафораmutex,происходитвходвкритическуюсекцию.Затемменяетсястатуссоседанеосвободятвилки.соседанеосвободятвилки.соседа неосвободятвилки.освобожденияВнутрифункцииопускание Внутрифункцииосвобождения вилоквилок PutForks сначала происходит опусканиеВнутрифункцииосвобождениявилокPutForksсначалапроисходитопусканиефилософа(настатусTHINKING),послечегопроверяемегососедей:еслилюбойиз нихВнутрифункцииосвобождениявилокPutForksсначалапроисходитопусканиеВнутрифункцииосвобождениявилокPutForksсначалапроисходитопусканиесемафораmutex,происходитвходвкритическуюсекцию.Затемменяетсястатуссемафора mutex, происходит вход в критическуюсемафораmutex,происходитвходкритическуюсекцию.Затемменяетсястатуссемафораmutex, происходитпроисходитвходкритическуюсекцию.Затемменяетсястатусбылзаблокированиз-за того,чтонашпроверяемi-ый философзабралеговилку,мыегосемафораmutex,входввв чегокритическуюсекцию.Затемменяетсястатусфилософа(наTHINKING),послеего соседей:философа(на статусстатуслишьTHINKING),послечегоеслилюбойтоизнихфилософа(настатусTHINKING),послечегопроверяемегососедей:еслилюбойизнихфилософа(настатусTHINKING),послечегопроверяемегососедей:еслилюбойизнихразблокируем,ионначинаетприемпищи.Послеэтогопроисходитвыходизкритическойфилософа(на статусTHINKING),послеегозабралсоседей:любойиз нихбыллишьиз-зачтонашi-ый философегоесливилку,то мыегобыл заблокированзаблокированлишьиз-за того,того,что чегонаш проверяембылзаблокированзаблокированлишьиз-затого,чтонашi-ыйфилософзабралеготомыегозаблокированлишьиз-затого,что нашнашi-ыйэтогофилософзабрал выходего вилку,вилку,томыегосекциипутемподъемасемафораmutex.быллишьиз-затого,чтоi-ыйфилософзабралеговилку,томыегоразблокируем,ионначинаетприемпищи.Послепроисходитизкритическойразблокируем, и он начинает прием пищи.
Послеразблокируем,ионначинаетприемпищи.Послеэтогопроисходитвыходизкритическойразблокируем,ионначинаетприемпищи.ПослеэтогопроисходитвыходизкритическойЗаметим,чтоиспользованиемеханизмавзаимоисключающегонахождениявнутриразблокируем,и он начинаетприемпищи. После этого происходит выход из критическойсекциисемафораmutex.секциипутемпутемподъемаподъемасемафораmutex.секциипутемподъемасемафораmutex.секцииЗаметим,путемподъемаподъемасемафораmutex.критическойсекции(засчетсемафораmutex)взаимоисключающегогарантирует, что не нахождениявозникнет ситуация,секциипутемсемафораmutex.чтоиспользованиемеханизмавнутри Заметим, что использование механизмаЗаметим,чтоиспользованиемеханизмавзаимоисключающегонахождениявнутриЗаметим,чтоиспользованиемеханизмавзаимоисключающегонахождениявнутрикогдадвапроцесса,соответствующиесоседнимфилософам,будуттакспланированыЗаметим,что использованиемеханизманахождениявнутринакритическойсекции(заmutex)гарантирует, что не возникнеткритическойсекции(за счетсчет семафорасемафораmutex) взаимоисключающегоситуация,критическойсекции(засчетсемафораmutex)гарантирует,чтоневозникнетситуация,критическойсекции(засчетсемафораmutex)гарантирует,чтоневозникнетситуация,обработкунапроцессоре,чтофункцияTestвкаждомизнихпроработаетиразрешиткритическойсекции соответствующие(за счет семафорасоседнимmutex) гарантирует,не таквозникнетситуация,когдафилософам, чтобудуткогда двадва процесса,процесса,соответствующиесоседнимспланированынакогдадвапроцесса,соответствующиесоседнимфилософам,будуттакнакогдадвадваизпроцесса,соответствующиесоседнимфилософам,будуттак спланированыспланированынакаждомунихначатьприемпищи(что,конечноже,являетсяошибкой).Еслижеэтогокогдапроцесса,соответствующиесоседнимфилософам,будуттакспланированыобработкунапроцессоре,чтофункцияTestвкаждомизнихпроработаетиразрешитобработкунапроцессоре,что функцияфункция TestTest в каждом из них проработает и разрешитнаобработкунапроцессоре,чтообработкунапроцессоре,чтофункцияTestвкаждомизнихпроработаетиразрешитмеханизманебудет,топриемвозможно,чтопроцессов-соседейвходитЕсливиTest,делаеткаждомуизнихначать(что,конечноже, являетсяобработкунапроцессоре,что пищифункцияTestвизкаждомиз них ошибкой).проработаетразрешиткаждомуизнихначатьприемпищи(что,одинконечноже этогоэтогокаждомуизнихначатьприемпищи(что,конечноже,являетсяошибкой).Еслижекаждомуизнихначатьприемпищи(что,конечноже,являетсяошибкой).Еслижеэтогопроверкувозможностьначалаприемапищи.даетистинноезначение,механизманебудет,товозможно,одинизпроцессов-соседейвходитв Test,делаеткаждомуизнанихначатьпищичто(что,конечноже,Проверкаявляется ошибкой).Еслижеэтогомеханизманебудет,топриемвозможно,чтоодинмеханизмабудет,чтоизвходитвв Test,механизма ненебудет, тотоквозможно,возможно,что одинодиниз процессов-соседейпроцессов-соседейвходитTest,делаетделаетуправлениепереходитпервойкомандевнутриif-блока.ПослеэтогопроисходитсменапроверкунаначалаприемаПроверка дает входитмеханизмане возможностьбудет,то возможно,один пищи.из процессов-соседейв Test,делаетпроверкунавозможностьначала чтоприемаистинноезначение,проверкунавозможностьначалаприемапищи.Проверкадаетистинноезначение,проверкунавозможностьначалаприемапищи.Проверкадаетистинноезначение,процессапроцессоре,управлениеполучаетсоседэтогофилософа.Тот тожеделаетуправлениек первойкомандевнутриif-блока.Послеэтогоистинноепроверкунапереходитвозможностьначалаприемапищи.Проверкадаетзначение,управлениепервойкомандевнутрипроисходитсменауправлениепереходитуправление переходитпереходит ккк первойпервой командекоманде внутривнутри if-блока.if-блока.