ВУЗ:
Составители:
6
Во втором случае используют скобки begin end , как обозначающие последова-
тельное выполнение операций, а parbegin и parend (или cobegin и coend) для обозначения па-
раллельно выполняющихся процессов. Тогда приведенный выше граф запишется следую-
щим образом:
P1; cobegin P2; P3 coend ; cobegin P4; cobegin P5; cobegin P6; P7 coend ; P8 coend ; P9
Как отмечалось выше, параллельные процессы могут быть независимыми и взаимо-
действующими. Если процессы P1 и P2 – независимые, то они работают с непересекающими-
ся множествами переменных.
Если множества переменных, с которыми работают процессы P1 и P2 являются пере-
секающимися (общими), то процессы взаимодействующие.
Наличие общих разделяемых переменных приводит к тому, что взаимодействующие
процессы могут влиять на работу друг друга.
Термин “переменная” в этих определениях является не совсем точным. В общих слу-
чаях можно говорить о файлах, областях памяти, и т. д.
Выделим два способа взаимодействия и, в зависимости от них, будем говорить о:
конкурирующих процессах;
о процессах, выполняющих совместную работу.
Как типичный случай для конкурирующих процессов можно привести пример, когда
процессы P1 и P2 хотят выполнить запись блока данных в одну и ту же область памяти. Для
процессов, выполняющих совместную работу характерна ситуация, когда процесс Р1 форми-
рует блок данных и заносит его в буфер, а процесс Р2 читает данные из буфера.
Рассмотрим более подробно пример для конкурирующих процессов. Допустим, что
имеется два параллельных процесса и имеется счётчик, с которым работают эти процессы.
Счётчик должен подсчитывать количество обращений к нему (рис.3).
Процессы считывают состояние счётчика каждый в свою локальную переменную (Счет1 и
Счет2), изменяют ее, а затем записывают значение в счетчик. Один из вариантов работы
приведен в таблице 1. Допустим, что исходное состояние счётчика было 0, следовательно, не
выполняется подсчет количества обращений к переменной Счет, поскольку действия не син-
хронны. То есть, в приведённом примере получается неправильное значение счётчика за счёт
того, что операции записи и чтения разных процессов чередуются. Таким образом, работа
конкурирующих процессов может приводить к неправильному результату.
Рис.3
Таблица 1
Время Процесс Действие Значение
1 ПРОЦЕСС 1 Счет1:=Счетчик 0
2 ПРОЦЕСС 1 Счет1:=Счет+1 1
3 ПРОЦЕСС 2 Счет2:=Счетчик 0
4 ПРОЦЕСС 1 Счетчик:=Счет1 1
5 ПРОЦЕСС 2 Счет2:=Счет2+1 1
6 ПРОЦЕСС 2 Счетчик:=Счет2 1
П
р
оцесс 1 П
р
оцесс 2
Счетчик
Во втором случае используют скобки begin end , как обозначающие последова- тельное выполнение операций, а parbegin и parend (или cobegin и coend) для обозначения па- раллельно выполняющихся процессов. Тогда приведенный выше граф запишется следую- щим образом: P1; cobegin P2; P3 coend ; cobegin P4; cobegin P5; cobegin P6; P7 coend ; P8 coend ; P9 Как отмечалось выше, параллельные процессы могут быть независимыми и взаимо- действующими. Если процессы P1 и P2 – независимые, то они работают с непересекающими- ся множествами переменных. Если множества переменных, с которыми работают процессы P1 и P2 являются пере- секающимися (общими), то процессы взаимодействующие. Наличие общих разделяемых переменных приводит к тому, что взаимодействующие процессы могут влиять на работу друг друга. Термин “переменная” в этих определениях является не совсем точным. В общих слу- чаях можно говорить о файлах, областях памяти, и т. д. Выделим два способа взаимодействия и, в зависимости от них, будем говорить о: конкурирующих процессах; о процессах, выполняющих совместную работу. Как типичный случай для конкурирующих процессов можно привести пример, когда процессы P1 и P2 хотят выполнить запись блока данных в одну и ту же область памяти. Для процессов, выполняющих совместную работу характерна ситуация, когда процесс Р1 форми- рует блок данных и заносит его в буфер, а процесс Р2 читает данные из буфера. Рассмотрим более подробно пример для конкурирующих процессов. Допустим, что имеется два параллельных процесса и имеется счётчик, с которым работают эти процессы. Счётчик должен подсчитывать количество обращений к нему (рис.3). Процессы считывают состояние счётчика каждый в свою локальную переменную (Счет1 и Счет2), изменяют ее, а затем записывают значение в счетчик. Один из вариантов работы приведен в таблице 1. Допустим, что исходное состояние счётчика было 0, следовательно, не выполняется подсчет количества обращений к переменной Счет, поскольку действия не син- хронны. То есть, в приведённом примере получается неправильное значение счётчика за счёт того, что операции записи и чтения разных процессов чередуются. Таким образом, работа конкурирующих процессов может приводить к неправильному результату. Счетчик Процесс 1 Процесс 2 Рис.3 Таблица 1 Время Процесс Действие Значение 1 ПРОЦЕСС 1 Счет1:=Счетчик 0 2 ПРОЦЕСС 1 Счет1:=Счет+1 1 3 ПРОЦЕСС 2 Счет2:=Счетчик 0 4 ПРОЦЕСС 1 Счетчик:=Счет1 1 5 ПРОЦЕСС 2 Счет2:=Счет2+1 1 6 ПРОЦЕСС 2 Счетчик:=Счет2 1 6
Страницы
- « первая
- ‹ предыдущая
- …
- 4
- 5
- 6
- 7
- 8
- …
- следующая ›
- последняя »