Ноябрь 2008 1 Параллельная обработка. Ноябрь 20082 Процесс Процесс – совокупность операторов, выполняемых последовательно. Процесс – совокупность операторов,

Презентация:



Advertisements
Похожие презентации
Управление процессами 3.Взаимодействие процессов: синхронизация, тупики 3.1.Разделение ресурсов 3.2.Взаимное исключение Проблемы реализации взаимного.
Advertisements

Управление процессами 3.Взаимодействие процессов: синхронизация, тупики 3.1.Разделение ресурсов 3.2.Взаимное исключение Проблемы реализации взаимного.
Взаимодействующие параллельные процессы
Взаимодействующие параллельные процессы. Параллельные процессы P1 P2 Q1 Q2 Последовательные процессы Логические параллельные процессы P1 P2 Q1Q2 Физические.
Взаимодействие процессов: синхронизация, тупики. Параллельные процессы Параллельные процессы – процессы, выполнение которых хотя бы частично перекрывается.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
6. Средства синхронизации и взаимодействия процессов 6.1. Проблема синхронизации Процессам Процессам часто нужно взаимодействовать друг с другом, например,
Управление процессами Синхронизация процессов и потоков.
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 3 Томский политехнический.
Лекция 6 Множественное распараллеливание на Linux кластере с помощью библиотеки MPI 1. Компиляция и запуск программы на кластере. 2. SIMD модель параллельного.
POSIX Threads. Общая модель Программа Общая память Поток 1 CPU Поток 2 Поток N Потоки – наборы инструкций, исполняющиеся на CPU. Все потоки одной программы.
Модели транзакций Параллельное выполнение транзакций.
ОПЕРАЦИОННЫЕ СИСТЕМЫ Ершов Б.Л. Российский государственный торгово-экономический университет ИВАНОВСКИЙ ФИЛИАЛ Кафедра математики, экономической информатики.
Операционные системы Процессы и потоки Скрипов Сергей Александрович 2009.
Основы операционных систем. Тема 6. Механизмы синхронизации.
Прерывания Определение прерывания Прерывания представляют собой механизм, позволяющий координировать параллельное функционирование отдельных устройств.
Введение в параллельные вычисления. Технология программирования MPI (день второй) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Транксрипт:

Ноябрь Параллельная обработка

Ноябрь Процесс Процесс – совокупность операторов, выполняемых последовательно. Процесс – совокупность операторов, выполняемых последовательно. Параллельная обработка – одновременное выполнение нескольких взаимодействующих процессов. Параллельная обработка – одновременное выполнение нескольких взаимодействующих процессов.

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

Ноябрь Основные понятия Способы взаимодействия процессов (не являются взаимоисключающими): Способы взаимодействия процессов (не являются взаимоисключающими): Связь процессов – обмен данными между процессами Связь процессов – обмен данными между процессами Синхронизация процессов – согласование выполнения процессов Синхронизация процессов – согласование выполнения процессов Взаимное исключение – возможность монопольной обработки данных процессом. Взаимное исключение – возможность монопольной обработки данных процессом. Передача сообщений – основной механизм связи и синхронизации процессов Передача сообщений – основной механизм связи и синхронизации процессов

Ноябрь Средства для реализации параллельной обработки Средства обеспечения работы процессов (описание, создание, завершение, обработка исключений) Средства обеспечения работы процессов (описание, создание, завершение, обработка исключений) Механизмы, реализующие взаимное исключения и синхронизацию для процессов с общей памятью Механизмы, реализующие взаимное исключения и синхронизацию для процессов с общей памятью Механизмы передачи сообщений Механизмы передачи сообщений

Ноябрь Описание процесса process PR(L) is DbeginS end process; PR – имя процесса; L – спецификация параметров (только входные, нет возвращаемого значения) D – спецификация глобальных и локальных данных S – тело процесса Тело процесса – последовательность операторов, описывающих действия, которые должен выполнить процесс.

Ноябрь Оператор вызова процесса init PR1(A1),PR2(A2), …, PRN(An); A1,A2,…,An – списки аргументов (описываются также как аргументы процедур) C точки зрения вызывающего процесса оператор вызова процесса эквивалентен пустому оператору. C точки зрения вызывающего процесса оператор вызова процесса эквивалентен пустому оператору. Процесс завершается когда выполнено его тело и завершены все порожденные им процессы Процесс завершается когда выполнено его тело и завершены все порожденные им процессы Специальный оператор init необходим для обеспечения одновременности запуска нескольких процессов Специальный оператор init необходим для обеспечения одновременности запуска нескольких процессов PR(A);

Ноябрь Оператор прекращения процесса init PR(A)[идентификатор]; init PR(A)[идентификатор]; abort идентификатор; Для прекращения процесса необходим идентификатор Для прекращения процесса необходим идентификатор Проблемы прекращения процесса Проблемы прекращения процесса должны выполняться общие правила завершения процессов, т.е. при завершении процесса должны завершиться и все его потомки должны выполняться общие правила завершения процессов, т.е. при завершении процесса должны завершиться и все его потомки каждым завершаемым процессом должен быть послан сигнал об ошибке всем процессам, с которыми он взаимодействует. каждым завершаемым процессом должен быть послан сигнал об ошибке всем процессам, с которыми он взаимодействует. у завершаемого процесса не остается возможности выполнить какие-либо операции перед завершением. у завершаемого процесса не остается возможности выполнить какие-либо операции перед завершением.

Ноябрь Завершение процесса генерацией исключения raise идентификатор FAILURE raise идентификатор FAILURE Дополнительные обстоятельства завершения процессов Дополнительные обстоятельства завершения процессов в случае, когда процесс во время попытки его прекращения находится в состоянии взаимодействия с другим процессом, выполнение оператора abort и генерация исключения откладывается до завершения взаимодействия. в случае, когда процесс во время попытки его прекращения находится в состоянии взаимодействия с другим процессом, выполнение оператора abort и генерация исключения откладывается до завершения взаимодействия. В процессах, пытающихся взаимодействовать с завершенными или еще не запущенными генерируется предопределенное исключение TASKING_ERROR В процессах, пытающихся взаимодействовать с завершенными или еще не запущенными генерируется предопределенное исключение TASKING_ERROR

Ноябрь Средства для реализации параллельной обработки Средства обеспечения работы процессов (описание, создание, завершение, обработка исключений) Средства обеспечения работы процессов (описание, создание, завершение, обработка исключений) Механизмы, реализующие взаимное исключения и синхронизацию для процессов с общей памятью Механизмы, реализующие взаимное исключения и синхронизацию для процессов с общей памятью Механизмы передачи сообщений Механизмы передачи сообщений

Ноябрь Взаимное исключение Обеспечение монопольного доступа к ресурсу Обеспечение монопольного доступа к ресурсу

Ноябрь process ПОСТАВЩИК is use БУФЕР, ДАННЫЕ : type, ЖДАТЬ : procedure, ВЫРАБОТАТЬ : procedure(out ДАННЫЕ); use B: in out БУФЕР; X: ДАННЫЕ; begindo ВЫРАБОТАТЬ(X); while ПОЛОН(B) do ЖДАТЬ(); ЖДАТЬ(); end do; ЗАНЕСТИ(B,X); end do; end process; process ПОТРЕБИТЕЛЬ is use БУФЕР, ДАННЫЕ : type, ЖДАТЬ : procedure, ПОТРЕБИТЬ : procedure(in ДАННЫЕ); use B: in БУФЕР; X: ДАННЫЕ; begindo while ПУСТ(B) do ЖДАТЬ(); ЖДАТЬ(); end do; ВЫБРАТЬ(B,X); ПОТРЕБИТЬ(X); end do; end process; B: БУФЕР; //Общая память …

Ноябрь Реализация буфера subtype ИНДЕКС is integer range 0..n-1; subtype КОЛИЧЕСТВО is integer range 0..n; type БУФЕР is record buffer: array(ИНДЕКС) of ДАННЫЕ; first : ИНДЕКС; // индекс элемента массива с готовыми данными count : КОЛИЧЕСТВО; // количество элементов в массиве Функции ПОЛОН(B) и ПУСТ(B) возвращают результаты сравнения B.count == n и B.count == 0 соответственно Функция ЗАНЕСТИ : B.buffer((B.first + B.count) % n ) := X; B.count := B.count +1; Функция ВЫБРАТЬ X:= B.buffer(B.first); B.first := (B.first + 1) % n; B.count := B.count -1;

Ноябрь Возникновение ошибки Поставщик B.buffer((B.first + B.count) % n ) := X; B.count := B.count +1; Потребитель X:= B.buffer(B.first); B.first := (B.first + 1) % n; B.count := B.count -1;

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

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

Ноябрь Защита критических интервалов с помощью общей переменной применим для защиты критических интервалов общую переменную door, которая может принимать два значения open и close. Значение close означает, что один из процессов вошел в критический интервал, значение open, что процесс может войти в критический интер­вал. door: (open, close) := open; в начале критический интервал не занят в начале критический интервал не занят

Ноябрь Защита критических интервалов с помощью общей переменной процесс 1 do until(door=open); door:=close; критический интервал 1 door:=open; процесс 2 do until(door=open); door:=close; критический интервал 2 door:=open; Взаимное исключение не гарантируется. Оба процесса одновременно будут проверять значение door, найдут, что door=open, и оба войдут в критические интервалы.

Ноябрь Упорядочение критических интервалов применим для защиты критических интервалов общую переменную переменная turn принимает значение 1, когда процесс 1 может войти в свой критический интервал, и значение 25 когда процесс 2 может войти в свой критический интервал. turn: (1,2) := 1; вначале процесс 1 может войти в критический интервал, а процесс 2 не может вначале процесс 1 может войти в критический интервал, а процесс 2 не может

Ноябрь Упорядочение критических интервалов процесс 1 do until(turn=1); критический интервал 1 turn = 2; процесс 2 do until(turn=2); критический интервал 2 turn = 1; Взаимное исключение гарантируется. Однако такое решение неприемлемо, т.к. процессы должны выполнять свои критические интервалы строго по очереди и замедление первого процесса повлечет за собой и замедление второго.

Ноябрь Защита критических интервалов с помощью двух переменных Пусть каждый процесс имеет свою переменную, которая может принимать значения inside и outside. Значение inside означает, что процесс хочет войти или уже вошел в свой критический интервал, a outside, что процесс находится вне критического интервала. Каждый процесс проверяет значение переменной другого процесса прежде, чем войти в свой критический интервал statel,state2:(inside,outside):= outside; в начале процессы вне критических интервалов в начале процессы вне критических интервалов

Ноябрь Остановка одного процесса вне критического интервала не приведет к остановке второго. Однако если процессы попытаются одновременно войти в критический интервал это приведет к бесконечному ожиданию. Метод неприемлем. Защита критических интервалов с помощью двух переменных процесс 1 state1 := inside; do until(state2=outside); критический интервал 1 state1 := outside; процесс 2 state2 := inside; do until(state1=outside); критический интервал 2 state2 := outside;

Ноябрь Защита критических интервалов с помощью двух переменных (доработанные процессы) процесс 1 do state1 := inside; if state2 = inside then state1 := outside; end if; do until (state2=outside);until(state1=inside); критический интервал 1 state1 := outside; процесс 2 do state2 := inside; if state1 = inside then state2 := outside; end if; do until (state1=outside);until(state2=inside); критический интервал 2 state2 := outside; Метод неприемлем. Аналог постоянных попыток позвонить друг другу.

Ноябрь Защита критических интервалов (комбинированный метод) Каждый процесс имеет связанную с ним переменную, которая индицирует желание процесса войти в критический интервал, и, если оба процесса хотят одновременно это сделать, для разрешения конфликта используется переменная, принимающая в качестве значения номер процесса, который имеет возможность войти в критический интервал. statel,state2:(inside,outside):= outside; turn: (1,2) := 1; в начале процессы вне критических интервалов, приоритет у первого процесса. в начале процессы вне критических интервалов, приоритет у первого процесса.

Ноябрь Защита критических интервалов (комбинированный метод) процесс 1 state1 := inside; if state2 = inside then if turn = 2 then state1 := outside; do until(turn=1); state1 := inside; end if; do until(state2=outside); end if; критический интервал 1 turn := 2; state1 := outside; процесс 2 state2 := inside; if state1 = inside then if turn = 1 then state2 := outside; do until(turn=2); state2 := inside; end if; do until(state1=outside); end if; критический интервал 2 turn := 1; state2 := outside;

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

Ноябрь Двоичные семафоры Двоичный семафор – специальный тип данных. Двоичный семафор – специальный тип данных. Переменные этого типа принимают значения 0 и 1, допустимы неделимые операции V и P. Переменные этого типа принимают значения 0 и 1, допустимы неделимые операции V и P. Операция Р Операция Р - уменьшает значение семафора на 1, если оно отлично от 0; - уменьшает значение семафора на 1, если оно отлично от 0; если значение семафора равно 0, ждет, пока некоторый другой процесс не изменит значения семафора с помощью операции V, а затем уменьшает его если значение семафора равно 0, ждет, пока некоторый другой процесс не изменит значения семафора с помощью операции V, а затем уменьшает его Операция V – присваивает семафору значение 1. Операция V – присваивает семафору значение 1. mutex:semaphore := 1; P(mutex); критический интервал процесса N V(mutex);

Ноябрь Двоичные семафоры Достоинства Механизм семафоров обеспечивает организацию любых схем взаимодействия процессов Механизм семафоров обеспечивает организацию любых схем взаимодействия процессов Широко используется в современных операционных системах Широко используется в современных операционных системах Включен в ряд языков программирования Включен в ряд языков программирования

Ноябрь Двоичные семафоры Недостатки (1) Реализуют механизм низкого уровня Реализуют механизм низкого уровня Бесконтрольное использование семафоров запутывает структуру управления параллельной программы Бесконтрольное использование семафоров запутывает структуру управления параллельной программы При программировании сложных взаимодействий велика вероятность возникновения ошибок, например: При программировании сложных взаимодействий велика вероятность возникновения ошибок, например: можно забыть выполнить операцию Р, в результате к общим ресурсам возможен доступ одновременно нескольких процессов можно забыть выполнить операцию Р, в результате к общим ресурсам возможен доступ одновременно нескольких процессов можно забыть выполнить операцию V, что приведет к тупиковой ситуации можно забыть выполнить операцию V, что приведет к тупиковой ситуации в сложных программах можно забыть воспользоваться семафором в сложных программах можно забыть воспользоваться семафором

Ноябрь Двоичные семафоры Недостатки (2) Нельзя запрограммировать альтернативное действие для случая, когда семафор окажется занятым Нельзя запрограммировать альтернативное действие для случая, когда семафор окажется занятым Нельзя ждать, пока один из нескольких семафоров окажется свободным Нельзя ждать, пока один из нескольких семафоров окажется свободным За правильный доступ к общим ресурсам ответствен процесс, который осуществляет этот доступ. Это противоречит современной технологии программирования, данные и все операции над ними должны объединяться в одну программную единицу За правильный доступ к общим ресурсам ответствен процесс, который осуществляет этот доступ. Это противоречит современной технологии программирования, данные и все операции над ними должны объединяться в одну программную единицу

Ноябрь Простые критические интервалы Критический интервал – конструкция высокого уровня, используемая для реализации взаимного исключения Критический интервал – конструкция высокого уровня, используемая для реализации взаимного исключения with R do S end do; R – общая переменная; S – последовательность операторов критического интервала.

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

Ноябрь Мониторы Монитор это программная конструкция, в которой общие данные объединены вместе с множеством процедур, реализующих доступ к этим данным. Монитор это программная конструкция, в которой общие данные объединены вместе с множеством процедур, реализующих доступ к этим данным. Процедуры монитора обладают следующим свойством: в каждый момент времени только один процесс может активно выполнять мониторную процедуру в данном мониторе. Процедуры монитора обладают следующим свойством: в каждый момент времени только один процесс может активно выполнять мониторную процедуру в данном мониторе. Монитор является конструкцией высокого уровня, позволяющей осуществлять взаимно исключающий доступ к общим ресурсам. Монитор является конструкцией высокого уровня, позволяющей осуществлять взаимно исключающий доступ к общим ресурсам. По своей мощности мониторы эквивалентны семафорам с помощью семафоров и базовых средств языка программирования можно реализовать мониторы и, наоборот, с помощью мониторов смоделировать семафоры. По своей мощности мониторы эквивалентны семафорам с помощью семафоров и базовых средств языка программирования можно реализовать мониторы и, наоборот, с помощью мониторов смоделировать семафоры.

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

Ноябрь Аппаратная поддержка критических интервалов Запрещение прерываний Запрещение прерываний Неделимые операции Неделимые операции

Ноябрь Запрещение прерываний Достоинство Простота и эффективность реализации Простота и эффективность реализации Недостаток Запрещение прерываний может негативно отразиться на работе системы в целом Запрещение прерываний может негативно отразиться на работе системы в целом Не имеет смысла в многопроцессорных системах Не имеет смысла в многопроцессорных системах

Ноябрь Неделимые операции В систему команд современных процессоров входит неделимая команда «проверить и установить» В систему команд современных процессоров входит неделимая команда «проверить и установить» За одну неделимую операцию происходит проверка переменной на равенство нулю и ее установка в единицу. За одну неделимую операцию происходит проверка переменной на равенство нулю и ее установка в единицу. Если переменная была равна нулю, то результат операции – единица, иначе 0. Если переменная была равна нулю, то результат операции – единица, иначе 0.

Ноябрь Средства для реализации параллельной обработки Средства обеспечения работы процессов (описание, создание, завершение, обработка исключений) Средства обеспечения работы процессов (описание, создание, завершение, обработка исключений) Механизмы, реализующие взаимное исключения и синхронизацию для процессов с общей памятью Механизмы, реализующие взаимное исключения и синхронизацию для процессов с общей памятью Механизмы передачи сообщений Механизмы передачи сообщений

Ноябрь Механизмы передачи сообщений Предназначаются для связи между процессами, не имеющими общего адресного пространства. Предназначаются для связи между процессами, не имеющими общего адресного пространства. Должны поддерживаться операционной системой или средой, в которой выполняются процессы. Должны поддерживаться операционной системой или средой, в которой выполняются процессы. Наиболее общие: Наиболее общие: Сопрограммы – возможность приостанавливать и продолжать выполнение одного процесса из другого. Сопрограммы – возможность приостанавливать и продолжать выполнение одного процесса из другого. Рандеву – возможность передачи данных между процессами без дополнительного буфера (сначала ожидается готовность процессов к передачи и приему, после этого осуществляется синхронный обмен) Рандеву – возможность передачи данных между процессами без дополнительного буфера (сначала ожидается готовность процессов к передачи и приему, после этого осуществляется синхронный обмен) Специализированные Специализированные Почтовые ящики – передача сообщений между процессами через посредника. Почтовые ящики – передача сообщений между процессами через посредника. Порты – возможность менять посредника Порты – возможность менять посредника Транспортеры – перенаправление ввода/вывода. Транспортеры – перенаправление ввода/вывода.

Ноябрь Основные понятия для ОС Windows Процесс – экземпляр выполняемой программы, состоит из адресного пространства, в котором располагается код программы и данные. Процесс – экземпляр выполняемой программы, состоит из адресного пространства, в котором располагается код программы и данные. Процессы инертны. Чтобы процесс что-либо выполнил, в нем нужно создать поток (thread). Именно потоки отвечают за выполнение кода программы. Процессы инертны. Чтобы процесс что-либо выполнил, в нем нужно создать поток (thread). Именно потоки отвечают за выполнение кода программы. Процесс содержит как минимум один поток, который создается автоматически при запуске программы и осуществляет ее выполнение. Процесс содержит как минимум один поток, который создается автоматически при запуске программы и осуществляет ее выполнение. Программа может создавать дополнительные потоки по мере необходимости. Программа может создавать дополнительные потоки по мере необходимости. Потоки одного процесса работают в едином адресном пространстве. Потоки одного процесса работают в едином адресном пространстве. На однопроцессорных компьютерах операционная система предоставляет последовательно каждому потоку квант времени, на многопроцессорных компьютерах одновременно может выполняться столько потоков, сколько есть процессоров. На однопроцессорных компьютерах операционная система предоставляет последовательно каждому потоку квант времени, на многопроцессорных компьютерах одновременно может выполняться столько потоков, сколько есть процессоров.

Ноябрь Средства создания потоков в С++ отсутствуют Создание потока с помощью функции Visual Studio C++ Создание потока с помощью функции Visual Studio C++ uintptr_t _beginthread( void(*start_address)(void *), unsigned stack_size, void(*start_address)(void *), unsigned stack_size, void *arglist );

Ноябрь Пример создания потока void ThreadProducerFunc(void *){ …} int _tmain(int argc, _TCHAR* argv[]) {… HANDLE threadProducer =(HANDLE) _beginthread(ThreadProducerFunc,0,NULL); …}

Ноябрь Средства синхронизации процессов в С/С++ отсутствуют Объекты API (используются функции С) Объекты API (используются функции С) Взаимоисключения (mutex) Взаимоисключения (mutex) События (event) События (event) Семафоры (semaphore) Семафоры (semaphore) Критические интервалы (critical section) Критические интервалы (critical section) Защищенный доступ к переменным Защищенный доступ к переменным

Ноябрь Общие особенности Отсутствует какая-либо связь между объектом синхронизации и защищаемым ресурсом Отсутствует какая-либо связь между объектом синхронизации и защищаемым ресурсом Гарантируется, что все операции с объектами синхронизации являются неделимыми. Гарантируется, что все операции с объектами синхронизации являются неделимыми.

Ноябрь Возможные состояния потоков Активен – идет выполнение потока на процессоре. Активен – идет выполнение потока на процессоре. Готов – поток готов к выполнению, ждет предоставления процессорного времени. Готов – поток готов к выполнению, ждет предоставления процессорного времени. Заблокирован – потоку не выделяется процессорное время, он не планируется на выполнение. Заблокирован – потоку не выделяется процессорное время, он не планируется на выполнение.

Ноябрь Взаимоисключения Объекты-взаимоисключения (мьютексы, mutex - от MUTual EXclusion) позволяют координировать взаимное исключение доступа к разделяемому ресурсу. Объекты-взаимоисключения (мьютексы, mutex - от MUTual EXclusion) позволяют координировать взаимное исключение доступа к разделяемому ресурсу. Сигнальное состояние объекта (т.е. состояние "установлен") соответствует моменту времени, когда объект не принадлежит ни одному потоку и его можно "захватить". Сигнальное состояние объекта (т.е. состояние "установлен") соответствует моменту времени, когда объект не принадлежит ни одному потоку и его можно "захватить". Состояние "сброшен" (не сигнальное) соответствует моменту, когда какой-либо поток уже владеет этим объектом. Состояние "сброшен" (не сигнальное) соответствует моменту, когда какой-либо поток уже владеет этим объектом. Доступ к объекту разрешается, когда поток, владеющий объектом, освободит его. Доступ к объекту разрешается, когда поток, владеющий объектом, освободит его. Для того, чтобы объявить взаимоисключение принадлежащим текущему потоку, надо вызвать одну из ожидающих функций. Для того, чтобы объявить взаимоисключение принадлежащим текущему потоку, надо вызвать одну из ожидающих функций. Поток, которому принадлежит объект, может его "захватывать" повторно сколько угодно раз (это не приведет к самоблокировке), но столько же раз он должен будет его освобождать. Поток, которому принадлежит объект, может его "захватывать" повторно сколько угодно раз (это не приведет к самоблокировке), но столько же раз он должен будет его освобождать.

Ноябрь Пример использования Mutex #include #include void main() { DWORD res; // создаем объект-взаимоисключение HANDLE mutex = CreateMutex(NULL, FALSE, "APPNAME-MTX01"); // если он уже существует, CreateMutex вернет дескриптор существующего // объекта, а GetLastError вернет ERROR_ALREADY_EXISTS // в течение 20 секунд пытаемся захватить объект cout<<"Trying to get mutex...\n"; cout.flush(); res = WaitForSingleObject(mutex,20000); if (res == WAIT_OBJECT_0) // если захват удался { // ждем 10 секунд cout<<"Got it! Waiting for 10 secs...\n"; cout.flush(); Sleep(10000); // освобождаем объект cout<<"Now releasing the object.\n"; cout.flush(); ReleaseMutex(mutex); } // закрываем дескриптор CloseHandle(mutex);}

Ноябрь События (Event) Объекты-события используются для уведомления ожидающих потоков о наступлении какого-либо события. Объекты-события используются для уведомления ожидающих потоков о наступлении какого-либо события. Различают два вида событий - с ручным и автоматическим сбросом. Различают два вида событий - с ручным и автоматическим сбросом. Ручной сброс осуществляется функцией ResetEvent. События с ручным сбросом используются для уведомления сразу нескольких потоков. Ручной сброс осуществляется функцией ResetEvent. События с ручным сбросом используются для уведомления сразу нескольких потоков. При использовании события с автосбросом уведомление получит и продолжит свое выполнение только один ожидающий поток, остальные будут ожидать дальше. При использовании события с автосбросом уведомление получит и продолжит свое выполнение только один ожидающий поток, остальные будут ожидать дальше. Функция CreateEvent создает объект-событие. Функция CreateEvent создает объект-событие. SetEvent - устанавливает событие в сигнальное состояние. SetEvent - устанавливает событие в сигнальное состояние. ResetEvent-сбрасывает событие. ResetEvent-сбрасывает событие.

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

Ноябрь Критические интервалы Объект - критический интервал помогает программисту выделить участок кода, где поток получает доступ к общему ресурсу, и предотвратить одновременное использование ресурса. Объект - критический интервал помогает программисту выделить участок кода, где поток получает доступ к общему ресурсу, и предотвратить одновременное использование ресурса. Перед использованием ресурса поток входит в критический интервал (вызывает функцию EnterCriticalSection). Перед использованием ресурса поток входит в критический интервал (вызывает функцию EnterCriticalSection). Если после этого какой-либо другой поток попытается войти в тот же самый критический интервал, его выполнение приостановится, пока первый поток не покинет интервал с помощью вызова LeaveCriticalSection. Если после этого какой-либо другой поток попытается войти в тот же самый критический интервал, его выполнение приостановится, пока первый поток не покинет интервал с помощью вызова LeaveCriticalSection. Похоже на взаимоисключение, но используется только для потоков одного процесса. Похоже на взаимоисключение, но используется только для потоков одного процесса. Существует также функция TryEnterCriticalSection, которая проверяет, занят ли критический интервал в данный момент. Существует также функция TryEnterCriticalSection, которая проверяет, занят ли критический интервал в данный момент. С ее помощью поток в процессе ожидания доступа к ресурсу может не блокироваться, а выполнять какие-то полезные действия. С ее помощью поток в процессе ожидания доступа к ресурсу может не блокироваться, а выполнять какие-то полезные действия.

Ноябрь Критические интервалы //Для использования критического интервала, нужно объявить переменную типа CRITICAL_SECTION CRITICAL_SECTION CS; // Потом эту переменную CS нужно инициализировать (создать критический интервал) __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { InitializeCriticalSection(&CS); } // используем критический интервал в потоке, когда нужно блокировать доступ к данным void __fastcall TMyThread::Execute() { FreeOnTerminate = true; // освободить занятую потоком память по окончании его работы for(int i=0; i<10000; i++) { // -- какие-то сложные вычисления в цикле if(Terminated) break; // прекратить извне поток // блокировать доступ к данным (войти в критический интервал) CRITICAL_SECTION CS; // Потом эту переменную CS нужно инициализировать (создать критический интервал) __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { InitializeCriticalSection(&CS); } // используем критический интервал в потоке, когда нужно блокировать доступ к данным void __fastcall TMyThread::Execute() { FreeOnTerminate = true; // освободить занятую потоком память по окончании его работы for(int i=0; i<10000; i++) { // -- какие-то сложные вычисления в цикле if(Terminated) break; // прекратить извне поток // блокировать доступ к данным (войти в критический интервал) EnterCriticalSection(&Form1->CS); EnterCriticalSection(&Form1->CS);... доступ к глобальным данным // закрыть критический интервал (покинуть критический интервал) // закрыть критический интервал (покинуть критический интервал) LeaveCriticalSection(&Form1->CS); } } // Когда критический интервал становиться не нужен, удаляем его void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { DeleteCriticalSection(&CS); // удалить критический интервал } LeaveCriticalSection(&Form1->CS); } } // Когда критический интервал становиться не нужен, удаляем его void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { DeleteCriticalSection(&CS); // удалить критический интервал }

Ноябрь Защищенный доступ к переменным Существует ряд функций, позволяющих работать с глобальными переменными из всех потоков не заботясь о синхронизации, т.к. эти функции сами за ней следят. Существует ряд функций, позволяющих работать с глобальными переменными из всех потоков не заботясь о синхронизации, т.к. эти функции сами за ней следят. Это функции: Это функции: InterlockedIncrement InterlockedIncrement InterlockedDecrement, InterlockedDecrement, InterlockedExchange, InterlockedExchange, InterlockedExchangeAdd InterlockedExchangeAdd InterlockedCompareExchange InterlockedCompareExchange Например, функция InterlockedIncrement увеличивает значение 32-битной переменной на единицу - удобно использовать для различных счетчиков. Например, функция InterlockedIncrement увеличивает значение 32-битной переменной на единицу - удобно использовать для различных счетчиков.

Ноябрь Вопросы к экзамену Параллельная обработка. Основные понятия. Средства обеспечения работы процессов. Параллельная обработка. Основные понятия. Средства обеспечения работы процессов. Параллельная обработка. Средства реализации взаимных исключений и синхронизации нитей процессов. Параллельная обработка. Средства реализации взаимных исключений и синхронизации нитей процессов. Программное решение проблемы взаимного исключения Программное решение проблемы взаимного исключения Двоичные семафоры Двоичные семафоры Простые критические интервалы Простые критические интервалы Мониторы Мониторы Параллельная обработка. Механизмы передачи сообщений между процессами. Параллельная обработка. Механизмы передачи сообщений между процессами. Средства управления потоками в ОС Windows Средства управления потоками в ОС Windows