русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

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


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Шановні українці! Матеріал був перекладений з російської мови. Тому можуть бути незначні помикли...

Семафори. Синхронізація процесів

Семафори

У теорії операційних систем семафор являє собою неотрицательную цілу ппеременную, над якою можливі два види операцій: і V.

  • -операція над семафор являє собою спробу зменшення пзначения семафора на 1. Якщо перед виконанням -операції значення псемафора було більше 0, -операція виконується без затримок. Якщо пперед виконанням -операції значення семафора було 0, процес, пвыполняющий -операцію, переводиться у стан очікування до тих профспілки, поки значення семафора не стане великим 0.
  • V-операція над семафор являє собою збільшення значення псемафора на 1. Якщо при цьому є процеси, затримані на виконанні -операції на даному семафорі, один з цих процесів виходить стану очікування і може виконати свою -операцію.

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

 

 

Взаємне виключення на семафорі

Для реалізації взаємного виключення, наприклад, запобігання можливості подновременного зміни двома або більше процесами загальних даних, створюється пдвоичный (з можливими значеннями 0 і 1) семафор . Початкове пзначение цього семафора - 1. Критичні секції коду (секції, які можуть подновременно виконуватися тільки одним процесом) обрамляються "дужками" P(S) (на початку секції) і V(S) (наприкінці секції). ппроцес, що входить в критичну секцію, виконує операцію P(S) пі переводить семафор в 0. Якщо у критичній секції вже знаходиться інший ппроцес, то значення семафора вже 0, тоді другий процес, бажаючий увійти в пкритическую секцію, блокується у своїй -операції до тих пір, ппока процес, який перебуває в критичній секції зараз, не вийде з неї, пвыполнив на виході операцію V(S).

 

 

Синхронізація на семафорі

Для забезпечення синхронізації створюється двійковий семафор пначальным значенням 0. Значення 0 означає, що подія, ще не настав. ппроцес, що сигналізує про настання події, виконує операцію V(S)встановлення семафор в 1. Процес, що очікує настання псобытия, виконує операцію P(S). Якщо до цього моменту подія пуже сталося, чекаючий процес продовжує виконуватися, якщо ж подія ще пне сталося, процес переводиться у стан очікування до тих пір, поки псигнализирующий процес не виконає V(S).

У разі, якщо одного і того ж події чекають кілька процесів, ппроцес, успішно виконав операцію P(S), повинен слідом за нею пвыполнить V(S), щоб дублювати сигнал про подію для пследующего чекаючого процесу.

 

 

Семафор - лічильник ресурсів

Якщо у нас є N одиниць деякого ресурсу, то для пконтроля його розподілу створюється спільний семафор з початковим пзначением N. Виділення ресурсу супроводжується операцією P(S), звільнення - операцією V(S). Значення псемафора, таким чином, відображає кількість вільних одиниць ресурсу. Якщо пзначение семафора 0, тобто, вільних одиниць більше не залишається, то черговий ппроцес, запитуючий одиницю ресурсу буде переседен у очікування в операції P(S) до тих пір, поки якийсь з використовують ресурс процесів пне звільнить одиницю ресурсу, виконавши при цьому V(S).

 

 

Системні виклики Unix/Linux

В ОС Unix/Linux механізм семафорів обслуговується трьома системними викликами: semget, semctl semop.

Системний виклик semget створює масив семафорів або повертає ідентифікатор вже існуючого масиву семафорів. Цей ідентифікатор використовується при подальших операціях з семафор. Системні виклики працюють з масивами семафорів, це зроблено лише для того, щоб мати загальну ідентифікацію для всіх семафорів одного завдання. Системні виклики semctl semop дають можливість окремо оперувати з кожним семафор масиву.

Системний виклик semctl дозволяє виконувати керуючі операції над масивом семафорів і окремими його елементами: читати і встановлювати значення, знищувати масив семафорів.

Системний виклик semop виконує прикладні семафорные операції: аналоги і V-операцій, а також перевірки стану семафора.

Семафори в Unix/Linux не мають зовнішніх імен. При отриманні ідентифікатора псемафора процес користується числовим ключем. Розробники непов'язаних ппроцессов можуть домовитися про загальне значення ключа, який вони будуть писпользовать, але у них немає гарантії в тому, що це ж значення ключа не буде писпользовано ким ще. Гарантовано унікальний масив семафорів можна пстворити з використанням ключа IPC_PRIVATE, але такий ключ не допоможе бути зовнішнім. Тому семафори використовуються, як правило, спорідненими ппроцессами, які мають можливість передавати один одному ідентифікатори псемафоров, наприклад, через успадковані ресурси або через параметри виклику пдочерней програми.

Увага!
пВ процесі налагодження програми у Вас можуть виникати ситуації, коли програма пбудет аварійно закінчуватися або перериватися Вами, перш ніж вона знищить псозданные нею семафори. Такі семафори не видаляються в системі автоматично і пмогут накопичуватися протягом багатьох днів. Накопичення таких "забутих" семафорів допоможе привести до того, що буде вичерпано системний ліміт на кількість псемафоров, і черговий виклик semget закінчиться з пошибкой. Для того, щоб цього не відбувалося, регулярно робіть процедуру почистки IPC: /home/metod/rmipc. Виконуйте пету процедуру також перед кожним виходом з сеансу.

Список створених Вами семафорів Ви можете побачити, виконавши команду: ipcs-s.

System V IPC: базові поняття

Разом з ОС System V корпорація AT&T запропонувала три нових типу IPC коштів: черзі повідомлень, семафори і спільна пам'ять. У BSD-системах у якості базової форми IPC используетютя найчастіше сокети, ніж елементи System V. Linux має можливість використовувати обидва види IPC (BSD і System V), хоча ми не будемо обговорювати сокети в рамках курсу.

 

IPC ідентифікатори

пКаждый об'єкт IPC має унікальний IPC ідентифікатор. Коли ми говоримо "об'єкт"IPC, ми маємо на увазі чергу одиничних повідомлень, безліч семафорів або розділяється сегмент пам'яті. Цей ідентифікатор потрібно ядра для однозначного визначення об'єкта IPC. Наприклад, щоб послатися на певний розділяється сегмент, єдине, що вам потрібно, це унікальне значення ID, що прив'язана до цього сегмента.

пИдентификатор IPC унікальний тільки для свого типу об'єктів. Тобто, скажімо, можлива лише одна черга повідомлень з ідентифікатором "12345", так само як номер "12345" може мати яке щось одне безліч семафорів або (і) якоїсь розділяється сегмент.

 

 

IPC ключі

пнатисніть отримати унікальний ID потрібен ключ. Ключ повинен бути взаємно узгоджений процесом-клієнтом і процесом-сервером. Для додатка це узгодження має бути першим кроком у побудові середовища.

пнатисніть зателефонувати кому-або по телефону, ви повинні знати його номер. Крім того, телефонна компанія повинна знати як провести ваш виклик до адресата. І тільки коли цей адресат відповість, зв'язок відбудеться.

пВ разі System V IPC "телефон" з'єднує об'єкти IPC одного типу. Під "телефонною компанією", або методом маршрутизації, слід розуміти ключ IPC.

пДля створення ключа використовуються функція ftok і на стороні клієнта, і на стороні сервера.

пТаким чином, значення ключа, коли воно отримано, використовується ппоследующих системні виклики IPC для створення або одержання доступу до побъектам IPC.

Приклад виконання наведено тут.


Довідковий матеріал

Обрані системні виклики Linux/Unix. Короткий опис.

Довідник бібліотечних функція мови З: частина 1, частина 2 (кодування кирилиця ibm866).


Переглядів: 10969

Повернутися в зміст:ОС Linux




Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн