
- •28. Синхронізація за принципом бар'єра
- •29. Синхронізація процесів користувача у Linux.Ф’ютекси
- •30. Види міжпроцесової взаємодії
- •31. Міжпроцесова взаємодія на базі спільної пам'яті
- •32. Технології передавання повідомлень
- •33. Взаємні блокування
- •34. Умови виникнення взаємних блокувань
- •35. Запобігання взаємним блокуванням на рівні ос
- •36. Підхід ведучого-веденого
- •37. Підхід портфеля задач
- •38. Підхід конвеєра
- •39. Проблеми реалізації'віртуальної пам'яті. Фрагментація пам'яті
- •41. Сегментація пам'яті
- •42. Сторінкова організація пам'яті
- •43. Сторінково-сегментна організація пам'яті
- •44. Поняття підкачування
- •45. Поняття сторінкового переривання
- •46. Алгоритм fifo
- •47. Оптимальний алгоритм
- •48. Алгоритм lru
- •49. Годинниковий алгоритм
- •50. Організація заміщення сторінок
- •51. Поняття файла і файлової системи
- •52. Організація інформації у файловій системі
- •53. Операції над файлами і каталогами
- •54. Файлові операції posix
28. Синхронізація за принципом бар'єра
Бар'єр - це блокування, яке зберігають доти, поки кількість потоків, що очікують, не досягне деякого наперед заданого числа, після чого всі ці потоки продовжують своє виконання.
Так, якщо наприкінці етапу задачі поставити бар'єр, він буде утримувати потоки від продовження, поки вони всі не завершать роботу цього етапу.
Операції бар'єра
Розглянемо дві операцій бар'єра.
Ініціалізація бар'єра (barrieMnit). Параметром даної операції є п - кількість потоків, які ми синхронізуватимемо на цьому бар'єрі. Внутрішній лічильник призупинених потоків покладають рівним нулю. Значення п після виклику barrieMnit міняти не можна.
Очікування на бар'єрі (barrierwait). Внаслідок даної операції лічильник призупинених потоків збільшується на одиницю. Якщо він не досягнув п, цей потік призупиняють (кажуть, що він «очікує на бар'єрі»). Якщо ж після збільшення лічильник виявляється рівним п (досягнуто максимальної кількості потоків для бар'єра), усі потоки, що очікували на бар'єрі, поновлюються (ситуація переходу бар'єра), при цьому одному з них повертають спеціальне значення (зазвичай -1), а іншим — нуль. Надалі потік, що отримав це спеціальне значення, може зробити деякі підсумкові дії після переходу бар'єра. При переході бар'єра його «скидають» (внутрішній лічильник призупинених потоків знову покладають рівним 0) і він починаючи із наступної операції barrierwait блокуватиме потоки знову.
29. Синхронізація процесів користувача у Linux.Ф’ютекси
Ф'ютекс — цілочисловий лічильник, що перебуває у спільній пам'яті, яку використовують потоки або процеси. Роботу з цим лічильником ведуть аналогічно до роботи із семафором. Для його збільшення або зменшення потоки мають виконувати атомарні інструкції процесора.
Зазначимо, що лічильник ф'ютекса може розміщатися у спільній пам'яті де завгодно. Потоки можуть перетворити будь-яке місце пам'яті у ф'ютекс без попередньої підготовки (поки не виникне суперництво за ф'ютекс, потоки лише збільшують і зменшують цілочислове значення у спільній пам'яті). Ф'ютексів можна створювати безліч.
Розглянемо ситуації, коли використання ф'ютекса потребує виконання системного виклику.
У разі спроби заблокуватися на ф'ютексі (коли потрібно його зменшити, а він дорівнює нулю) виконують системний виклик для організації очікування відповідно до операції futexwait (серед інших параметрів йому потрібно передати адресу пам'яті, де перебуває лічильник, і, в окремих випадках, максимальний час очікування). У коді цього виклику адресу пам'яті додають у ядрі до хеш-таблиці й створюють чергу очікування, куди поміщають відповідний керуючий блок потоку. Значення ф'ютекса покладають рівним -І.
Коли ми збільшуємо ф'ютекс, може з'ясуватися, що вихідним значенням буде - 1 . У цьому разі виконують системний виклик для поновлення потоків відповідно до операції futexwake (серед параметрів йому, крім адреси пам'яті, треба передати кількість потоків, які потрібно поновити). У результаті потоки переводять із черги очікування в чергу готових процесів.
Легко побачити, що ф'ютекси автоматично роблять можливою синхронізацію потоків різних процесів через розподілювану пам'ять.
Інтерфейс ф'ютексів не призначений для безпосереднього використання у прикладних програмах. Замість цього на основі ф'ютексів бібліотеки підтримки потоків можуть бути реалізовані примітиви синхронізації більш високого рівня (саме це й зроблено у NPTL).