Що таке блокування памяті?

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

Десятиліттями продуктивність може бути знижена через очікування нових, ефективніших ЦП. Відповідно до закону Мура, процесори приблизно подвоюють продуктивність кожні два-три роки. На жаль, більшість цих приростів продуктивності відбулися завдяки використанню дедалі менших виробничих вузлів. Сучасна технологія намагається зменшити розмір вузла історичною швидкістю завдяки матеріальним труднощам роботи в масштабі нанометрів.

Щоб обійти це, сучасні архітектори ЦП вирішили додати до ЦП кілька ядер процесора. Кожне ядро ​​процесора може виконувати різні завдання незалежно. Хоча вони не можуть об’єднати ту саму проблему, вони можуть працювати над двома проблемами одночасно. Ця фундаментальна зміна архітектури забезпечує велику додаткову продуктивність, але не приносить безпосередньої користі окремим процесам, хоча зменшує боротьбу за процесорний час.

Щоб скористатися перевагами багатоядерних ЦП, код має бути написаний у багатопотоковий спосіб. Тоді кожен потік можна запускати одночасно, масштабуючи перевагу продуктивності за кількістю доступних потоків і ядер ЦП. Однак це стикається з новою проблемою, «умовою перегонів».

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

Умови перегонів

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

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

У цьому випадку перший потік читає значення a . Перш ніж перший потік зможе збільшити значення хоча , другий потік зчитує його. Тепер перший потік додає одиницю до нуля, але другий потік уже вважає, що значення дорівнює нулю, додаючи одиницю до нуля. Результатом цього є те, що кінцеве значення a дорівнює 1, а не 2.

Перегони за найгіршим сценарієм

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

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

Якщо змінна сказала true на початку читання, але була в процесі перезапису на слово false, результатом операції читання може бути щось на зразок «trlse». Це не «правда» чи «неправда». Відсутність жодного з двох варіантів у двійковому виборі майже напевно призведе до збою програми. Це пошкодження пам’яті може призвести до багатьох проблем безпеки, таких як відмова в обслуговуванні та підвищення привілеїв.

Блокування гонки

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

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

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

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

Висновок

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

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


Як клонувати жорсткий диск

Як клонувати жорсткий диск

У сучасну цифрову епоху, коли дані є цінним активом, клонування жорсткого диска в Windows може бути вирішальним процесом для багатьох. Цей вичерпний посібник

Як виправити помилку завантаження драйвера WUDFRd у Windows 10?

Як виправити помилку завантаження драйвера WUDFRd у Windows 10?

Ви стикаєтеся з повідомленням про помилку під час завантаження комп’ютера, у якому йдеться про те, що драйвер WUDFRd не вдалося завантажити на ваш комп’ютер?

Як виправити код помилки NVIDIA GeForce Experience 0x0003

Як виправити код помилки NVIDIA GeForce Experience 0x0003

Ви відчуваєте код помилки NVIDIA GeForce 0x0003 на робочому столі? Якщо так, прочитайте блог, щоб дізнатися, як швидко та легко виправити цю помилку.

Що таке SMPS?

Що таке SMPS?

Перш ніж вибрати SMPS для свого комп’ютера, дізнайтеся, що таке SMPS і значення різних показників ефективності.

Чому мій Chromebook не вмикається

Чому мій Chromebook не вмикається

Отримайте відповіді на запитання «Чому мій Chromebook не вмикається?» У цьому корисному посібнику для користувачів Chromebook.

Як повідомити Google про фішинг

Як повідомити Google про фішинг

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

Roomba зупиняється, залипає та розвертається – виправлення

Roomba зупиняється, залипає та розвертається – виправлення

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

Як змінити налаштування графіки на Steam Deck

Як змінити налаштування графіки на Steam Deck

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

Що таке безпека на основі ізоляції?

Що таке безпека на основі ізоляції?

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

Як використовувати Auto Clicker для Chromebook

Як використовувати Auto Clicker для Chromebook

Сьогодні я збирався заглибитися в інструмент, який може автоматизувати повторювані завдання на вашому Chromebook: Auto Clicker. Цей інструмент може заощадити ваш час і