Глобальне блокування (також «гігантське»; ), також відоме як велике блокування (big-lock) або блокування ядра (kernel-lock), — це блокування у ядрі операційної системи, що може слугувати одним з механізмів коректної роботи SMP.
Гігантське блокування — це єдине глобальне блокування, яке захоплюється щоразу, коли тред входить у простір ядра, і звільняється, коли потік повертається до простору користувача. Типовим місцем у ядрі, де здійснюється послідовність «захоплення блокування — робота — звільнення блокування» є системний виклик. У цій моделі потоки у просторі користувача можуть виконуватися паралельно на будь-яких доступних процесорах або процесорних ядрах, але не більш ніж один потік може виконуватися у просторі ядра; будь-які інші потоки, що намагаються увійти у простір ядра, змушені очікувати. Іншими словами, через гігантське блокування справжній паралелизм виконання інструкцій всередині ядра є неможливим.
Завдяки такому спрощенню багато частин ядра не потребують якихось спеціальних модифікацій для підтримки SMP. Однак, оскільки у SMP-системах із гігантським блокуванням лише один процесор може виконувати код ядра в кожен момент часу, швидкодія застосунків, які проводять значну кількість часу в ядрі, покращується незначно. Відповідно, підхід із гігантським блокуванням зазвичай розглядається як початковий спосіб привнесення підтримки SMP до операційної системи, що дає переваги лише у просторі користувача. Більшість сучасних операційних систем використовують підхід дрібнозернистого блокування.
Linux
Ядро Linux мало велике блокування ядра (BKL) від моменту впровадження SMP, доки Арнд Бергманн не позбувся його у 2011 році у версії ядра 2.6.39. Решту конструкцій у коді, де використовувалося глобальне блокування, вилучили замінили дрібнозернистішим блокуванням. Дистрибутиви Linux, починаючи з CentOS 7, Debian 7 та Ubuntu 11.10, постачаються з ядрами, що не мають BKL.
BSD
Станом на 2019 рік, OpenBSD та NetBSD усе ще використовували сімейство примітивів spl для полегшення синхронізації критичних секцій у межах ядра,. Це означає, що багато системних викликів можуть не повністю утилізувати можливості SMP системи, і, за словами Метью Діллона, можливості SMP цих двох систем не можна вважати сучасними.
FreeBSD усе ще має підтримку м'ютекса Giant, який надає семантику, подібну до старого інтерфейсу spl, але критичні для продуктивності основні компоненти вже давно переведено на використання дрібнозернистішого блокування.
Метью Діллон стверджує, що серед операційних систем загального призначення з відкритим кодом лише Linux, DragonFly BSD та FreeBSD мають сучасну підтримку SMP, тоді як OpenBSD та NetBSD відстають.
Фундація NetBSD розглядає сучасну підтримку SMP як життєво важливу для напрямку розвитку проєкту NetBSD і пропонувала гранти розробникам, готовим працювати над покращеннями SMP; NPF був одним із проєктів, що постали в результаті цих фінансових стимулів, але подальші покращення основного мережевого стеку все ще можуть бути необхідними.
seL4
Мікроядро seL4 застосовує єдине велике блокування ядра як свідоме архітектурне рішення, а не як перехідний захід. У багатоядерній (multikernel) конфігурації seL4 ядро захищене одним глобальним блокуванням, тож у кожен момент часу код ядра виконує лише один процесор, тоді як простір користувача залишається повністю паралельним. На відміну від монолітних ядер, де велике блокування є вузьким місцем продуктивності, у seL4 такий підхід є прийнятним завдяки навмисній мінімальності ядра: системні виклики seL4 короткі та обмежені у часі виконання, тому критичні секції під блокуванням залишаються малими, а суперечність за блокування — низькою. Що важливіше, єдине блокування суттєво спрощує формальну верифікацію, усуваючи необхідність міркувати про чергування паралельного виконання всередині ядра; верифікація багатоядерності seL4 натомість покладається на модель «статичного мультиядра» та інкрементальний підхід до доведення коректності.
QNX
QNX Neutrino версій 6 та 7 використовувала велике блокування ядра для серіалізації входжень у ядро на багатопроцесорних системах. У QNX 8 ядро було перероблено докорінно: за словами розробника (Елад Лахав), відповідального за ядро QNX, нове ядро створювалося «з нуля» протягом приблизно 4,5 років і було поставлене разом із QNX 8. У межах цієї переробки було усунено велике блокування ядра, а також прибрано підпрограми обробки переривань (ISR), які виконувалися у контексті ядра; натомість обробка переривань повністю покладається на потоки обслуговування переривань (IST), що виконуються у просторі користувача як звичайні потоки. Докладна публічна документація щодо усунення великого блокування у QNX 8 є нечисленною, і відсутність блокування переважно підтверджується коментарями розробників QNX і слайдами презентацій.
Див. також
Паралельні обчислення Блокування (програмування) Глобальне блокування інтерпретатора
Примітки