Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
13
Добавлен:
19.09.2019
Размер:
4.01 Mб
Скачать
  1. Як організувати багато потокове застосування? Які проблеми можуть виникнути під час взаємодії потоків і які методи їх уникнення?

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

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

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

Все це робить використання потоків приємно простим. У цьому вигода: розподілу ресурсів. Якщо ви маєте більше одного запущеного процесу, які очікують доступу до одного і того ж ресурсу, ви маєте проблему. Наприклад, два процесу не можуть одночасно надсилати інформацію на принтер. Для вирішення проблеми ресурс, який може бути розділений, такий як принтер, повинен бути заблокований, поки він використовується. Так процес блокує ресурс, завершує завдання, а потім звільняє блокування, так що хтось інший може використовувати ресурс.

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

• Оскільки в системі з витісняє багатозадачність потік може бути перерваний в будь-який момент для перемикання на інший потік, то може випадково відбутися небажана взаємодія між двома потоками.

• Однією з основних помилок у багатопотокових програмах є так званий стан перегонів (race condition). Це трапляється, якщо програміст вважає, що один потік закінчить виконання своїх дій, наприклад, підготовку яких-небудь даних, до того, як ці дані будуть потрібні іншому потоку.

Для координації дій потоків операційних систем необхідні різні форми синхронізації.

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

• Схоже на семафору і критичні розділи (critical sections), які являють собою розділи коду, під час виконання якого потік не може бути перервано.

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

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

Потоки Java вбудовані в мову, що робить складні предмети більш простими. Потоки підтримується на рівні об'єктів, так що один виконуються потік представлений одним об'єктів. Java також забезпечує обмежене блокування ресурсу. Може бути заблокована пам'ять будь-якого об'єкта (який, крім усього, один із видів поділюваних ресурсів), так що тільки один потік може використовувати його одночасно. Це досягається за допомогою ключового слова synchronized. Інші типи ресурсів повинні бути явно заблоковані програмістом, звичайно з допомогою створення об'єкта для представлення блокування, що всі потоки повинні перевіряти, перш ніж звернутися до ресурсу.

Часто виникають проблеми, зв'язані із використанням паралельно працюючих потоків одних і тих же даних чи пристроїв. Для вирішення подібних проблем використовують такі методи:

1) Взаімоісключенія (mutex, мьютекс) - це об'єкт синхронізації, який встановлюється в особливий сигнальний стан, коли не зайнятий якимись потоком.Тільки один потік володіє цим об'єктом у будь-який момент часу, звідси і назва таких об'єктів (mutually exclusive access - взаємно виключає доступ) - одночасний доступ до загального ресурсу виключається.Після всіх необхідних дій мьютекс звільняється, надаючи іншим потокам доступ до загального ресурсу.

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

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

4) Критичні секції забезпечують синхронізацію подібно мьютексам за винятком того, що об'єкти, що представляють критичні секції, доступні в межах одного процесу.Події, мьютекси і семафору також можна використовувати в однопроцессном програмі,однак критичні секції забезпечують швидкий і більш ефективний механізм взаємо-виключає синхронізації - операції "отримати" і "звільнити" на критичної секції оптимізовані для випадку єдиного потоку (відсутності конкуренції) з метою уникнути будь-яких провідних в ядро ОС системнихизовов.Подібно мьютексам об'єкт, який представляє критичну секцію, може використовуватися тільки одним потоком в даний момент часу, що робить їх дуже корисними при розмежування доступу до загальних ресурсів.