logo
Языки программирования

12.2. Общая память

Самая простая модель параллельного программирования — это модель с общей памятью (см. рис. 12.1). Два или несколько процессов могут обращать­ся к одной и той же области памяти, хотя они также могут иметь свою собст­венную частную, или приватную, (private) память. Предположим, что у нас есть два процесса, которые пытаются изменить одну и ту же переменную в общей памяти:

procedure Main is

N: Integer := 0;

task T1;

task T2;

task body T1 is

begin

for I in 1 ..100 loop N := N+1; end loop;

end T1;

task body T2 is

begin

for I in 1 ..100 loop N := N+1; end loop;

end T2;

begin

null;

end Main;

Рассмотрим теперь реализацию оператора присваивания:

load R1,N Загрузить из памяти

add R1,#1 Увеличить содержимое регистра

store R1,N Сохранить в памяти

Если каждое выполнение тела цикла в Т1 завершается до того, как Т2 вы­полняет свое тело цикла, N будет увеличено 200 раз. Однако каждая задача может быть выполнена на отдельном компьютере со своим набором регист­ров. В этом случае может иметь место следующая последовательность со­бытий:

• Т1 загружает N в свой регистр R1 (значение равно и).

• Т2 загружает N в свой регистр R1 (значение равно «).

• Т1 увеличивает R1 (значение равно п + 1).

• Т2 увеличивает R1 (значение равно и + 1).

• Т1 сохраняет содержимое своего регистра R1 в N (значение равно п + 1).

• Т2 сохраняет содержимое своего регистра R1 в N (значение равно п + 1).

Результат выполнения каждого из двух тел циклов состоит только в том, что N увеличится на единицу. Результирующее значение N может лежать между 100 и 200 в зависимости от относительной скорости каждого из двух процессоров.

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

В теории параллелизма выполнение параллельной программы определя­ется как любое чередование атомарных команд задач. Атомарная команда — это всего лишь команда, которую нельзя выполнить «частично» или пре­рвать, чтобы продолжить выполнение другой задачи. В модели параллелизма с общей памятью команды загрузки и сохранения являются атомарными.

Если говорить о чередующихся вычислениях, то языки и системы, кото­рые поддерживают параллелизм, различаются уровнем определенных в них атомарных команд. Реализация команды должна гарантировать, что она вы­полняется атомарно. В случае команд загрузки и сохранения это обеспечива­ется аппаратным интерфейсом памяти. Атомарность команд высокого уров­ня реализуется с помощью базисной системы поддержки времени выполне­ния и поддерживается специальными командами ЦП.