Parus16.ru

Парус №16
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Семафоры и мониторы

Семафоры и мониторы

Одним из первых механизмов, предложенных для синхронизации поведения процессов, стали семафоры, концепцию которых описал Дейкстра (Dijkstra) в 1965 году. Семафор представляет собой целую переменную, принимающую неотрицательные значения, доступ любого процесса к которой, за исключением момента ее инициализации, может осуществляться только через две атомарные операции: P (от датского слова proberen – проверять) и V (от verhogen – увеличивать). Классическое определение этих операций выглядит следующим образом:

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

Эта запись означает следующее: при выполнении операции P над семафором S сначала проверяется его значение. Если оно больше 0, то из S вычитается 1. Если оно меньше или равно 0, то процесс блокируется до тех пор, пока S не станет больше 0, после чего из S вычитается 1. При выполнении операции V над семафором S к его значению просто прибавляется 1.

Подобные переменные-семафоры могут с успехом использоваться для решения различных задач организации взаимодействия процессов. В ряде языков программирования они были непосредственно введены в синтаксис языка (например, в ALGOL-68), в других случаях применяются через использование системных вызовов. Соответствующая целая переменная располагается внутри адресного пространства ядра операционной системы. Операционная система обеспечивает атомарность операций P иV, используя, например, метод запрета прерываний на время выполнения соответствующих системных вызовов. Если при выполнении операции P заблокированными оказались несколько процессов, то порядок их разблокирования может быть произвольным, например, FIFO.

Одной из типовых задач, требующих организации взаимодействия процессов, является задача producer-consumer (производитель-потребитель). Пусть два процесса обмениваются информацией через буфер ограниченного размера. Производитель закладывает информацию в буфер, а потребитель извлекает ее оттуда. Грубо говоря, на этом уровне деятельность потребителя и производителя можно описать следующим образом:

Если буфер забит, то производитель должен ждать, пока в нем появится место, чтобы положить туда новую порцию информации. Если буфер пуст, то потребитель должен дожидаться нового сообщения. Как можно реализовать эти условия с помощью семафоров? Возьмем три семафора empty, full и mutex. Семафор fullбудем использовать для гарантии того, что потребитель будет ждать, пока в буфере появится информация.

Семафор empty будем использовать для организации ожидания производителя при заполненном буфере, а семафор mutex – для организации взаимоисключения на критических участках, которыми являются действия put_item и get_item (операции "положить информацию" и "взять информацию" не могут пересекаться, поскольку возникнет опасность искажения информации). Тогда решение задачи выглядит так:

Semaphore mutex = 1;Semaphore empty = N, где N – емкость буфера;Semaphore full = 0;Producer: while(1) < produce_item; P(empty); P(mutex); put_item; V(mutex); V(full); >Consumer: while(1)

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

Хотя решение задачи producer-consumer с помощью семафоров выглядит достаточно элегантно, программирование с их использованием требует повышенной осторожности и внимания, чем, отчасти, напоминает программирование на языке ассемблера. Допустим, что в рассмотренном примере мы случайно поменяли местами операции P, сначала выполняя ее для семафора mutex, а уже затем для семафоров full и empty. Допустим теперь, что потребитель, войдя в свой критический участок ( mutex сброшен), обнаруживает, что буфер пуст. Он блокируется и начинает ждать появления сообщений. Но производитель не может войти в критический участок для передачи информации, так как тот заблокирован потребителем. Получаем тупиковую ситуацию.

В сложных программах произвести анализ правильности использования семафоров с карандашом в руках становится очень непростым занятием. В то же время обычные способы отладки программ зачастую не дают результата, поскольку возникновение ошибок зависит от interleaving’а атомарных операций, и ошибки могут быть трудно воспроизводимы. Для того чтобы облегчить труд программистов, в 1974 году Хоаром (Hoare) был предложен механизм еще более высокого уровня, чем семафоры, получивший название мониторов. Рассмотрим конструкцию, несколько отличающуюся от оригинальной.

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

Здесь функции m1. mn представляют собой функции-методы монитора, а блок инициализации внутренних переменных содержит операции, которые выполняются только один раз: при создании монитора или при самом первом вызове какой-либо функции-метода до ее исполнения.

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

Однако одних только взаимоисключений недостаточно для того, чтобы в полном объеме реализовать решение задач, возникающих при взаимодействии процессов. Нам нужны еще и средства организации очередности процессов, подобно семафорам full и empty в предыдущем примере. Для этого в мониторах было введено понятие условных переменных (condition variables), над которыми можно совершать две операции – wait и signal, до некоторой степени похожие на операции P и Vнад семафорами.

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

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

Читайте так же:
Домашний источник бесперебойного питания

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

Дата добавления: 2017-04-05 ; просмотров: 2882 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Обнаружение и распознавание объектов в Python с помощью OpenCV

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

В этом руководстве мы сосредоточимся только на обнаружении и распознавании объектов изображений в Python с помощью OpenCV. Мы узнаем, как мы можем использовать OpenCV для обнаружения объектов по заданному изображению с помощью программы Python.

Обнаружение объекта

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

С использованием OpenCV

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

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

Каскад Хаара

По сути, каскадная техника Хаара – это подход, основанный на машинном обучении, при котором мы используем множество положительных и отрицательных изображений, чтобы научиться классифицировать изображения. Каскадные классификаторы Хаара считаются эффективным способом обнаружения объектов с помощью библиотеки OpenCV. Теперь давайте разберемся с концепцией положительных и отрицательных изображений, которую мы обсуждали ранее:

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

Требования для обнаружения объектов с помощью Python OpenCV

Мы должны сначала установить некоторые важные библиотеки в нашу систему, поскольку это важное требование для выполнения задач обнаружения объектов. Мы должны установить следующие библиотеки в нашу систему в качестве требования для выполнения обнаружения объектов:

  • библиотека OpenCV

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

Установка библиотеки OpenCV

Когда мы нажимаем клавишу ввода после написания этой команды в терминале, установщик pip в командной строке начнет установку библиотеки OpenCV в нашу систему.

Отображение процесса установки библиотеки OpenCV

Как мы видим, библиотека OpenCV успешно установлена в нашей системе, и теперь мы можем импортировать ее в программу Python, чтобы использовать ее функции.

  • библиотека matplotlib

Matplotlib очень полезна при открытии, закрытии, чтении изображений в программе Python, и поэтому установка этой библиотеки для обнаружения объектов становится важным требованием. Если библиотека matplotlib отсутствует в нашей системе, мы должны использовать следующую команду в нашем терминале командной строки, чтобы установить ее:

Библиотека matplotlib

Когда мы нажимаем клавишу ввода после написания этой команды в терминале, установщик pip в командной строке начнет установку его в нашу систему.

Установка библиотеки matplotlib

Как мы видим, библиотека matplotlib успешно установлена в нашей системе, и теперь мы можем импортировать ее в программу Python, чтобы использовать ее функции для открытия, чтения и т. д. изображений.

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

Реализация в Python

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

Изображение для обнаружения объекта

Открытие изображения

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

Пример 1: Открытие изображения с помощью OpenCV и библиотеки matplotlib в программе Python

Пример 1

Во-первых, мы импортировали библиотеки OpenCV(как cv2) и matplotlib(как plt) в программу, чтобы использовать их функции в коде. После этого мы открыли файл изображения с помощью функции imread() cv2.

Затем мы определили свойства изображения, которое мы открыли в программе, с помощью функций cv2. Затем мы строим подзаголовок изображения, используя функцию subplot() plt и задавая в ней параметры. Наконец, мы использовали функции imshow() и show() модуля plt, чтобы показать изображение на выходе.

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

Распознавание или обнаружение объекта на изображении

Теперь мы будем использовать функцию detectMultiScale() в программе для обнаружения объекта, присутствующего на изображении. Ниже приведен синтаксис использования в коде функции detectMultiScale():

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

Читайте так же:
Восстановить удаленные видеофайлы с компьютера

Пример 2: Обнаружение объекта на изображении с помощью метода detectMultiScale()

Пример 2

После открытия изображения мы импортировали в программу XML-файл каскадного классификатора. Затем мы использовали функцию detectMultiScale() с импортированным каскадным файлом, чтобы определить, присутствует ли объект на изображении или нет.

Мы использовали условие if в программе, чтобы проверить, обнаружен ли объект или нет, и если объект обнаружен, мы выделили часть обнаруженного объекта, используя цикл for с функциями cv2. Выделив на изображении часть обнаруженного объекта, мы отобразили обработанное изображение с помощью функций plt show() и imshow().

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

Мониторинг. 20 советов

Наличие даже самых хороших мониторов не является гарантией отличного мониторинга. К тому же далеко не все могут похвастаться по-настоящему классной контрольной системой. Ниже приведено несколько советов звукорежиссёра Мартина Уолкера касательно создания качественной системы мониторинга.

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

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

На самом деле, создать великолепные миксы можно и на дешевых мониторах, главное – иметь представление о том, каким будет звучание микса на других колонках. В первую очередь нужно убедиться, что Вы получаете самое лучшее звучание в независимости от типа мониторов. И тратить большие деньги тут совсем необязательно.

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

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

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

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

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

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

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

5. Итоговый звук в значительной мере зависит от размещения мониторов. Расстояние между колонками ближнего поля в идеале должно равняться 1,5-1,8 м, впрочем, так же, как и расстояние от мониторов до Ваших ушей. Существует негласное правило, согласно которому колонки в комбинации с Вашей головой должны формировать воображаемый равносторонний треугольник.

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

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

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

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

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

8. Передвигая стул вперед и назад, отрегулируйте угол между колонками. Слишком близкое Ваше расположение спровоцирует получение чрезмерно широкой стереокартины и затруднит работу с центральными моно-составляющими сигнала. И наоборот, чрезмерно далекое расположение вызовет уменьшение ширины стереобазы.

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

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

Читайте так же:
Блок питания системного блока технические характеристики

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

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

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

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

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

15. В случае выполнения всего выше перечисленного для проверки мониторной системы прослушайте еще определенное количество качественно смикшированных записей.

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

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

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

17. Если у Вас нет большого помещения с нейтральной акустикой, не используйте колонки с чрезмерно широким басовым ответом, которые лишь усугубят проблемные места Вашей комнаты и неправильно отразят работу баса.

Для маленьких помещений хорошо подойдет срез низов где-то от 60 Гц. Сильный, мощный бас может, конечно, понравиться Вашим клиентам, но в то же время его использование помешает сфокусироваться на главном – среднечастотном диапазоне. Да и качество микса в этом случае наверняка пострадает.

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

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

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

несовпадение по фазе звуков от пищалок, басового и среднечастотного динамиков.

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

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

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

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

После получения сообщения синхронизирующий процесс проверяет значение счетчика, чтобы выяснить, можно ли совершить требуемую операцию. Операция V всегда может быть выполнена, в то время как операция P может потребовать блокирования процесса. Если операция может быть совершена, то она выполняется, и синхронизирующий процесс посылает подтверждающее сообщение. Если процесс должен быть блокирован, то его идентификатор заносится в очередь блокированных процессов, и подтверждение не посылается. Позднее, когда какой-либо из других процессов выполнит операцию V, один из блокированных процессов удаляется из очереди ожидания и получает соответствующее подтверждение.

Поскольку мы показали ранее, как из семафоров построить мониторы, мы доказали эквивалентность мониторов, семафоров и сообщений.

Заключение

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

1) В некоторых русских изданиях их еще называют переменными состояния.

В случае непрямой адресации мы будем обозначать их так:

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

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

Читайте так же:
Быстрый ввод текста на клавиатуре

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

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

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

Рассмотрим сначала, как реализовать мониторы с помощью семафоров. Для этого нам нужно уметь реализовывать взаимоисключения при входе в монитор и условные переменные. Возьмем семафор mutex с начальным значением 1 для реализации взаимоисключения при входе в монитор и по одному семафору ci для каждой условной переменной. Кроме того, для каждой условной переменной заведем счетчик fi для индикации наличия ожидающих процессов. Когда процесс входит в монитор, компилятор будет генерировать вызов функции monitor_enter, которая выполняет операцию P над семафором mutex для данного монитора. При нормальном выходе из монитора (то есть при выходе без вызова операции signal для условной переменной) компилятор будет генерировать вызов функции monitor_exit, которая выполняет операцию V над этим семафором.

Для выполнения операции wait над условной переменной компилятор будет генерировать вызов функции wait, которая выполняет операцию V для семафора mutex, разрешая другим процессам входить в монитор, и выполняет операцию P над соответствующим семафором ci, блокируя вызвавший процесс. Для выполнения операции signal над условной переменной компилятор будет генерировать вызов функции signal_exit, которая выполняет операцию V над ассоциированным семафором ci (если есть процессы, ожидающие соответствующего события), и выход из монитора, минуя функцию monitor_exit.

Semaphore mutex = 1;

Semaphore ci = 0;

Заметим, что при выполнении функции signal_exit, если кто-либо ожидал этого события, процесс покидает монитор без увеличения значения семафора mutex, не разрешая тем самым всем процессам, кроме разбуженного, войти в монитор. Это увеличение совершит разбуженный процесс, когда покинет монитор обычным способом или когда выполнит новую операцию wait над какой-либо условной переменной.

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

Процесс-получатель с номером i прежде всего выполняет операцию P(mutex), получая в монопольное владение разделяемую память. После чего он проверяет, есть ли в буфере сообщения. Если нет, то он заносит себя в список процессов, ожидающих сообщения, выполняет V(mutex) и P(ci). Если сообщение в буфере есть, то он читает его, изменяет счетчики буфера и проверяет, есть ли процессы в списке процессов, жаждущих записи. Если таких процессов нет, то выполняется V(mutex), и процесс-получатель выходит из критической области. Если такой процесс есть (с номером j), то он удаляется из этого списка, выполняется V для его семафора cj, и мы выходим из критического района. Проснувшийся процесс начинает выполняться в критическом районе, так как mutex у нас имеет значение 0 и никто более не может попасть в критический район. При выходе из критического района именно разбуженный процесс произведет вызов V(mutex).

Как строится работа процесса-отправителя с номером i? Процесс, посылающий сообщение, тоже ждет, пока он не сможет иметь монополию на использование разделяемой памяти, выполнив операцию P(mutex). Далее он проверяет, есть ли место в буфере, и если да, то помещает сообщение в буфер, изменяет счетчики и смотрит, есть ли процессы, ожидающие сообщения. Если нет, выполняет V(mutex) и выходит из критической области, если есть, "будит" один из них (с номером j), вызывая V(cj), с одновременным удалением этого процесса из списка процессов, ожидающих сообщений, и выходит из критического региона без вызова V(mutex), предоставляя тем самым возможность разбуженному процессу прочитать сообщение. Если места в буфере нет, то процесс-отправитель заносит себя в очередь процессов, ожидающих возможности записи, и вызывает V(mutex) и P(ci).

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

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

Самый простой способ такой реализации выглядит следующим образом. Заведем внутри монитора переменную-счетчик, связанный с эмулируемым семафором список блокируемых процессов и по одной условной переменной на каждый процесс. При выполнении операции P над семафором вызывающий процесс проверяет значение счетчика. Если оно больше нуля, уменьшает его на 1 и выходит из монитора. Если оно равно 0, процесс добавляет себя в очередь процессов, ожидающих события, и выполняет операцию wait над своей условной переменной. При выполнении операции V над семафором процесс увеличивает значение счетчика, проверяет, есть ли процессы, ожидающие этого события, и если есть, удаляет один из них из списка и выполняет операцию signal для условной переменной, соответствующей процессу.

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

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

После получения сообщения синхронизирующий процесс проверяет значение счетчика, чтобы выяснить, можно ли совершить требуемую операцию. Операция V всегда может быть выполнена, в то время как операция P может потребовать блокирования процесса. Если операция может быть совершена, то она выполняется, и синхронизирующий процесс посылает подтверждающее сообщение. Если процесс должен быть блокирован, то его идентификатор заносится в очередь блокированных процессов, и подтверждение не посылается. Позднее, когда какой-либо из других процессов выполнит операцию V, один из блокированных процессов удаляется из очереди ожидания и получает соответствующее подтверждение.

Читайте так же:
Зарядное устройство на солнечных батареях solar

Поскольку мы показали ранее, как из семафоров построить мониторы, мы доказали эквивалентность мониторов, семафоров и сообщений.

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

1) В некоторых русских изданиях их еще называют переменными состояния.

studopedia.org — Студопедия.Орг — 2014-2021 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с) .

Монитор пациента

Мониторы пациента — это устройства, реализующие функцию длительного непрерывного контроля (измерения) одного или нескольких параметров, характеризующих воздействие на пациента или его состояние, во время проведения анестезии, искусственной вентиляции, при оказании экстренной медицинской помощи и т.п. Характерной чертой этой группы приборов является: высокая наукоемкость, тенденция к постоянному наращиванию количества измеряемых (контролируемых) параметров с одновременным уменьшением габаритов.

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

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

Мониторы пациента компании Bionet

1. АНЕСТЕЗИОЛОГИЧЕСКИЕ

1.4 Неинвазивное измерение АД

1.5 Инвазивное измерение АД

1.6 Измерение содержания анестетиков

2. ВЕНТИЛЯЦИОННЫЕ

2.4 Вентиляционные параметры

2.5 Неинвазивное измерение АД

2.7 Параметры гемодинамики

3. ПРИКРОВАТНЫЕ

3.3 Неинвазивное измерение АД

Примером анестезиологического монитора можно считать монитор «Митар 01-Р-Д», модульную систему » Viridia M4 «. Из прикроватных мониторов следует обратить внимание на приборы » Hewlett Packard » » Viridia M3 » и » Viridia M24 «, а также монитор-станция «МС-2001-С Данко +». Вентиляционным монитором можно считать монитор «Митар 01-Р-Д» модель 12, «Микролюкс МАРГ 10-01»

Второй возможный вид классификации, чисто технический, по количеству параметров (каналов), измеряемых одним прибором. Классификация по этому признаку приведена на таб. 2

МОНИТОРЫ ПАЦИЕНТА

1. ОДНОКАНАЛЬНЫЕ

1.4 Неинвазивное измерение Ад

2. 2 и 3-х КАНАЛЬНЫЕ

2.1 Пульсоксиметр + Капнометр

2.2 Пульсоксиметр + ЭКГ

2.3 Пульсоксиметр + Капнометр + ЭКГ

2.4 Пульсоксиметр + Измеритель АД

3. МНОГОФУНКЦИОНАЛЬНЫЕ

Измерение «полного» набора

параметров с возможностью

В ряду многофункциональных мониторов пациента наиболее привлекателен «МА-509-Вита». Из одноканальных мониторов можно рекомендовать приборы фирмы » Nihon Kohden » пульсоксиметры, » Drager » газоанализаторы, » BioNet » фетальный монитор, ВНИИМП-ВИТА «Оксипульс-02», монитор артериального давления пациента и частоты пульса МДП-НС-01. Из 2 и 3-х канальных мониторов следует выделить «Митар 01-Р-Д» (ЭКГ, ЧСС и АД), ОП-31А (SpO 2 и Пульс), ОП-32А (SpO 2, Пульс и ФПГ)

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

В данный разряд можно отнести компактный недорогой монитор пациента МС-2001 «Данко».

Остановимся на краткой характеристике и их роли некоторых наиболее используемых в современной медицине жизненно-важных параметров.

Насыщение артериальной крови кислородом (SpO 2) и частоты пульса ( PR) является одним из основных каналов всех мониторов. На настоящее время это наиболее популярный и надежный способ наблюдения за показателями газообмена. Метод измерения — пульсовая оксиметрия.

Анализ содержания кислорода во вдыхаемой газовой смеси (FiO 2). (Оксиметрия). Согласно всем регламентирующим документам должен являться неотъемлемой частью мониторинга. Знание параметра FiO 2 предотвращает «человеческий» фактор возникновения гипоксический смесей (ошибки в подаче кислорода в дыхательный контур), а также для коррекции состава дыхательной смеси, подаваемой пациенту. Используются электрохимические датчики (медленная оксиметрия) и парамагнитные (быстрая оксиметрия).

Содержание CO 2 в дыхательной смеси — капнометрия (особенно содержание CO 2 в конце выдоха), ETCO 2, что практически совпадает с альвеолярным содержанием CO 2. Капнометрия прочно вошла в систему мониторных параметров наряду с пульсоксиметром как способ контроля вентиляции легких. Измерение основано на методе инфракрасной фотометрии.

Анестетики. Метод определения содержания анестетиков в дыхательных смесях, что особенно важно в последнее время при низко поточной анестезии (LOW-FLOW) с использование дорогостоящих анестетиков. Измерение основано на методе инфракрасной фотометрии.

Артериальное давление (АД).Один из основных параметров кровообращения, фигурирующий во всех наркозных картах. Динамика изменения АД в течение операции при правильной интерпретации данных дает достаточно полное представление о работе сердца и о сосудистом тонусе. Метод определения АД (неинвазивно) в автоматических системах в большинстве случаев — осциллометрический.

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

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

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

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector