МЕЖПРОЦЕССОРНОЕ ВЗАИМОДЕЙСТВИЕ. СОСТОЯНИЕ СОСТЯЗАНИЯ




Межпроцессорное взаимодействие состоит из состязания. Процессам часто бывает необходимо взаимодействовать между собой. Напр., выходные данные одного процесса могут потребоваться другому. Поэтому необходимо правильно организовать взаимодействие между ними, не прибегая к прерываниям.

Проблема состоит из трех частей:

1) Передача данных от одного процесса к другому.

2) 2 процесса могут столкнуться между собой в критических ситуациях (напр., каждому из них в определенный момент может потребоваться последний мегабайт оперативной памяти).

3) Согласование действий между процессами: если напр., процесс А должен поставить данные, а процесс В выводить их на печать, то В должен ждать и не начинать печатать, пока не поступят данные от процесса А. два из записанных пунктов относятся и к потокам. Первая проблема (передача данных) в случае потоков проблемой не является, поскольку у потоков общее адресное пространство. Процессы, работающие совместно, могут сообща использовать общее хранилище данных. Каждый из них может считывать оттуда данные и записывать туда информацию. Это так же может быть участок в основной памяти или файл общего доступа.

Пример: сетевой принтер. Если процессу требуется вывести на печать файл - он помещает имя файла в специальный каталог (каталог спулера), другой процесс, демон печати, проверяет наличие файлов, которые нужно распечатать, печатает файл и удаляет его из каталога.

 
 

 

 


Если процессу требуется вывести на печать файл, он перемещает имя файла в специальный каталог – директорий спулера. Другой процесс – демон печати периодически проверяет наличие файлов, которые необходимо напечатать, затем печатает файл и удаляет его имя из каталога. Каталог спулера состоит из сегментов, в каждом из которых может храниться имя файла. Также есть две совместно используемые переменные (out – которая указывает на следующий файл для печати; in – обозначает следующий свободный сегмент). Две переменные можно хранить в одном файле (состоящем из двух слов), который доступен всем процессам. Пусть например, в данный момент сегмент 0 – 3 пуст (эти файлы уже напечатаны), а сегменты 4 – 6 залиты (эти файлы ждут своей очереди на печать). Более или менее одновременно процессы А и В решают поставить свои файлы для печати в очередь. Процесс А считывает значение переменной i и сохраняет ее в собственную локальную переменную next free slot. После этого происходит прерывание по таймеру и процессор переключается на процесс В. Этот процесс в свое время тоже считывает значение переменной i и сохраняет ее в собственную локальную переменную в следующий свободный слот. В данный момент оба процесса считают, что следующий свободный сегмент – 7. Процесс В сохраняет в каталоге спулера имя файла и заменяет переменную i на 8. Затем начинает заниматься своими задачами. Наконец, управление опять переходит к процессу А и он продолжается с того момента, на котором остановился. Он обращается к переменной next free slot и считывает ее значение и записывает в 7 сегмент имя файла (удаляя имя файла, которое туда занесет процесс В). Затем он изменяет значение переменной на 8. После всех этих действий структура каталога не нарушена, но файл процесса не будет напечатан. Замечани е: ситуация, в которой два или более процесса считывают или записывают данные одновременно, и конечный результат зависит от того, какой из них был первым, называется состоянием состязания.

КРИТИЧЕСКИЕ ОБЛАСТИ

Основным решением проблем, связанных с совместным использованием памяти файлов и т.д., является запрет одновременной записи и чтения разделенных (общих) данных более, чем одним процессом. Иными словами, необходимо взаимное исключение. Это означает, что в момент, когда один процесс использует разделяемые данные, другому процессу это делать запрещено. В рассмотренном примере (см.дальше) эта ситуация возникла из-за того, что процесс В начал работу с одной из совместно используемых переменных до того, как процесс А ее закончил. Часть программы, в которой есть обращение к совместно используемым данным, называется критической областью. Если удастся избежать одновременного нахождения процессов в критической области, можно избежать состязаний. Несмотря на то, что это требование исключает состязания, оно не достаточно для правильной совместной работы квазипараллельных процессов и эффективного использования данных. Для этого необходимо выполнение 4-х условий.

1) Два процесса не должны одновременно находиться в критических областях (в программе, но в одно и тоже время).

2) В программе не должно быть предложений о скорости или количестве процессов.

3) Процесс, находящийся в критической области не может, или не должен блокировать другой процесс.

4) Недопустима ситуация, в которой процесс неопределенно долго ждет попадания в критическую область.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: