Параллельные процессы (потоки). Независимые и асинхронные процессы (потоки). Разделяемые данные. Критические участки.


Параллельные потоки -  это такие потоки, если они существуют одновременно в вычислительной системе, но возможно в разных состояниях. Разделяют на: а) независимые и зависимые; б) синхронные и асинхронные. Последнее означает, что процессам необходимо периодически синхронизироваться и взаимодействовать,  то есть  обмениваться информацией (данными). Использование разделяемых объектов: память, файлы, базы данных. При асинхронном взаимодействии двух или более потоков через общий (разделяемый) объект данных могут возникнуть потери данных. Пример:     Обычно данные между процессами передаются через общее поле памяти, доступное для записи и чтения обоим процессам. Такие данные называются РАЗДЕЛЯЕМЫМИ. Для предотвращения ошибок данных необходимо исключить возможность одновременного обращения обоих процессов к разделяемым данным. Это называется ВЗАИМОИСКЛЮЧЕНИЕМ (MUTual EXclude, mutex). Обеспечение взаимоисключения  является  одной  из   ключевых проблем параллельного (многозадачного, многопоточного) программирования. Взаимоисключение необходимо ТОЛЬКО тогда, когда несколько процессов обращаются к разделяемым данным на запись (изменение данных).  Во время такого обращения говорят,  что процесс находится в своем КРИТИЧЕСКОМ УЧАСТКЕ.  Если один из процессов находится в своем критическом участке, другие процессы могут продолжать свое выполнение, но без входа в их собственные критические участки. Способы взаимоисключения: 1) алгоритм Деккера (1960-й год). 2) использование специальных команд (неделимых команд, например, test_and_set(x,y), разновидность test_and_clr(…)). 3) предоставление ОС некоторого универсального объекта, например семафора (semaphore). Классические средство: семафор Дейкстры.