Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS_chast_2.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
66.14 Кб
Скачать

28. Синхронізація за принципом бар'єра

Бар'єр - це блокування, яке зберігають доти, поки кількість потоків, що очі­кують, не досягне деякого наперед заданого числа, після чого всі ці потоки про­довжують своє виконання.

Так, якщо наприкінці етапу задачі поставити бар'єр, він буде утримувати по­токи від продовження, поки вони всі не завершать роботу цього етапу.

Операції бар'єра

Розглянемо дві операцій бар'єра.

  • Ініціалізація бар'єра (barrieMnit). Параметром даної операції є п - кількість потоків, які ми синхронізуватимемо на цьому бар'єрі. Внутрішній лічильник призупинених потоків покладають рівним нулю. Значення п після виклику barrieMnit міняти не можна.

  • Очікування на бар'єрі (barrierwait). Внаслідок даної операції лічильник при­зупинених потоків збільшується на одиницю. Якщо він не досягнув п, цей по­тік призупиняють (кажуть, що він «очікує на бар'єрі»). Якщо ж після збіль­шення лічильник виявляється рівним п (досягнуто максимальної кількості потоків для бар'єра), усі потоки, що очікували на бар'єрі, поновлюються (си­туація переходу бар'єра), при цьому одному з них повертають спеціальне зна­чення (зазвичай -1), а іншим — нуль. Надалі потік, що отримав це спеціальне значення, може зробити деякі підсумкові дії після переходу бар'єра. При пере­ході бар'єра його «скидають» (внутрішній лічильник призупинених потоків знову покладають рівним 0) і він починаючи із наступної операції barrierwait блокуватиме потоки знову.

29. Синхронізація процесів користувача у Linux.Ф’ютекси

Ф'ютекс — цілочисловий лічильник, що перебуває у спільній пам'яті, яку ви­користовують потоки або процеси. Роботу з цим лічильником ведуть аналогічно до роботи із семафором. Для його збільшення або зменшення потоки мають вико­нувати атомарні інструкції процесора.

Зазначимо, що лічильник ф'ютекса може розміщатися у спільній пам'яті де завгодно. Потоки можуть перетворити будь-яке місце пам'яті у ф'ютекс без попе­редньої підготовки (поки не виникне суперництво за ф'ютекс, потоки лише збіль­шують і зменшують цілочислове значення у спільній пам'яті). Ф'ютексів можна створювати безліч.

Розглянемо ситуації, коли використання ф'ютекса потребує виконання систем­ного виклику.

  • У разі спроби заблокуватися на ф'ютексі (коли потрібно його зменшити, а він дорівнює нулю) виконують системний виклик для організації очікування від­повідно до операції futexwait (серед інших параметрів йому потрібно переда­ти адресу пам'яті, де перебуває лічильник, і, в окремих випадках, максималь­ний час очікування). У коді цього виклику адресу пам'яті додають у ядрі до хеш-таблиці й створюють чергу очікування, куди поміщають відповідний керуючий блок потоку. Значення ф'ютекса покладають рівним -І.

  • Коли ми збільшуємо ф'ютекс, може з'ясуватися, що вихідним значенням бу­де - 1 . У цьому разі виконують системний виклик для поновлення потоків від­повідно до операції futexwake (серед параметрів йому, крім адреси пам'яті, треба передати кількість потоків, які потрібно поновити). У результаті потоки переводять із черги очікування в чергу готових процесів.

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

Інтерфейс ф'ютексів не призначений для безпосереднього використання у при­кладних програмах. Замість цього на основі ф'ютексів бібліотеки підтримки пото­ків можуть бути реалізовані примітиви синхронізації більш високого рівня (саме це й зроблено у NPTL).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]