Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Многопоточное параллельное программирование.pdf
Скачиваний:
123
Добавлен:
28.06.2014
Размер:
207 Кб
Скачать
☆

Такое планирование, при котором одна или несколько задач должны ожидать до тех пор, пока не произойдет некоторое событие или не создадутся определенные условия, может оказаться довольно непростым для реализации. Если ожидаемое событие или условие, которое должно произойти (или наступить), но в действительности не происходит (или не наступает), то приостановленные задачи будут вечно находиться в состоянии ожидания. Если приостановить одну или несколько задач до наступления события (или условия), которое никогда не произойдет, возникнет ситуация, называемая бесконечной отсрочкой

(indefinite postponement).

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

Проблема №3: взаимоблокировка

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

3).

Рис.3. Ситуация взаимоблокировки.

В ситуации на рис. 3, если другие задачи ожидают получения доступа к ресурсам 1 или 2, а потоки А и В взаимно блокированы, то другие задачи будут ожидать условия, которое никогда не выполнится. При координации параллельно выполняемых задач необходимо помнить, что взаимоблокировка и бесконечная отсрочка — это самые опасные преграды, которые нужно предусмотреть и избежать.

2. Отладка параллельных программ

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

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

воспроизвести точное состояние, в котором находилась среда при тестировании и отладке, необходимо воссоздать каждую задачу, выполнением которой была занята операционная система. При этом должен быть известен режим планирования процессорного времени и точно воспроизведены состояние виртуальной памяти и переключение контекстов. Кроме того, следует воссоздать условия возникновения прерываний и формирования сигналов, а в некоторых случаях — даже рабочую нагрузку сети. При этом нужно понимать, что и сами средства тестирования и отладки оказывают немалое влияние на состояние среды. Это означает, что создание одинаковой последовательности событий для тестирования и отладки зачастую невозможно. Необходимость воссоздания всех перечисленных выше условий обусловлено тем, что они позволяют определить, какие процессы или потоки следует выполнять и на каких именно процессорах. Смешанное выполнение процессов и потоков (в некоторой неудачной "пропорции") часто является причиной возникновения взаимоблокировок, бесконечных отсрочек, "гонки" данных и других проблем. Тот уровень предсказуемости, который имеет место в последовательной модели, недоступен для параллельного программирования. Это заставляет разработчика овладевать новыми тактическими приемами для тестирования и отладки параллельных программ, а также требует от него поиска новых способов доказательства корректности его программ.

Разработка параллельных программ трудоемкий дорогостоящий процесс. Компания Intel, проявляя инициативу в продвижении многопроцессорных архитектур, предложила технологию позволяющую разрабатывать высокопроизводительные многопоточные приложения, увеличивая скорость разработки, за счёт автоматизации таких трудоёмких процессов как обнаружение трудновоспроизводимых ошибок описанных в предыдущем разделе. Также предлагается инструмент, позволяющий оптимизировать многопоточное приложение за счёт исключения "узких" мест.

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

•Intel Thread Checker: Призван помочь программистам определять местонахождение невоспроизводимых ошибок, которые иначе практически очень сложно обнаружить, позволяя сэкономить недели дорогостоящего времени.

•Intel Thread Profiler: Помогает оптимизировать параллельное приложение для достижения оптимальной производительности графически отображая ошибки в синхронизационных объектах и неравномерное распределение нагрузки между нитями, которые приводят к увеличению времени выполнения приложения.

Соседние файлы в предмете Параллельные вычислительные системы