30
КРСУ, Бишкек, Гайдамако В.В. КРСУ, Бишкек, Гайдамако В.В. Операционные Системы Операционные Системы Взаимодействие процессов Взаимодействие процессов

04 ос взаимодействие_процессов_1

  • Upload
    921519

  • View
    166

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Операционные СистемыОперационные Системы

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

Page 2: 04 ос взаимодействие_процессов_1

Необходимость синхронизацииНеобходимость синхронизации

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

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Page 3: 04 ос взаимодействие_процессов_1

КРСУ. Операционные КРСУ. Операционные Системы. Процессы. Системы. Процессы. Гайдамако В.В. Гайдамако В.В.

Пример отстутствия Пример отстутствия синхронизациисинхронизации

Page 4: 04 ос взаимодействие_процессов_1

Эффект гонок – Эффект гонок – Race Race ConditionCondition

Результат выполнения Результат выполнения последовательности действий последовательности действий зависит не только от алгоритма и зависит не только от алгоритма и входных данныхвходных данных

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Page 5: 04 ос взаимодействие_процессов_1

Критическая секцияКритическая секция

Участок кода программы, при Участок кода программы, при выполнении которого может выполнении которого может возникнуть эффект гоноквозникнуть эффект гонок

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Page 6: 04 ос взаимодействие_процессов_1

КРСУ. Операционные КРСУ. Операционные Системы. Процессы. Системы. Процессы. Гайдамако В.В. Гайдамако В.В.

Синхронизация необходимаСинхронизация необходима

при многопроцессорной обработкепри многопроцессорной обработке

при операции блокировкипри операции блокировки

при прерыванияхпри прерываниях

Page 7: 04 ос взаимодействие_процессов_1

КРСУ. Операционные КРСУ. Операционные Системы. Процессы. Системы. Процессы. Гайдамако В.В. Гайдамако В.В.

Page 8: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Page 9: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Page 10: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Напоминание: требования к Напоминание: требования к алгоритмамалгоритмам

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

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

Если процесс Pi исполняется в своем критическом участке, то не существует Если процесс Pi исполняется в своем критическом участке, то не существует никаких других процессов, которые исполняются в своих соответствующих никаких других процессов, которые исполняются в своих соответствующих критических секциях. Это условие получило название условия взаимоисключения критических секциях. Это условие получило название условия взаимоисключения (mutual exclusion).(mutual exclusion).

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

Не должно возникать бесконечного ожидания для входа процесса в свой Не должно возникать бесконечного ожидания для входа процесса в свой критический участок. От того момента, когда процесс запросил разрешение на вход критический участок. От того момента, когда процесс запросил разрешение на вход в критическую секцию, и до того момента, когда он это разрешение получил, другие в критическую секцию, и до того момента, когда он это разрешение получил, другие процессы могут пройти через свои критические участки лишь ограниченное число процессы могут пройти через свои критические участки лишь ограниченное число раз. Это условие получило название условия ограниченного ожидания (bound раз. Это условие получило название условия ограниченного ожидания (bound waiting).waiting).

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

Page 11: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Напоминание: алгоритмы с Напоминание: алгоритмы с buisy buisy waitwait

Запрет прерыванийЗапрет прерываний

Переменная-замокПеременная-замок (lock variable) (lock variable)

Строгое чередованиеСтрогое чередование (strict (strict alteration)alteration)

Флаги готовностиФлаги готовности

Алгоритм ПетерсонаАлгоритм Петерсона

Алгоритм булочной Алгоритм булочной (Bakery (Bakery Algorithm)Algorithm)

Page 12: 04 ос взаимодействие_процессов_1

КРСУ. Операционные КРСУ. Операционные Системы. Процессы. Системы. Процессы. Гайдамако В.В. Гайдамако В.В.

Планирование процессовПланирование процессов

Планировщик – часть ядра, Планировщик – часть ядра, распределяющая процессорное распределяющая процессорное время между процессамивремя между процессами

Долгосрочное и краткосрочное Долгосрочное и краткосрочное планирование – выбор алгоритма и планирование – выбор алгоритма и «кто следующий»«кто следующий»

Page 13: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Аппаратная поддержка. Аппаратная поддержка. Test-Test-and-Set and-Set 

Test-and-Set (Проверить и присвоить )Test-and-Set (Проверить и присвоить ) О выполнении команды Test-and-Set, осуществляющей проверку значения логической О выполнении команды Test-and-Set, осуществляющей проверку значения логической

переменной с одновременной установкой ее значения в 1, можно думать, как о выполнении переменной с одновременной установкой ее значения в 1, можно думать, как о выполнении функциифункции

int Test_and_Set (int *target){ int Test_and_Set (int *target){ 

int tmp = *target; int tmp = *target; *target = 1; *target = 1; return tmp; return tmp; 

} } 

С использованием этой атомарной команды мы можем модифицировать наш алгоритм для С использованием этой атомарной команды мы можем модифицировать наш алгоритм для переменной-замка, так чтобы он обеспечивал взаимоисключенияпеременной-замка, так чтобы он обеспечивал взаимоисключения

shared int lock = 0; shared int lock = 0; 

while (some condition) { while (some condition) { 

while(Test_and_Set(&lock)); while(Test_and_Set(&lock)); 

critical section critical section 

lock = 0; lock = 0; 

remainder section remainder section 

} } 

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

Page 14: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Аппаратная поддержка. Аппаратная поддержка. SwapSwapvoid Swap (int *a, int *b){ void Swap (int *a, int *b){ 

int tmp = *a; int tmp = *a; *a = *b; *a = *b; *b = tmp; *b = tmp; } } 

Применяя атомарную команду Swap, мы можем реализовать предыдущий алгоритм, введя Применяя атомарную команду Swap, мы можем реализовать предыдущий алгоритм, введя дополнительную логическую переменную key локальную для каждого процесса:дополнительную логическую переменную key локальную для каждого процесса:

shared int lock = 0; shared int lock = 0; int key; int key; 

while (some condition) { while (some condition) { 

key = 1; key = 1; do Swap(&lock,&key); do Swap(&lock,&key); while (key); while (key); 

critical section critical section 

lock = 0; lock = 0; 

remainder section remainder section 

} } 

Page 15: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

РезюмеРезюме1.1. Рассмотренные методы Рассмотренные методы

громоздки и неэлегантныгромоздки и неэлегантны2.2. Процедура ожидания входа в Процедура ожидания входа в

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

3.3. Инверсия приоритетовИнверсия приоритетов

Page 16: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

  Механизмы синхронизации более высокого Механизмы синхронизации более высокого уровня:уровня:

семафоры, семафоры,

мониторы и мониторы и

сообщениясообщения

Page 17: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

СемафорыСемафоры

  Дейкстра (Dijkstra) в 1965 году Дейкстра (Dijkstra) в 1965 году

P(S):пока S == 0 процесс P(S):пока S == 0 процесс блокируется; блокируется; S = S – 1;V(S):S = S + 1;S = S – 1;V(S):S = S + 1;

Page 18: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Решение проблемы producer-Решение проблемы producer-

consumer с помощью семафоровconsumer с помощью семафоров Semaphore mutex = 1;Semaphore mutex = 1;

Semaphore empty = N, где N – Semaphore empty = N, где N – емкость буфера;емкость буфера;Semaphore full = 0; Semaphore full = 0; 

Producer: Producer: 

while(1) { while(1) { 

produce_item; produce_item; P(empty); P(empty); P(mutex); P(mutex); put_item; put_item; V(mutex); V(mutex); V(full); V(full); 

} } 

}}

Semaphore mutex = 1;Semaphore mutex = 1;Semaphore empty = N, где N Semaphore empty = N, где N – емкость буфера;– емкость буфера;Semaphore Semaphore fullfull = 0;  = 0; 

Consumer: Consumer: 

while(1) { while(1) { 

P(full); P(full); P(mutex); P(mutex); put_itemput_item; ; V(mutex); V(mutex); V(empty); V(empty); consume_item; consume_item; 

}}

Page 19: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Проблема Проблема Допустим, что в рассмотренном примере мы Допустим, что в рассмотренном примере мы случайно поменяли местами операциислучайно поменяли местами операции P P, , сначала выполняя ее для семафора сначала выполняя ее для семафора mutexmutex, а , а уже затем для семафоров уже затем для семафоров fullfull и  и emptyempty. . Допустим теперь, что потребитель, войдя в Допустим теперь, что потребитель, войдя в свой критический участок (свой критический участок (mutexmutex сброшен),  сброшен), обнаруживает, что буфер пуст. Он обнаруживает, что буфер пуст. Он блокируется и начинает ждать появления блокируется и начинает ждать появления сообщений. Но производитель не может войти сообщений. Но производитель не может войти в критический участок, для передачи в критический участок, для передачи информации, так как тот заблокирован информации, так как тот заблокирован потребителем. Получаем тупиковую ситуацию. потребителем. Получаем тупиковую ситуацию.

Page 20: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

МониторыМониторы1974 году Хор(Hoare)1974 году Хор(Hoare)

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

monitor monitor_name { monitor monitor_name { 

описание переменных ;описание переменных ;

void m1(...){...void m1(...){...}}void m2(...){...void m2(...){...}}......void mn(...){...void mn(...){...}}

{{

блок инициализации внутрениих переменных ;блок инициализации внутрениих переменных ;

}}

}}

Page 21: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

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

Page 22: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Мониторы, Мониторы, waitwaitОднако одних только взаимоисключений не достаточно Однако одних только взаимоисключений не достаточно для того, чтобы в полном объеме реализовать решение для того, чтобы в полном объеме реализовать решение задач, возникающих при взаимодействии процессов. задач, возникающих при взаимодействии процессов. Нам нужны еще и средства организации очередности Нам нужны еще и средства организации очередности процессов, подобно семафорам процессов, подобно семафорам fullfull и и  emptyempty в  в предыдущем примере. Для этого в мониторах было предыдущем примере. Для этого в мониторах было введено понятие введено понятие условных переменных (condition условных переменных (condition variables)variables), над которыми можно совершать две , над которыми можно совершать две операцииоперации  waitwait и и  signalsignal, до некоторой степени похожие , до некоторой степени похожие на операции на операции PP и  и V V над семафорами. над семафорами. Если функция монитора не может выполняться дальше, Если функция монитора не может выполняться дальше, пока не наступит некоторое событие, она выполняет пока не наступит некоторое событие, она выполняет операцию операцию waitwait над какой-либо условной переменной.  над какой-либо условной переменной. При этом процесс, выполнивший операцию При этом процесс, выполнивший операцию waitwait, , блокируется, становится неактивным, и другой процесс блокируется, становится неактивным, и другой процесс получает возможность войти в монитор. получает возможность войти в монитор.

Page 23: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Мониторы,Мониторы, signal signalКогда ожидаемое событие происходит, другой процесс Когда ожидаемое событие происходит, другой процесс внутри функции-метода совершает внутри функции-метода совершает операцию операцию signal signal над той же самой условной над той же самой условной переменной. Это приводит к пробуждению ранее переменной. Это приводит к пробуждению ранее заблокированного процесса, и он становится активным. заблокированного процесса, и он становится активным. Если несколько процессов дожидались Если несколько процессов дожидались операции операции signalsignal  для этой переменной, то активным для этой переменной, то активным становится только один из них. Что нам нужно становится только один из них. Что нам нужно предпринять для того, чтобы у нас не оказалось двух предпринять для того, чтобы у нас не оказалось двух процессов, разбудившего и пробужденного, процессов, разбудившего и пробужденного, одновременно активных внутри монитора? Хор одновременно активных внутри монитора? Хор предложил, чтобы пробужденный процесс подавлял предложил, чтобы пробужденный процесс подавлял исполнение разбудившего процесса, пока он сам не исполнение разбудившего процесса, пока он сам не покинет монитор. Несколько позже Хансен покинет монитор. Несколько позже Хансен (Hansen) предложил другой механизм: разбудивший (Hansen) предложил другой механизм: разбудивший процесс покидает монитор немедленно после процесс покидает монитор немедленно после исполнения операции исполнения операции signalsignal. Мы будем . Мы будем придерживаться подхода Хансена. придерживаться подхода Хансена.

Page 24: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Producer-consumerProducer-consumer, монитор, мониторmonitor ProducerConsumer { monitor ProducerConsumer { 

condition full, empty; condition full, empty; int count; int count; 

void put() { void put() { if(count == N) full.wait; if(count == N) full.wait; put_item; put_item; count += 1; count += 1; if(count == 1) empty.signal; if(count == 1) empty.signal; } } 

void get() { void get() { if (count == 0) empty.wait; if (count == 0) empty.wait; get_item(); get_item(); count -= 1; count -= 1; if(count == N-1) full.signal; if(count == N-1) full.signal; } } 

{ { count = 0; count = 0; } } 

} } 

Page 25: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Producer-consumerProducer-consumer, , producerproducer

Producer: Producer: 

while(1) { while(1) { 

produce_item; produce_item; ProducerConsumer.put(); ProducerConsumer.put(); 

} } 

Page 26: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Producer-consumerProducer-consumer, , consumerconsumer

Consumer: Consumer: 

while(1) { while(1) { 

ProducerConsumer.get(); ProducerConsumer.get(); consume_item; consume_item; 

} } 

Page 27: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

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

Page 28: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

СообщенияСообщения. Примитивы . Примитивы send-send-receivereceive

Прямая адресация:Прямая адресация:send(P, message)send(P, message)—послать сообщение —послать сообщение message процессу message процессу PP;;receive(Q, message)receive(Q, message) — получить сообщение  — получить сообщение message от процесса message от процесса QQ. .

Косвенная адресация:Косвенная адресация:

send(A, message)send(A, message) — послать сообщение  — послать сообщение message в почтовый ящикmessage в почтовый ящик A A;;receive(A, message)receive(A, message) — получить сообщение  — получить сообщение

message из почтового ящика message из почтового ящика AA..

Page 29: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Сообщения - синхронизацияСообщения - синхронизацияПримитивы Примитивы sendsend  и и receivereceive  уже имеют уже имеют скрытый от наших глаз механизм скрытый от наших глаз механизм взаимоисключения. Более того, в большинстве взаимоисключения. Более того, в большинстве систем они уже имеют и скрытый механизм систем они уже имеют и скрытый механизм блокировки при чтении из пустого буфера и блокировки при чтении из пустого буфера и при записи в полностью заполненный буфер. при записи в полностью заполненный буфер. Реализация решения задачи producer-Реализация решения задачи producer-consumer для таких примитивов становится consumer для таких примитивов становится неприлично тривиальной. Надо отметить, что, неприлично тривиальной. Надо отметить, что, несмотря на простоту использования, несмотря на простоту использования, передача сообщений в пределах одного передача сообщений в пределах одного компьютера происходит существенно компьютера происходит существенно медленнее, чем работа с семафорами и медленнее, чем работа с семафорами и мониторами.мониторами.

Page 30: 04 ос взаимодействие_процессов_1

КРСУ, Бишкек, Гайдамако В.В.КРСУ, Бишкек, Гайдамако В.В.

Эквивалентность семафоров, Эквивалентность семафоров, мониторов и сообщениймониторов и сообщений

Реализация мониторов и Реализация мониторов и передачи сообщений с передачи сообщений с помощью семафоровпомощью семафоров

Реализация семафоров и Реализация семафоров и передачи сообщений с передачи сообщений с помощью мониторовпомощью мониторов

Реализация семафоров и Реализация семафоров и мониторов с помощью мониторов с помощью очередей сообщенийочередей сообщений