Ноу Інти, лекція, організація обчислювального процесу

5.6. Взаємодія і синхронізація процесів і потоків

У мультипрограмних однопроцесорних системах процеси чергуються, забезпечуючи ефективне виконання програм. У багатопроцесорних системах можливо не тільки чергування. але і перекриття процесів. Обидві ці технології, які можна розглядати як приклади паралельних обчислень, породжують однакові проблеми. Виконання процесів і потоків в мультипрограммной середовищі завжди має асинхронний характер - неможливо передбачити відносну швидкість виконання процесів. Момент переривання потоків, час перебування їх в чергах до ресурсів, порядок вибору потоків для виконання - всі ці події є результатом збігу багатьох обставин і є випадковими, це справедливо як по відношенню до водних потоків одного процесу, який виконує загальний програмний код, так і по відношенню до водних потоків різних процесів, кожен з яких виконує власну програму.

Способи взаємодії процесів (потоків) можна класифікувати за ступенем обізнаності одного процесу про існування іншого [10].

  1. Процеси не інформовані про наявність один одного (наприклад, процеси різних завдань одного або різних користувачів). Це незалежні процеси, не призначені для спільної роботи. Хоча ці процеси і не працюють спільно, ОС повинна вирішувати питання конкурентного використання ресурсів. Наприклад, два незалежних додатки можуть зажадати доступ до одного і того ж диску або принтеру. ОС повинна регулювати такі звернення.
  2. Процеси побічно інформовані про наявність один одного (наприклад, процеси одного завдання). Ці процеси не обов'язково повинні бути поінформовані про наявність один одного з точністю до ідентифікатора процесу, проте вони поділяють доступ до деякого об'єкту, наприклад, буферу вводу-виводу, файлу або БД. Такі процеси демонструють співпрацю при поділі загального об'єкта.
  3. Процеси безпосередньо поінформовані про наявність один одного (наприклад, процеси, що працюють послідовно або по черзі в рамках одного завдання). Такі процеси здатні спілкуватися один з іншим з використанням ідентифікаторів процесів і спочатку створені для спільної роботи. Ці процеси також демонструють співпрацю при роботі.

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

тоді виконання P і Q детерміновано.

Якщо ці умови не дотримані, можливо, що паралельне виконання P і Q детерміновано, але можливо, що й ні. Випадок двох процесів природним чином узагальнюється на їх більшу кількість.

Умови Бернстайна інформативні, але занадто жорсткі. По суті справи, вони вимагають практично невзаимодействующих процесів. Однак хотілося б, щоб детермінований набір утворював процеси, спільно використовують інформацію і обмінюються нею. Для цього нам необхідно обмежити число можливих чергувань атомарних операцій, виключивши деякі чергування за допомогою механізмів синхронізації виконання програм і забезпечивши тим самим впорядкований доступ програм до деякими даними.

Про недетермінований набір програм говорять, що він має race condition (стан гонки. Стан змагання). У наведеному вище прикладі процеси змагаються за обчислення значень змінних x і y.

Завдання упорядкованого доступу до даних, що розділяються (усунення race condition), в тому випадку, якщо нам не важлива його черговість, можна вирішити, якщо забезпечити кожному процесу ексклюзивне право доступу до цих даних. Кожен процес, який звертається до ресурсів, виключає для всіх інших процесів можливість одночасного з ним спілкування з цими ресурсами, якщо це може призвести до недетермінірованного поведінки набору процесів. Такий прийом називається взаємовиключення (mutual exclusion). Якщо черговість доступу до ресурсів важлива для отримання правильних результатів, то одними взаємовиключення вже не обійтися.

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

Оскільки в процесі передачі повідомлень не відбувається будь-якого спільного використання ресурсів, взаємовиключення не потрібно, хоча проблеми взаімоблокіровок і голодування залишаються актуальними. Як приклад взаимоблокировки можна навести ситуацію, при якій кожен з двох процесів заблокований очікуванням повідомлення від іншого процесу. Голодування можна проілюструвати наступним чином. Нехай є три процесу Р1. Р2. Р3. а ті, в свою чергу. намагаються зв'язатися з процесом Р1. Може виникнути ситуація, коли Р1 і Р2 постійно зв'язуються один з одним, а Р3 залишається заблокованим, чекаючи зв'язку з процесом Р1.