Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

spz / lect / lekc6_3_keruv_data

.pdf
Скачиваний:
13
Добавлен:
23.02.2016
Размер:
201.88 Кб
Скачать

Як другий приклад розглянемо ситуацію, що ще зовсім недавно була досить актуальною для перших персональних комп'ютерів. Нехай на ПК із найпростішою однопрограмною операційною системою (типу МS-DOS) встановлена деяка резидентна програма з умовною назвою Т1МЕ, що по натисканню на якусь комбінацію клавіш відтворює на екрані дисплея час. Допустимо, що значення перемінних, що вказують годину, хвилини і секунди, рівні 18:20:59, причому вивід на дисплей здійснюється з права на ліво (в порядку: секунди, хвилини, години). Нехай відразу ж після передачі програмою Т1МЕ на дисплей інформації «59 секунд» генерується переривання від таймера і значення часу оновлюється: 18:21:00.

Після цього програма Т1МЕ, перервана таймером, продовжить своє виконання, і на дисплей будуть видані значення: хвилини = 21, години = 18. В результаті на екрані ми побачимо: 18:21:59.

Нарешті, як третій приклад приведемо пару процесів, що змінюють різні поля записів службовців якого-небудь підприємства. Нехай процес АДРЕСА змінює домашню адреса що службовця, а процес СТАТУС — його посаду і зарплату. Нехай кожен процес копіює весь запис СЛУЖБОВЕЦЬ у свою робочу область. Припустимо, що кожен процес повинний обробити деякий запис ІВАНОВ. Припустимо також, що після того, як процес АДРЕСА скопіював запис ІВАНОВ у свою робочу область, але до того, як він записав скоректований запис назад, процес СТАТУС скопіював первісний запис ІВАНОВ у свою робочу область. Зміни, виконані тим із процесів, що першим запише скоректований запис назад у файл СЛУЖБОВЦІ, будуть загублені і, можливо, ніхто не буде знать про це.

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

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

Допустимо, що «постачальник» — це процес, що відправляє порції інформації (повідомлення) іншому процесу, ім'я якого «споживач».

Наприклад, процес користувача, що породжує рядки для виведення, може виступати як «постачальник», а процес, що виводить ці рядки на друк,

— як «споживач». Один з методів, застосовуваних при реалізації передачі повідомлень, полягає в тому, що заводиться пул (роо1 — це сукупність

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

У цьому випадку між процесами «постачальник» і «споживач» будемо мати чергу заповнених буферів, що містять повідомлення. Коли «постачальник» хоче послати чергове повідомлення, він додає в кінець цієї черги ще один буфер. «Споживач», щоб одержати повідомлення, забирає з черги буфер, що стоїть на початку. Таке рішення, хоча і здається тривіальним, вимагає, щоб «постачальник» і «споживач» синхронізували свої дії. Наприклад, вони повинні стежити за кількістю вільних і заповнених буферів. «Постачальник» може передавати повідомлення тільки доти, поки є вільні буфери. Аналогично, «споживач» може одержувати повідомлення тільки якщо черга не порожня. Ясно, що для обліку заповнених і вільних буферів потрібні поділювані перемінні. Тому для процесів, що співробітничають, як і для конкуруючих, теж виникає необхідність у взаємному виключенні.

Таким чином, до закінчення звертання однієї задачі до загальних змінних варто виключити можливість звертання до них іншої задачі. Ця ситуація і називається взаємним виключенням. Іншими словами, при організації різного роду взаємодіючих процесів приходиться організовувати взаємне виключення і вирішувати проблему коректного доступу до загальних змінних (критичним ресурсам). Ті місця в програмах, у яких відбувається звертання до критичних ресурсів, називаються критичними секціями або критичними інтервалами. Рішення цієї проблеми полягає в організації такого доступу до критичного ресурсу, коли тільки одному процесу дозволяється входити в критичну секцію.

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

1.у будь-який момент часу тілько один процес повинний знаходитися у своїй критичній секції;

2.ні один процес не повинний знаходитися у своїй критичній секції безкінечно довго;

3.ні один процес не повинний чекати нескінченно довго входу у свій критичний інтервал. Зокрема:

a)ніякий процес, що нескінченно довго знаходиться поза своєї критичною секцією, не повинний затримувати виконання інших процесів, що очікують входу у свої критичні секції. Іншими

словами, процес, що працює поза своєю критичною секцією, не повинний блокувати критичну секцію іншого процесу;

b)якщо два процеси хочуть ввійти у свої критичні інтервали, то ухвалення рішення про те, хто першим ввійде в критичну секцію, не повинне відкладатися нескінченно довго;

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

Було запропоновано декілька способів рішення цієї проблеми — програмні й апаратні; частні і глобальні, низькорівневі і високорівневі.

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

Соседние файлы в папке lect