Разное

Целочисленные семафоры: Что такое семафоры в программировании и зачем они нужны

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

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

За десятилетия, прошедшие после изобретения семафоров, были предложены различные средства синхронизации, более приспособленные для различных типовых задач. Рассмотрим некоторые из них.

        1. Целочисленные семафоры

В упомянутой работе Дейкстры, помимо двоичных семафоров, принимающих значения 0 и 1, был рассмотрен также более общий тип семафоров со значениями на интервале от 0 до некоторого N. ФункцияP(S) уменьшает положительное значение семафора на 1, а при нулевом значении переходит в ожидание, как и в случае двоичного семафора. ФункцияV(S) увеличивает значение семафора на 1, но не болееN.

Область применения целочисленных семафоров несколько иная, чем у двоичных. Целочисленные семафоры применяются в задачах выделения ресурсов из ограниченного запаса. Величина Nхарактеризует общее количество имеющихся единиц ресурса, а текущее значение переменной – количество свободных единиц. При запросе ресурса процесс вызывает функциюV(S), при освобождении –P(S).

Для целочисленных семафоров иногда удобно использовать модифицированную функцию V(S,k), вторым параметром которой является число одновременно запрашиваемых единиц ресурса. Такая функция блокирует процесс, если значение семафора меньшеk.

        1. Семафоры с множественным ожиданием

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

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

Функция множественного ожиданияP(S1,S2, …Sn) позволяет указать в качестве параметров несколько двоичных семафоров (или массив семафоров). Если хотя бы один из семафоров свободен, функция занимает его, в противном случае она ждет освобождения любого из семафоров.

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

        1. Сигналы

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

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

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

Подумайте самостоятельно, как это можно сделать.

НОУ ИНТУИТ | Лекция | Заключение

< Дополнительный материал 2 || Лекция 10: 12345678

Аннотация: Подводится итог курса, кратко суммируются полученные знания.

Ключевые слова: программирование, POSIX, мобильное программирование, поток управления, процесс, атрибутный объект, ПО, исключение, функция, планирование, политика планирования, операции, синхронизация, синхронизация потоков, потоки управления, общее адресное пространство, мьютекс, блокировка чтение-запись, спин-блокировка, барьер, разделяемые данные, переменная условия, предикат, поток, доступ на чтение, доступ, запись, множества, захват, критический интервал, ожидание, разделы, часы, таймер, средство межпроцессного взаимодействия, рекомендательный интерфейс, очередь, очереди сообщений, разделяемый сегмент памяти, класс, время доступа, объект, компонент, трассировка, база данных учетной информации о пользователях, поиск, сортировка, пользовательский контекст, вещественная арифметика, обход файловой иерархии, контроль переполнения, защитная область, операционная система, атрибут потока управления, атрибут, маска блокированных сигналов, пространство, ключ, инициализирующие действия, индивидуальные данные потока управления, fork, маска сигналов, среда вещественной арифметики, выход, терминирование извне, тип терминирования, стек обработчиков завершения, деструктор индивидуальных данных, терминирование потока управления, динамическое обособление, частичный результат, код ошибки, приложение, верхняя грань приоритетов выполнения, разделяемая переменная, цикла, разрушение переменной условия, интеллектуальное средство синхронизации, многопроцессорная конфигурация с разделяемой памятью, переключение контекста, расходы, установка спин-блокировки, снятие спин-блокировки, средство синхронизации, устройство управления памятью, файловый дескриптор, идентификатор группы, параметр планирования, контроль, уведомление о событии, extension, RTS, жизненный цикл, значение, генерация сигнала, вызов функции, сигнал реального времени, доставка сигнала, альтернативный стек, обработка сигналов, нелокальный переход, открытие очереди, отправка сообщения в очередь, атрибут очереди, контроль прав доступа, отправка, приоритет сообщения, установка атрибута очереди, верхняя граница размера сообщений, дескриптор, семафор реального времени, механизм синхронизации, ресурс, значение семафора, именованный семафор, неименованный семафор, освобождение семафора, бинарный семафор, объект в разделяемой памяти, объект в типизированной памяти, адресное пространство процесса, отображение, отмена отображения, согласование состояния оперативной и долговременной памяти, интерфейс, пул памяти, адрес, поведение приложения, отмена удержания, место, длительность ожидания, процессор, процессорное время, опрос, опрос параметров планирования, циклическое планирование, операции передачи данных, постановка запроса в очередь, список запросов, асинхронный ввод/вывод, sync, оптимизация работы с файлами, случайный доступ, однократный доступ, конфигурационные константы, байт, поток трассировки, программа, пользовательское событие, системное событие, журнал трассировки, правила обработки ситуации заполнения, приостановка трассировки, создание потока трассировки, атрибутный объект потоков трассировки, поведенческий атрибут, статус потока трассировки, опрос атрибутов потока трассировки, идентификатор типа события, имя события, завершение работы, статус ошибки, подкласс, контекст, стек выполнения, управляющие, режим округления, Типовая, псевдотерминал

Основные понятия и объекты, рассматриваемые в курсе

intuit.ru/2010/edi»>Настоящий курс является продолжением курса [1]. В принципе, разделение единой темы «Программирование в стандарте POSIX» на две части носит скорее технический, чем принципиальный характер, однако у второй части есть свой стержень – мобильное программирование приложений реального времени.

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

Для задания характеристик потоков управления (и других рассматриваемых в настоящем курсе сущностей) в стандарте POSIX-2001 активно используются атрибутные объекты. Атрибутный объект – это шаблон, по которому можно создать произвольное число потоков с одинаковыми характеристиками, избегая их многократной спецификации.

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

Для приложений реального времени исключительно важно и активно используется понятие планирования.

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

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

Операции с потоками управления можно подразделить на две группы:

  • создание, терминирование, выполнение других управляющих операций;
  • синхронизация.

В таком порядке они и рассматриваются в настоящем курсе.

При анализе средств синхронизации потоков управления следует учитывать, что, по сравнению с процессами, потоки управления характеризуются двумя особенностями:

  • на порядок меньшими накладными расходами на обслуживание;
  • существенно более тесным взаимодействием в общем адресном пространстве.

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

К числу таких средств, присутствующих в стандарте POSIX-2001, принадлежат мьютексы, переменные условия, блокировки чтение-запись, спин-блокировки и барьеры.

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

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

Блокировки чтение-запись (много читателей или один писатель) в каждый момент времени позволяют нескольким потокам управления одновременно иметь к данным доступ на чтение или только одному потоку – доступ на запись.

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

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

Средства синхронизации могут использоваться для достижения двух существенно разных целей:

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

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

Тема » мобильное программирование приложений реального времени» разбита в курсе на следующие разделы:

  • одношаговое порождение процессов ;
  • сигналы реального времени;
  • часы и таймеры ;
  • средства межпроцессного взаимодействия;
  • объекты в памяти;
  • удержание процессов в памяти;
  • приоритетное планирование ;
  • асинхронный ввод/вывод;
  • рекомендательные интерфейсы.

Одношаговое порождение процессов основано на применении функций posix_spawn() и posix_spawnp().

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

Основные понятия, ассоциированные с часами и таймерами, были рассмотрены в курсе [1]. В настоящем курсе анализируются необязательные элементы стандарта POSIX-2001, специфичные для реального времени.

В качестве средств межпроцессного взаимодействия в реальном времени в стандарт POSIX-2001 включены очереди сообщений, семафоры и разделяемые сегменты памяти (см. также курс [1], где детально анализируется другой класс средств межпроцессного взаимодействия с аналогичными названиями).

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

Достижению той же цели – минимизации времени (а также унификации) доступа – служит механизм объектов в памяти.

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

Средства асинхронного ввода/вывода позволяют прикладным процессам ставить в очередь команды ввода/вывода данных и получать асинхронные уведомления о завершении выполнения этих команд.

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

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

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

Применительно к приложениям реального времени трассировка помогает достичь по крайней мере трех целей:

  • оптимизировать структуру приложения на основе анализа трассировочных данных;
  • ru/2010/edi»>отладить приложение;
  • выявить причину аварийного завершения работы приложения.

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

Таковы основные понятия и объекты, ставшие предметом рассмотрения в настоящем курсе.

Дальше >>

< Дополнительный материал 2 || Лекция 10: 12345678

java — Разница в понимании между счетчиком семафора и целочисленным параметром методов семафора?

спросил

Изменено 8 лет, 9 месяцев назад

Просмотрено 518 раз

Я запутался со счетчиком семафора и формальным параметром для методов семафора, таких как

приобретение (целочисленный параметр) , приобретениеUninterptbly (целочисленный параметр) , выпуск (целочисленный параметр) .

Что произойдет, если параметр больше счетчика семафора и наоборот.
Было бы очень полезно, если бы кто-нибудь объяснил на примере реального времени.

  • java
  • многопоточность
  • семафор

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

Если на семафоре вызывается release(int Allows) , заданное количество разрешений возвращается семафору. Если потоки ожидают разрешений (из-за блокировки получения вызовов), они пробуждаются и пытаются получить запрошенное количество разрешений.

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

Обычно aquire(int) прерывается, поэтому поток t , ожидающий в aquire(int) , может быть прерван вызовом t.interrupt() из другого потока. В этом случае блокирующий вызов aquire завершается InterruptedException . Если вместо приобрести используется метод aquireUninterruptably , это НЕ работает.

Например, взгляните на JavaDoc: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

Одна вещь о максимальном количестве разрешений: Семафор инициализируется с определенным количеством доступных разрешений, но это не означает, что это максимальное количество разрешений, которое он может иметь. Теоретически поток может освободить больше разрешений, чем он получил (или даже освободить разрешения, не вызывая приобретите сначала ). Таким образом, разрешено вызывать aquire(int) с большим количеством разрешений, чем было инициализировано семафором, и вызывать release(int) , возвращая больше разрешений, чем когда-либо было у семафора. Семантика таких вызовов зависит от программиста…

0

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Разница между семафором и монитором

следующий → ← предыдущая

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

Что такое семафор?

Семафор — это целочисленная переменная, которая позволяет многим процессам в параллельной системе управлять доступом к общему ресурсу, подобному многозадачной ОС. это целочисленная переменная (S) , и она инициализируется количеством ресурсов в системе. Методы wait() и signal() являются единственными методами, которые могут изменять значение семафора (S) . Когда один процесс изменяет значение семафора, другие процессы не могут изменять значение семафора одновременно.

Кроме того, операционная система разделяет семафоры на два типа:

  1. Счетный семафор
  2. Двоичный семафор

Счетный семафор

В Counting Semaphore значение семафора S инициализируется количеством ресурсов в системе. Когда процессу необходимо получить доступ к общим ресурсам, он вызывает метод wait() семафора, уменьшая его значение на единицу. Когда общий ресурс освобождается, он вызывает метод signal() , увеличивая значение на 1 .

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

Двоичный семафор

Семафор имеет значение от 0 до 1 в двоичном семафоре. Это сравнимо с блокировкой мьютекса, за исключением того, что мьютекс — это метод блокировки, а семафор — это метод сигнализации. Когда процессу необходимо получить доступ к двоичному ресурсу семафора, он использует wait() Метод для уменьшения значения семафора с 1 до 0 .

Когда процесс освобождает ресурс, он использует метод signal() для увеличения значения семафора до 1 . Когда значение семафора равно 0 и процессу необходимо использовать ресурс, он использует метод wait() для блокировки до тех пор, пока текущий процесс, использующий ресурс, не освободит его.

Синтаксис:

Синтаксис семафора может использоваться как:

// Ожидание операции подождите (Семафор S) { пока (S

Преимущества и недостатки семафора

Различные преимущества и недостатки семафора:

Преимущества;

  1. Они не позволяют нескольким процессам одновременно входить в критическую часть. Таким образом достигается взаимное исключение, что делает его намного более эффективным, чем другие методы синхронизации.
  2. Нет потери времени или ресурсов процесса в результате ожидания в семафоре. Это связано с тем, что процессам разрешен доступ к критическому разделу только в том случае, если выполняется определенное условие.
  3. Они обеспечивают гибкое управление ресурсами.
  4. Они являются машинно-независимыми, поскольку выполняются в машинно-независимом коде микроядра.

Недостатки

  1. Возможна ситуация инверсии приоритетов, когда процессы с более низким приоритетом получают доступ к критической секции, чем процессы с более высоким приоритетом.
  2. Программирование семафоров является сложным, и существует риск того, что взаимное исключение не будет достигнуто.
  3. Методы wait() и signal() должны выполняться правильно, чтобы избежать взаимоблокировок.

Что такое монитор?

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

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

Синтаксис:

Синтаксис монитора может быть следующим:

монитор { //объявления общих переменных переменные данных; Процедура P1() { … } Процедура P2() { … } . . . Процедура Pn() { … } Код инициализации() { … } }

Преимущества и недостатки монитора

Различные преимущества и недостатки монитора:

Преимущества

  1. Взаимное исключение в мониторах выполняется автоматически.
  2. Мониторы реализовать проще, чем семафоры.
  3. Мониторы могут устранять ошибки синхронизации, возникающие при использовании семафоров.
  4. Мониторы представляют собой набор процедур и условных переменных, объединенных в модуль особого типа.

Недостатки

  1. Мониторы должны быть реализованы в языке программирования.
  2. Компилятор должен сгенерировать для них код.
  3. Это дает компилятору дополнительное бремя знания того, какие функции операционной системы доступны для управления доступом к важным разделам в параллельных процессах.

Основные отличия семафора от монитора

Здесь вы узнаете об основных различиях между семафором и монитором. Вот некоторые из основных отличий:

  1. Семафор — это целочисленная переменная, которая позволяет многим процессам в параллельной системе управлять доступом к общему ресурсу, такому как многозадачная ОС. С другой стороны, монитор — это метод синхронизации, который позволяет взаимно исключать потоки и выполнять wait() для выполнения заданного условия.
  2. Когда процесс использует общие ресурсы в семафоре, он вызывает метод wait() и блокирует ресурсы. Когда он хочет освободить ресурсы, он выполняет signal() Напротив, когда процесс использует общие ресурсы в мониторе, он должен обращаться к ним через процедуры.
  3. Семафор — это целочисленная переменная, а монитор — это абстрактный тип данных.
  4. В семафоре целочисленная переменная показывает количество ресурсов, доступных в системе. Напротив, монитор — это абстрактный тип данных, который позволяет одновременно выполнять только процесс в критической секции.
  5. Семафоры не имеют концепции условных переменных, в то время как монитор имеет условные переменные.
  6. Значение семафора можно изменить только с помощью wait() и signal() Напротив, монитор имеет общие переменные и инструмент, который позволяет процессам получать к ним доступ.

Непосредственное сравнение семафора и монитора

Ниже приведены различные непосредственные сравнения семафора и монитора:

Характеристики Семафор Монитор
Определение Семафор — это целочисленная переменная, которая позволяет многим процессам в параллельной системе управлять доступом к общему ресурсу, подобному многозадачной ОС. Это процесс синхронизации, который позволяет потокам иметь взаимное исключение и ждать() для выполнения заданного условия.
Синтаксис // Операция ожидания
wait(Semaphore S) {
while (S С—;
}
// Сигнальная операция
сигнал (семафор S) {
С++;
}
монитор {
//объявления общих переменных
переменные данных;
Процедура P1() { … }
Процедура P2() { … }
.
.
.
Процедура Pn() { … }
}
Базовый Целая переменная Абстрактный тип данных
Доступ Когда процесс использует общие ресурсы, он вызывает метод wait() для S, а когда освобождает их, использует метод signal() для S. Когда процесс использует общие ресурсы в мониторе, он должен получить к ним доступ через процедуры.
Действие Значение семафора показывает количество общих ресурсов, доступных в системе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *