Що таке паркан пам’яті?


Відповіді:


115

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

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

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

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


26
Я не думаю, що мінливих недостатньо для зупинки упорядкування компілятора; Це означає, що компілятор не може кешувати змінне значення. Ядро Linux використовує розширення gcc ( asm __volatile __ (""::: "memory")) для створення повного бар'єру оптимізації компілятора.
CesarB

5
правда, про нестабільність не відомо про потоки, але ви можете використовувати її, щоб зупинити компілятор, застосовуючи певні оптимізації - це не пов'язано з огорожами;)
Gwaredd

3
(.NET CLR) мінливі читання набувають огорожі, записи - огорожі випуску. Заблоковані опси повні, як і метод MemoryBarrier.
Люк Пуплетт

3
Цікаво читати про нестабільний ключового слова в .net можна визначити тут albahari.com/threading/part4.aspx#_NonBlockingSynch Сайт містить багато корисної інформації про багатопоточності в C #
Bas Smit

developerWorks має хорошу [статтю] [1] про модель зберігання пам'яті PowerPC. [1]: ibm.com/developerworks/systems/articles/powerpc.html
Іурі Гусєв

17

Скопіюючи свою відповідь на інше запитання: Які трюки виконує процесор для оптимізації коду? :

Найважливішим з них було б упорядкування доступу до пам'яті.

Якщо відсутні огорожі пам’яті або вказівки щодо серіалізації, процесор вільний змінити доступ до пам'яті. Деякі архітектури процесорів мають обмеження щодо того, наскільки вони можуть змінити порядок; Альфа відома тим, що є найслабшою (тобто такою, яка може змінити саму кількість).

Дуже вдале ставлення до теми можна знайти у вихідній документації на ядро ​​Linux за адресою Documentation / memory-barriers.txt .

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


Як це впливає на потік переупорядкування? Коли ви сказали Alpha is known for being the weakest, чому weakest? Хіба не краще, що вона переоформлює більше, так що в результаті це буде набагато швидше виконання? (Я не альфа-користувач, але запитую про ефект very reorderingvs restricted reordering). Отже, які є недоліки переупорядкування партії (за винятком ризику невизначеної поведінки, але я б здогадався, більшість сучасних процесорів повинні були вирішити гарне переупорядкування та здійснили лише визначене переупорядкування, інакше не було б сенсу прийнятого ними рішення).
Пастух

8

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

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

Хорошим вступом у проблему є "Декларація " Подвійне перевірене блокування ". Для багатьох це був дзвінок, який прокидався, що є дракони.

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


2

Вікіпедія знає всіх ...

Бар'єр пам’яті, також відомий як мембрана або огорожа пам’яті, - це клас інструкцій, які змушують центральний процесорний блок (ЦП) застосовувати обмеження для замовлення на операції з пам’яттю, видані до та після інструкції щодо бар’єру.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.