BKL: Большая блокировка ядра
BKL: Большая блокировка ядра
Добро пожаловать к "рыжему пасынку" ядра. Большая блокировка ядра (Big Kernel Lock, BKL) — это глобальная спин-блокировка, которая была создана специально для того, чтобы облегчить переход от первоначальной реализации SMP в операционной системе Linux к мелкоструктурным блокировкам. Блокировка BKL имеет следующие интересные свойства.
• Во время удержания BKL можно переходить в состояние ожидания. Блокировка автоматически освобождается, когда задание переходит в состояние ожидания, и снова захватывается, когда задание планируется на выполнение. Конечно, это не означает, что безопасно переходить в состояние ожидания при удержании BKL, просто это можно делать и это не приведет к взаимоблокировке.
• Блокировка BKL рекурсивна. Один процесс может захватывать эту блокировку несколько раз подряд, и это не приведет к самоблокировке, как в случае обычных спин-блокировок.
• Блокировка BKL может использоваться только в контексте процесса.
• Блокировка BKL — это от лукавого.
Рассмотренные свойства дали возможность упростить переход от ядер серии 2.0 к серии 2.2. Когда в ядро 2.0 была введена поддержка SMP, только одно задание могло выполняться в режиме ядра в любой момент времени (конечно, сейчас ядро распараллелено очень хорошо — пройден огромный путь). Целью создания ядра серии 2.2 было обеспечение возможности параллельного выполнения кода ядра на нескольких процессорах. Блокировка BKL была введена для того, чтобы упростить переход к мелкоструктурным блокировкам. В те времена она оказала большую помощь, а сегодня она приводит к ухудшению масштабируемости[51].
Использовать блокировку BKL не рекомендуется. На самом деле, новый код никогда не должен использовать BKL. Однако эта блокировка все еще достаточно интенсивно используется в некоторых частях ядра. Поэтому важно понимать особенности большой блокировки ядра и интерфейса к ней. Блокировка BKL ведет себя, как обычная спин-блокировка, за исключением тех особенностей, которые были рассмотрены выше. Функция lock_kernel() позволяет захватить блокировку, а функция unlock_kernel() — освободить блокировку. Каждый поток выполнения может рекурсивно захватывать эту блокировку, но после этого необходимо столько же раз вызвать функцию unlock_kernel(). При последнем вызове функции освобождения блокировки блокировка будет освобождена. Функция kernel_locked() возвращает ненулевое значение, если блокировка в данный момент захвачена, в противном случае возвращается нуль. Эти интерфейсы определены в файле <linux/smp_lock.h>. Рассмотрим простой пример использования этой блокировки.
lock_kernel();
/*
* Критический раздел, который синхронизирован со всеми пользователями
* блокировки BKL...
* Заметим, что здесь можно безопасно переходить в состояние ожидания
* и блокировка будет прозрачным образом освобождаться.
* После перепланирования блокировка будет прозрачным образом снова
* захватываться.
* Это гарантирует, что не возникнет состояния взаимоблокировки,
* но все-таки лучше не переходить в состояние ожидания,
* если необходимо гарантировать защиту данных!
*/
unlock_kernel();
Когда эта блокировка захвачена, происходит запрещение преемптивности. Для ядер, скомпилированных под однопроцессорную машину, код BKL на самом деле не выполняет никаких блокировок. В табл. 9.8 приведен полный список функций работы с BKL.
Таблица 9.8. Функции работы с большой блокировкой ядра
Функция Описание lock_kernel() Захватить блокировку BKL unlock_kernel() Освободить блокировку BKL kernel_locked() Возвратить ненулевое значение, если блокировка захвачена, и нуль- в противном случаеОдна из самых главных проблем, связанных с большой блокировкой ядра, — как определить, что защищается с помощью данной блокировки. Часто блокировка BKL ассоциируется с кодом (например, она "синхронизирует вызовы функции foo()"), а не с данными ("защита структуры foo"). Это приводит к тому, что заменить BKL обычными спин-блокировками бывает сложно, потому что нелегко определить, что же все-таки необходимо блокировать. На самом деле, подобная замена еще более сложна, так как необходимо учитывать все взаимоотношения между всеми участками кода, которые используют эту блокировку.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Ловись рыбка большая и малая
Ловись рыбка большая и малая Если хочется получить нечто большее, чем просто программное обеспечение, придется «попотеть» в поиске сайтов фирм, проводящих рекламные акции по рассылке сувениров, образцов продукции. Чаще всего в качестве сувениров выступают ручки, майки,
D.2.3 Большая локальная сеть
D.2.3 Большая локальная сеть Наконец, предположим, что существует шесть больших локальных сетей. Мы хотим обеспечить соединение каждой из них с 500 хостами. Подойдет 7-битовая маска подсети (см. раздел D.1.1). Типичная 7-битовая подсеть содержит диапазон адресов, подобный
§ 96. Большая маркетологическая глупость
§ 96. Большая маркетологическая глупость 2 декабря 2002Стремление идти проверенным путем рождает уродцев без души и смысла. Без эксперимента и смелости нельзя добиться нового и интересного. Крупные компании набирают штаты маркетологов, большая часть которых с рождения
АНАЛИЗЫ: Большая Жратва: Неочевидные взаимосвязи политики, разведки и ИТ-бизнеса
АНАЛИЗЫ: Большая Жратва: Неочевидные взаимосвязи политики, разведки и ИТ-бизнеса Автор: Киви БердПервые недели наступившего нового года принесли из США пару любопытных известий, относящихся к абсолютно разным областям высокой политики и компьютерной индустрии, а потому
ПИСЬМОНОСЕЦ: Большая софтверная резолюция
ПИСЬМОНОСЕЦ: Большая софтверная резолюция Автор: Илья Щуров VoyagerНе думал, что сподоблюсь вам написать, а поди ж ты…Вот, в 680-м номере порассуждал В. Щепетнев о писателях: мол, усредненно все пишут хорошо, а тем и сюжетов не хватает. Кончились они — вот беда. Успел Достоевский
Кафедра Ваннаха: Большая Белковая Сестра Ваннах Михаил
Кафедра Ваннаха: Большая Белковая Сестра Ваннах Михаил Опубликовано 19 мая 2011 года Жить без страшилок человечество не может. А вот к девяностым годам прошлого века оно чуть не оказалась без таковых. Самодемонтаж Советского Союза снял с повестки
Самая большая проблема iPhone 4 Михаил Карпов
Самая большая проблема iPhone 4 Михаил Карпов Опубликовано 02 июля 2010 года Новый телефон iPhone 4 компании Apple вышел совсем недавно, но все обсуждают не столько сам мобильник, сколько проблемы с ним связанные. Хотя не стоит забывать, что после выпуска iPhone 3G
ТЕМА НОМЕРА: «Большая восьмерка» большого пестрого дятла
ТЕМА НОМЕРА: «Большая восьмерка» большого пестрого дятла Автор: Леонид Левкович-МаслюкЕсть детские вопросы, которые не оставляют человека всю жизнь, - и я постепенно прихожу к выводу, что они-то и есть единственно важные и интересные. О чем разговаривают животные - один из
Большая статистика: наука, магия, искусство для искусства? Василий Щепетнёв
Большая статистика: наука, магия, искусство для искусства? Василий Щепетнёв Опубликовано 24 июня 2013 Долгое время я верил на слово Ильфу и Петрову. Статистика знает всё! Да и как не знать, если тысячи, нет, миллионы людей ежедневно пишут всякие
Большая новость Nokia Алексей Стародымов
Большая новость Nokia Алексей Стародымов Не секрет, что 27 января Apple собирается представить некий новый продукт. Как это обычно и бывает в случае компании из Купертино, заслуживающей доверия информации о грядущем устройстве нет: может, это будет интернет-планшет, а может —
Большая проблема Big data в России Денис Викторов
Большая проблема Big data в России Денис Викторов Опубликовано 07 февраля 2013За последнее время я посетил несколько мероприятий, посвященных большим данным. Скажу честно, меня не интересует эта технология сама по себе. Я не заказчик. И общее понимание сути Big data у меня вроде бы