В. Столлингс - Операционные системы (1114679), страница 47
Текст из файла (страница 47)
Мы не мажем полагаться на то, что операционная сис к пзст ситуацию и выполнит это условие, поскольку полные требаван рсу могут оказаться не очевидными. Например, во время печати фанд~' вт' .я тобы отдельный процесс имел полный контроль над принтером, иначе на . ~вге можно получить чередование строк двух файлов. Осуп1ествление взаимных исключений создает две дополнительные проблеОднн из них — взаимная блокировка (аеад)ос)с).
Рассмотрим, например, два есса — Р1 и Р2, и два ресурса — В1 и К2. Предположим, что каждому про, ля выполнения части своих функций требуется доступ к обоим ресурсам. Тагдв возможна возникновение слеДУюшей ситУаЦии: апеРаЦионнан система вылявт ресурс В1 процессу Р2, а ресурс В2 — процессу Р1.
В результате каждый щссс ожидает получения одного из двух ресурсов; при этом ни один из ннх не баждает уже имеющийся у него ресурс, ожидая получения второго ресурса „я выполнения функций, требующих наличия двух ресурсов, В результате про- цессы оказываются взаимно заблокированы. Последняя проблема — голодание.
Предположим, что у нас имеются три процесса (Р1, Р2, РЗ), каждому из которых периодически требуется доступ к ре- урсу В. Представим ситуацию, в которой Р1 обладает ресурсом, а Р2 и РЗ при- станавлены в ожидании освобождения ресурса После выхода Р1 из критиче- ского Раздела доступ к ресурсу будет получен одним из процессов Р2 и РЗ. Пусть операционная система предоставила доступ к ресурсу й процессу РЗ. Пока он Работает с ресурсом. доступ к ресурсу вновь требуется процессу Р1.
В результате па Освобождении ресурса процессом РЗ может оказаться, что операционная сис- тема вновь предоставила доступ к ресурсу процессу Р1; тем временем процессу РЗ вновь требуется доступ к ресурсу В. Таким образом, теоретически возможна ситуация, в которой процесс Р2 никогда не получит доступа к требуемому ему ресурсу.
Несмотря на то что никакой взаимной блокировки в этом случае нет. Управление конкуренцией неизбежно приводит к участию операционной сис- темы в этом процессе, поскольку именно она распределяет ресурсы. Кроме того, процессам необходима возможность запрашивать взаимоисключение, такое, как блокировка ресурса перед ега использованием. Любое решение этого вопроса тре- б ет у т поддержки операционной системы, например, такой, как обеспечение воз- можности блокировки.
В листинге 5.1 показан абстрактный механизм взаимаис- ключений. Конструкция рзгЬеаьп ~ Р1, Р2, ..., Рн) означает приостановку выполне- ния асна снавнай программы, запуск параллельного выполнения процедур Р1,Р2,...,РН и ажи ани идание их завершения. По завершении всех запущенных процедур основная программа Р ма продолжает свою работу. В листинге 5.1 параллельно выполняются и праце, ав. Каждый процесс включает (1) критический раздел, работающий с неко- торым Р урсом. идентификатором которого является целое число, и (2) остальную часть и , Р цедуры, в которой нет обращения к ресурсу.
Для обеспечения взаимоис- ключенин им имеются две функции: еп-егсг1с1са1 и ех1ссг1сзса1. Каждая из них принимает Чи . качестве аргумента имя ресурса, являющегося предметом конкуренпроцесс, который пытается войти в критический раздел в то время, и. Любой и ак в нем на~аходится другой процесс, будет приостановлен. ам Остается только рассмотреть механизм, обеспечивающий работу функНцснгз а и ех1ссг1г.' аа1.
Однако пока что мы отложим этот вопрос Риступим и рассмотрению других случаев взаимодействия процессов, н Взаимные исключения бра, .,'ац " ° нмчв вэнимаисключений и = /* величества процессов Часть 2. П 5. и ° Параллельные вычисления: взаимоисключения... а=-а+ о=2 с =- Ь + 1; л); ' 1с ! .
г ае) .:ь,' ь гсг1 ~ ~ са1 ) 11; с~(~1са) )1); ~;стальная часть процедуры '/; ;): ~.а '-'1 ) ) ;;а г," с с; ) г. ~ Р ) К,, ), Р ( Р-. ), -, Р ( Ь';;) ) ' ' а = а Ь = ) ~ 1; Часть 2. 254 Сотрудничество с использованием разделения Случай сотрудничества с использованием разделения охватывает взаимодействующие с другими процессами без наличия явкой инфор" них. Например, несколько процессов могут обращаться к разделяемым' ' ным илн к совместно используемым файлам или базам данных.
Проц использовать и обновлять разделяемые данные без обращения к друг сам, но с учетом того, что последние также могут обращаться к тем же'. Таким образом, процессы должны сотрудничать, для того чтобы гар корректную работу с совместно используемыми данными. Механизм доступом должен гарантировать целостность совместно используемых д Поскольку данные хранятся в ресурсах (устройствах, памяти), в чае также наличествуют проблемы взаимоблокировок, взаимоисключе лодания. Единственное отличие заключается в том, что доступ к данн" осуществляться в двух режимах — чтения и записи, и взаимоисклю должны быть только операции записи.
Однако в данном случае вносится новое требование — согласо. данных. В качестве простейшего примера рассмотрим бухгалтерское:. жение, з котором могут обновляться различные данные, Предполо ".. два элемента данных, а и Ь, должны быть связаны соотношением 4' что любая программа, изменяющая одно значение, обязана изменя' гое, с тем чтобы зто соотношение продолжало выполняться. Теперь Рим следующие два процесса: Если изначально состояние данных согласованно, то каждый отдельности не нарушает согласованности данных. Но что если пр4~':: лельном вычислении будет выполнена такая последовательность д.. которая соблюдает условия взаимоисключений при работе с каждым том данных (а и Ь): После выполнения этой последовательности действий условие а = Ь станонезерным.
Например, если изначально а = Ь:=- 1, то по завершении выл ний а = 4 и Ь = 3. Проблема решается путем объявления критическим раздел м каждой из последовательностей инструкций. Таким образом„значение концепции критических разделов не уменьшается лучае сотрудничества с использованием разделения. Здесь также могут исзозаться рассмотренные нами ранее (см. листинг 5.1) абстрактные функции ).са1 и ех1г.сгьсьса1. В данном случае аргументами этих функций ут быть переменные, файлы или любые другие разделяемые объекты. Более если критические разделы используются для обеспечения целостности данных, то выступающего в роли аргумента Функции определенного ресурса или определенной переменной может и не существовать.
В таком случае мы можем засматривать аргумент как идентификатор, разделяемый между параллельныив процессами и определяющий критический раздел кода, который должен быть защищен взаимным исключением. Сотрудничество с использованием связи В рассмотренных нами случаях каждый процесс имел собственное изолиро- - ванное окружение, не включающее в себя другие процессы. Взаимодействие между процессами было сугубо косвенным, и в обоих случаях наблюдалось совместное использование. В случае конкуренции процессы совместно использовали ' ресурсы, не имея информации о существовании друг друга; в случае сотрудничества процессы, не будучи осведомлены явно о наличии других процессов, тем не менее принимают меры к поддержанию целостности данных. При сотрудничест- 3 зе с использованием связи различные процессы принимают участие в общей раорая и объединяет их.
Связь обеспечивает возможность синхронизации, зли координации, различных действий процессов. Обычн но можно считать, что связь состоит из сообщений определенного ви- Р - тивы для отправки и получения сообщений могут быть предоставлены Аа. При,, ит, ',.-. азыком и программирования или ядром операционной системы. ь Посколь'ольку в процессе передачи сообщений не происходит какого-либо совместного го использования ресурсов, в этом случае сотрудничества взаимо- ., исключ,ни я не требуются (хотя проблемы взаимоблокировок и голодания ос:а' ьны).
В качестве примера взаимоблокировки можно привести Ъиотся актуаль каждыи из д у втуацию, и и к дую о щения от г дру ого процесса. Голодание можно проиллюстрировать сле- Р мером. Рассмотрим три процесса: Р1, Р2 и РЗ. Процесс Р1 мнощим и име о '. тает Ратко пытает ается связаться с процессами Р2 и РЗ, а те, в свою очередь, пысз связаться ссм Р1 и Р2 пост ться с процессом Р1. Может возникнуть ситуация когда пр- он постоянно связываются друг с другом, а процесс РЗ остается Фее к "окированным ольк, .
ожидая связи с процессом Р1. Это не взаимоблокировка ° э процесс Р1 при этом остается активен. ~. П ° Параллельные вычисления: взаимоисключения.. Требования к взаимным исключениям Любая возможность обеспечения поддержки взаимных исключений д соответствовать следующим требованиям. 1. Взаимоисключения должны осуществляться в принудительном пор любой момент времени из всех процессов, имеющих критический для одного и того же ресурса нлп разделяемого объекта, в этом раз жет находиться лишь только один процесс. 2. Процесс, завершающий работу в некритическом разделе, не должен " на другие процессь1. 3.
Не должна Возникать ситуация бесконечного ожидания доступа к кр скому разделу (т.е. не должны появляться взаимоблокировки и голод 4. Когда в критическом разделе нет ни одного процесса, любой процесс, сивший возможность входа в него, должен немедленно ее получить. 5. Не делается никаких предположений о количестве процессов или сительных скоростях работы. 6. Процесс остается в критическом разделе только в течение огран времени. Имеется ряд способов удовлетворения перечисленным условиям.
них является передача ответственности за соответствие требованиям процессу, который должен выполняться параллельно. Таким образом, независимо от того, является ли он системной программой или прило должен координировать свои действия с другими процессами для работ моисключений без поддержки со стороны языка программирования наг ционной системы. Мы можем говорить о таком подходе как о програм тя этот подход чреват большими накладными расходами и возможны ками, чрезвычайно полезно рассмотреть его для лучшего по сложностей, связанных с параллельными вычислениями.
Этот вопрос бу смотрен в разделе 5.2. Другой подход, рассматриваемый в разделе 5.3, в, использование машинных команд специального назначения. Достоинст)( подхода заключается в снижении накладных расходов, но такой подход случае проблему не решает. Еще один подход заключается в предоставя ределенного уровня поддержки со стороны операционной системы программирования. Наиболее важные части такого подхода к решению мы взаимоисключений рассматриваются в разделах 5.4 — 5.6.