Густав Олссон, Джангуидо Пиани - Цифровые системы автоматизации и управления (1087169), страница 106
Текст из файла (страница 106)
Если процессу выделяется десяток переменных на время выполнения небольшого количества ка„знд, без информации о том, какие из них будут действительно использоваться — зто одна ситуация, а если один процесс надолго блокирует доступ к целой базе данных— вто совсем другое дело. Если система структурирована в соответствии с моделью "клиент-сервер" и рабовзвт на основе замкнутых транзакций, то проблему тупиков решить проще. В случае возникновения тупика можно просто отменить транзакцию, а не уничтожать один или несколько процессов.
Нар)пление четвертого запрета чаще всего приводит к тупикам. Если двум процессам требуются ресурсы А и В и первый их запрашивает в порядке А-В, а второй— В-А, то для возникновения тупика достаточно того, чтобы первый процесс был прерван после захвата ресурса А и управление было передано второму, который, в свою очередь, захватывает ресурс В. После этого кажлый процесс будет бесконечно ждать, пока другой не освободит захваченный ресурс.
Четвертое утверждение дает практический способ избежать тупиков. Тупик можно предотвратить, если определен точный порядок (последовательность) запроса ресурсов, соблюдаемый всеми процессами. В приведенном примере зто означает, что "А лолжен быть распределен перед В" и что все процессы строго следуют этому правилу. При этом освобождение ресурсов должно происходить в порядке, обратном их ~ыделению. Этот метод, в принципе, несложно применить при разработке системы реального времени, пока процессы находятся в руках одного или неболыпой группы программистов, но его практическая ценность быстро уменьшается при возрастающем числе ресурсов или разделяемых переменных.
10. 4. Синхронизация процессов — семафоры и собы™я 10.4 1. Семафоры О г Рганизация некоторого порядка исполнения процессов называется синхронизацией й (зупслголыаггол). Синхронизация процессов является основной функцией многоза дачных операционных систем и используется для зашиты ресурсов — с помощью целан ханизма синхронизации упорядочивае~ся доступ к ресурсу. То есть процесс может лол 'учить доступ к ресурсу только после того, как другой процесс освободил его.
Как было ло показано выше, введение дополнительных переменных лля зашиты ресурсов не луч ° чший выход, поскольку зти переменные сами становятся общим ресурсом. Существ во проблемы состоит в том, что опер ц и проверки н изменения значения перемене ациип ио" ой защиты разделены во време~~ ~ быть пРерваны в любой момент. Более и и могут б 436 437 Глава 10. Программирование систем реального ар меня !О 4 Синхронизация процессов — семафоры и события того, непрерывный контроль значений этих переменных представляет собой из „ лици ние затраты процессорного времени.
Семафоры (зетарйоге) — зто основной метод синхронизации, свободиыи от ук ука- занных недостатков. Он, в сущности, является наиболее общим методом синхро„„ за- ции процессов. В классическом определении семафор представляет собой целую перемени значение которой больше нуля, т. е, просто счетчик. Обычно семафор ииициализ, ется в начале программы 0 или 1.
Семафоры, которые могут принимать лишь зва„ ния 0 и 1, называются двоичными. Над семафорами определены две операции з!цпа! и и а1С. Операция з!дпа! увеличивает значение семафора на 1, а вызвавщии, процесс продолжает свою работу. Операция тча!С приводит к различным рсзул, „ там, в зависимости от текущего значения семафора. Если его значение больше О ов уменьшается на 1, и процесс, вызвавший операцию тча!С, может продолжаться. Если семафор имеет значение О, то процесс, вызвавший операцию и а!С, приостанавливает- ся (ставится в очередь к семафору) до тех пор, пока значение соответствующего сема- фора ие увеличится другим процессом с помощью операции з1йпа!. Только после э| о- го операция ив)С приостановленного процесса завершается (с уменьшением значения семафора), а приостановленный процесс продолжается, Очень важно, что проверка и уменьшение значения семафора в операции па!с вы- полияготся за один шаг.
Операционная система не может прервать выполнение опе- рации и асС между проверкой и умеиыпеиием значения. Операция тча!С для семафора имеет такое же функциональное значение, что и инструкция Сезг апг! зеС. Если несколько процессов ждут одного и того же семафора, то после выполнения операции з!йсга! только один из иих может продолжить свое развитие. В зависимости от реализации процессы могут ждать в очереди, упорядоченной лиоо по принципу Е!ЕО (Еггзг)п, Е(гзСОиг — первым вошел, первым вышел), либо в соответствии с при- оритетами, или выбираться случайным образом. Названия управляющей структуры "семафор" и операций з1дпа! и и агС имеют оче- видное мнемоническое значение.
В литературе вместо з)ппа! и па!С применяются ются и другие названия с тем же самым функциональным смыслом. С помощью семафоров проблема защиты ресурсов из раздела 10.3.2 решается пр яп осто ргопгаш зеш ехагпр!е (* зашита ресурса ') чаг Р1: зешарЬоге Ъей!п Р1:= 1; соЪец)п ъ'Ь|!е Сгце до (' бесконечный цикл *) Ъецш (* пропесс А *) ив!С(Р1); (* защищенный ресурс *) з(ппа1(Р1); епг(; (* процесс. А ') тчЫе Сгце с!о (* бесконечный цикл ') Ъей)п (* процесс В ') и'а!С(Р1); (* защищенный ресурс ") з!дпа!( Р1); епг1; (" процесс В ") соепс(; епс!. (* зеп1 еха|пр!е ') тча!С(Р1) па)С(Р2) тчай(Р2) тча!С(Р1) (* защищенный ресурс *) (' защищенный ресурс ') згдпа!(Р1) з!цпа!(Р2) з!япа! ( Р2) з!дпа!(Р1) шпь по-прежиему существует риск возникновения тупика. Если переключение прозессов происходит между двумя операторами па!с первой программы, а вторая профаима вьпголнит свои операторы и а(С, то это приводит к тупику, поскольку каждая рограмма ожидает от другой освобождения семафора.
Проблема состоит в том, что, хотя се "~емафор гарантирует неразрывность проверки и установки значения, ои сам осгается за я защищенным ресурсом. В приведенном примере явно нарушен запрет послеяовательц ельпого выделения, и это приводит к возможности тупиковых ситуаций. Семаф афор может помочь при синхронизации взаимосвязанных деиствий. НапРииер если ли процесс должен работать с данными только после того, как оии считаны ' внешнего его порта, программа может иметь следующий вид; Ргосеьз "Чтение данных" Ргосезз "Обработка данных" «Ь11е Сгпе г(о Ьеп)п ъ агС(баса ача1!аЫе) (' обработка данных ') епй; иЬг!е Сгце г)о Ъеп(п (* чтение новых данных ) з)йпа1(с!ага ача1!аЫе)' епг(; Семафор гарантирует, что два процесса могут получить доступ к защищенному ~есурсу только по очереди.
При этом ие создается никаких дополнительных связей— гсчи один процесс исполняется быстрее другого, то за определенный промежуток времени он будет чаще получать доступ к ресурсу. Процесс вынужден ждать окоичаяяя другого только в том случае, когда последний находится в критической секции.
Одновременно гарантируется и живучесть. Если исполнение процесса по каким- либо причинам прекращается, то, при условии, что он находился вне критической щкции, зто ие мешает развитию другого процесса. Само по себе применение семафоров ие гарантирует предотвращения тупиковых ситуаций. Если два процесса используют семафоры следующим образом 438 Глава 10, Программирование систем Реального вр меня Э 4, Синхронизация процессов — семафоры и события 439 Это решение отделяет операцию ввода данных от их ооработки. На появленв ве во. вых данных указывает значение семафора, отличное от О.
Если существует ме . „ ' ввзц буферизации (промежуточного хранения) новых данных, то процедура обраб сможет получить все данные, даже если они поступают быстрее, чем она в с яннв их принять. В системах реального времени принято отделять процедуры, треб, Шне быстрой реакции, например прием данных с внешнего порта, от других праце .
Для защиты критических секций, в которые по определению в любой момен мени может входить только один процесс, используются двоичные семафоры т называемые шпсех (от тигиа1 ехс1ипап — взаимное исключение). В этом сл „„ нельзя использовать обычные семафоры, так как их значение может превышат 1 „ следовательно, несколько программ могут получить доступ к ресурсу, уменьшая за чения семафора. Операция ядпа! над двоичным семафором всегда устанавливает значение в 1. Операция зка!С уменьшает зто значение с 1 до О и разрешает процес продолжаться дальше. Если семафор имеет значение О, то процесс, выполняюшвв и'а!С, должен ждать до тех пор, пока значение семафора не изменится.
Ошибки синхронизации, связанные с неправильным использованием семафоров, трудно выявляются. Процесс, не выполняющий операцию зча!С, может войти в критическую сскцизо одновременно с другим процессом, что приведет к непредскззуемым результатам. Естественно, нельзя говорить, что такая ошиока выявится при тестировании; она даже может никогда не произойти за все время существования системы. Легче найти противоположную ошибку — отсутствующая операция и!йпа! может в определенный момент привести к остановке по крайней мере одного нз процессов, что достаточно просто обнаружить.
Компилятор не имеет возможности проверить, правильно ли используются сема. форы, т. е. согласованы ли операции зча!с с операциями з!цпа! в других модулях н связаны ли семафоры с соответствующими ресурсами, поскольку это завис ависит от логики алгоритма. Более тога, размещение семафоров в программе, как и дру тих ко манд, произвольно. Забота о проверке правильности программы лежит Р Р . на п огрэммисте. Использование структурного программирования существен венно облегчает решение этой задачи. В заключение отметим, что семафоры являются удобным средств ством высокогз уровня для замещения операции сезс апд зес и помогают избежат ц ть иклов занятоГО ожидания. Однако их неправильное использование может привест ив сти к ситуации ге нок и к тупикам.