
3.4. Параллелизм: время имеет значение
287
бы он совпадал с ре зультатом при каком-нибудь последовательном порядке. Например,
предположим, что общий счет Петра и Павла вначале равен 100 долларам, Петр кладет
на него 40 долларов, а Павел снимает половину имеющихся там денег. При этом по-
следовательное исполнение может привести к значению на счету либо в 70, либо в 90
долларов (см. упражнение 3.38)
39
.
Можно найти и еще более слабые требования для корректного выполнения парал-
лельн ых программ. Программа, имитирующая диффузию (например, поток тепла в объ-
екте), может состоять из большого ч исла процессов, каждый из которых изобража-
ет маленький участок пространства, и которые параллельно обновляют свои значения.
Каждый процесс в цикле изменяет свое значение на среднее между своим собственным
значением и значениями соседей. Этот алгоритм сходится к правильному ответу незави-
симо от порядка, в котором выполняются операци и; нет никакой нужды в ограничен иях
на параллельное использование разделяемых значений.
Упражнение 3.38.
Пусть Петр, Павел и Мария имеют общий счет, на котором вначале лежит 100 долларов. Петр
кладет на счет 10 долларов, одновременно с этим Павел берет 20, а Мария берет половину денег
со счета. При этом они выполняют следующие операции:
Петр: (set! balance (+ balance 10))
Павел: (set! balance (- balance 20))
Мария: (set! balance (- balance (/ balance 2)))
а. Перечислите возможные значения balance после завершения операций, предполагая, что
банковская система требует от транзакций исполняться последовательно в каком-то порядке.
б. Назовите какие-нибудь другие значения, которые могли бы получиться, если бы система
разрешала операциям чередоваться. Нарисуйте временные диаграммы, подобные рис. 3.29, чтобы
объяснить, как возникают такие результаты.
3.4.2. Механизмы управления параллелизмом
Мы убедились, что сложность работы с параллельными процессами происходит из
необходимости учитывать порядок чередования событий в различных процессах. Пред-
положим, к примеру, что у нас есть два процесса, один с упорядоченными событиями
(a, b, c), а другой с упорядоченными событиями (x, y, z). Если эти два процесса испол-
няются параллельно, без каких-либо дополнительных ограничений на чередование со -
бытий, то возможно 20 различных порядков событий, соблюдающих упорядочение их
внутри каждого из процессов:
(a, b, c, x, y, z) (a, x, b, y, c, z) (x, a, b, c, y, z) (x, a, y, z, b, c)
(a, b, x, c, y, z) (a, x, b, y, z, c) (x, a, b, y, c, z) (x, y, a, b, c, z)
(a, b, x, y, c, z) (a, x, y, b, c, z) (x, a, b, y, z, c) (x, y, a, b, z, c)
(a, b, x, y, z, c) (a, x, y, b, z, c) (x, a, y, b, c, z) (x, y, a, x, b, c)
(a, x, b, c, y, z) (a, x, y, z, b, c) (x, a, y, b, z, c) (x, y, x, a, b, c)
39
Более формально это утверждение можно выразить, сказав, что поведение параллельных программ —
недетерминированное (nondeterministic). То есть, они описываются не функциями с одним значением, а функ-
ци ями, чьи результаты являются множествами возможных значений. В разделе 4.3 мы рассмотрим язык для
выражения недетерминистских вычислений.