Основные задачи параллельного программирования. Конспект лекций. Степанов Б.М. - 6 стр.

UptoLike

Составители: 

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