Вычислительная математика Учебно-практическая задача Пути достижения параллелизма Моделирование и анализ параллельных вычислений Каскадная схема суммирования

Процессы и ресурсы Учебно-практическая задача

Модели функционирования параллельных программ

Взаимодействие и взаимоисключение процессов

Возможная попытка в восстановлении взаимоисключения может состоять в установке значений управляющих переменных перед циклом проверки занятости ресурса.

 int ResourceProc1 = 0; // = 1 – ресурс занят процессом 1 int 
ResourceProc2 = 0; // = 1 – ресурс занят процессом 2 Process_1() { while (1) { 
// установить, что процесс 1 пытается занять ресурс ResourceProc1 = 1; // повторять, 
пока ресурс занят процессом 2 while ( ResourceProc2 == 1 ); < Использование 
общего ресурса > ResourceProc1 = 0; } } Process_2() { while (1) { // установить, 
что процесс 2 пытается занять ресурс ResourceProc2 = 1; // повторять, пока ресурс 
используется процессом 1 while ( ResourceProc1 == 1 ); < Использование общего 
ресурса > ResourceProc2 = 0; } } 

Представленный вариант восстанавливает взаимоисключение, однако при этом возникает новая проблема – оба процесса могут оказаться заблокированными вследствие бесконечного повторения циклов ожидания освобождения ресурсов (что происходит при одновременной установке управляющих переменных в состояние "занято"). Данная проблема известна под названием ситуации тупика (дедлока или смертельного объятия) и исключение тупиков является одной из наиболее важных задач в теории и практике параллельных вычислений. Более подробное рассмотрение темы будет выполнено далее в пп. 5.5 и 5.6; дополнительная информация по проблеме может быть получена в [6,13].

Попытка 4

Предлагаемый подход для устранения тупика состоит в организации временного снятия значения занятости управляющих переменных процессов в цикле ожидания ресурса.

 
int ResourceProc1 = 0; // =1 – ресурс занят процессом 1 int ResourceProc2 = 0; 
// =1 – ресурс занят процессом 2 Process_1() { while (1) { ResourceProc1 = 1; 
// процесс 1 пытается занять ресурс // повторять, пока ресурс занят процессом 
2 while ( ResourceProc2 == 1 ) { ResourceProc1 = 0; // снятие занятости ресурса 
< временная задержка > ResourceProc1 = 1; } < Использование общего ресурса 
> ResourceProc1 = 0; } } Process_2() { while (1) { ResourceProc2 = 1; // процесс 
2 пытается занять ресурс // повторять, пока ресурс используется процессом 1 while 
( ResourceProc1 == 1 ) { ResourceProc2 = 0; // снятие занятости ресурса < временная 
задержка > ResourceProc2 = 1; } < Использование общего ресурса > ResourceProc2 
= 0; } } 

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

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

Информатика, черчение, математика