русс | укр

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

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Взаимодействие процессов


Дата добавления: 2015-01-16; просмотров: 620; Нарушение авторских прав


 

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

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

Рассмотрим случай, когда два клиента А и В совместно пользуются одним и тем же счетом. Пусть на счете было 100 грн. Клиент А хочет добавить до счета 200 грн, а клиент В – 100 грн. Поток ТА соответствует клиенту А, а ТВ – клиенту В. Рассмотрим такую последовательность операций (Вариант 1).

1. Поток ТА считывает Total_Amount, равный 100.



2. Поток ТВ считывает Total_Amount, равный 100.

3. Поток ТА увеличивает Total_Amount на 200 и сохраняет его в глобальной памяти (Total_Amount, равный 300).

4. Поток ТВ увеличивает Total_Amount на 100 и сохраняет его в глобальной памяти. В результате в Total_Amount будет 200 грн, вместо 400 грн.

Теперь рассмотрим другую последовательность операций (Вариант 2).

1. Поток ТА считывает Total_Amount, равный 100, увеличивает его на 200 и записывает в глобальную память.

2. Поток ТВ считывает Total_Amount, уже равную 300, увеличивает его на 100, и записывает в глобальную память.

В результате оба взноса зарегистрированы успешно.

Как видим, результат выполнения потоков зависит от последовательности выполнения операций потоков в системе. Все это приводит к тому, что в одной ситуации код может выполняться правильно, а в другой нет. Такие ситуации, в которых два (и более) потока (процесса) считывают или записывают данные одновременно, и конечный результат зависит от того, какой из них был первым, то есть от соотношения скоростей потоков, называют состоянием гонок, или соревнований (race condition), или состязаний.

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

В случае конкуренции процессов возникают такие три проблемы.

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

В случае блокирования проверяют, не было ли оно уже сделано другими процессами (потоками), а если это так, то этот процесс переходит в ожидание, иначе он совершает блокирование состояния и входит в критическую секцию. После выхода из критической секции процесс снимает блокирование. Так реализуется взаимное исключение, отсюда походит еще одно название блокирования – мьютекс (mutex, сокращение от mutual exclusion). В общем случае мьютексом называют синхронизационный примитив, который не допускает выполнения некоторого фрагмента кода больше как одним процессом. Обычно мьютекс - это переменная, которая может находиться в одном из двух состояний: блокированном (0) или неблокированном состоянии (≠ 0). Мьютекс можно рассматривать как упрощенный семафор, который мы будем рассматривать позже.

Отсюда следует, что решение проблемы состязаний является преобразованием кода в атомарную операцию.

При реализации взаимных исключений возникают дополнительно две проблемы. Одна из них - взаимное блокирование. Рассмотрим два процесса Р1 и Р2 и два ресурса R1 и R2. Предположим, что каждому процессу для выполнения некоторых функций нужен доступ к обоим ресурсам. При этом возможная ситуация: ОС выделяет ресурс R1 процессу Р2, а ресурс R2 – процессу Р1. Процессы будут взаимно заблокированы.

Последняя проблема – голодание. Предположим, что мы имеем три процесса Р1, Р2, Р3, каждому из которых нужный доступ к ресурсу R. Предположим Р1 удерживает ресурс R, а Р2 и Р3 приостановленные в ожидании освобождения ресурса. После выхода Р1 из критического раздела доступ к ресурсу получает Р2 или Р3. Предположим ОС предоставила доступ к ресурсу R процессу Р3. Пока он работает с ресурсом, доступ к ресурсу вновь требуется процессу Р1. В результате может произойти, что ОС предоставит R снова процессу Р1. Потом доступ может снова понадобиться Р3. Таким образом, возможная ситуация, когда процесс Р2 никогда не получит ресурс R.

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

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

 



<== предыдущая лекция | следующая лекция ==>
 | Требования к взаимным исключениям


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.189 сек.