Как Linux синхронизирует подсчет вытесненных - PullRequest
6 голосов
/ 03 сентября 2010

http://lxr.linux.no/linux+v2.6.35/include/linux/preempt.h#L21

Я просто пытаюсь получить источник Linux. Я видел этот подсчет preempt и как linux гарантирует, что подсчет preempt является атомарным? Код просто увеличивает значение.

Также у меня есть еще один вопрос. почему ручки прерываний должны поддерживать взаимное исключение. Потому что только один может выполнить за раз, верно?

Кроме того, когда прерывания отключены, что делает ОС? Игнорировать прерывания или поддерживать очередь?

Ответы [ 3 ]

7 голосов
/ 03 сентября 2010

Это увеличивает preempt_count() - обратите внимание, что () - это макрос определяется как:

#define preempt_count() (current_thread_info()->preempt_count)

Таким образом, он увеличивает переменную для потока, которая не требует какой-либо блокировки ибезопасен.


Лучше задать несколько вопросов в виде отдельных вопросов, но кратко:

  • Обычно обработчики прерываний могут прерываться другими обработчиками прерываний;
  • Обработчики прерываний могут работать на одном ядре ЦП, в то время как другой код ядра выполняется на другом ядре;
  • Прерывания обычно отключаются с помощью аппаратного механизма.Они, как правило, запоминают ожидающие прерывания, но не более одного на вектор прерывания.
1 голос
/ 03 июня 2013

Операция над переменной preempt_count не является атомарной. Планировщик гарантирует, что область кода между inc и dec preempt_count потока не будет выключена планировщиком. Переключение контекста из текущего потока в этой области кода может происходить только при последующих встроенных исключениях или прерываниях. После завершения первой операции inc дальнейшие обработчики увидят, что переменная ненулевая, поэтому переключение контекста не происходит. До завершения inc поток может быть отключен, но это нормально, так как код не достиг охраняемой области.

Некоторые подробности: определение атомарной переменной должно выглядеть примерно так: «Атомные переменные - это те, для которых операция чтения с изменением записи выполняется как одна инструкция без какого-либо прерывания» . Операция «Read-Modify-Write» на preempt_count может быть прервана другим обработчиком исключений или обработчиком прерываний, но только строго встроенным образом, это предусмотрено конструкцией ядра. Поскольку эти встроенные операции выполняются парами, значение preempt_count не будет в конечном итоге повреждено. Хотя операция R-M-W может быть прервана, и текущий поток может быть отключен (только если ни один из множества встроенных элементов inc не завершен), но это нормально, поскольку код не достиг защищаемой области. Как только поток переключается обратно, он продолжает завершать операцию R-M-W, и с этого момента текущий поток не будет выключен, пока все сопряженные dec (s) все не завершат.

0 голосов
/ 03 сентября 2010

Каждый современный процессор имеет некоторый вариант атомарной инструкции test-and-set .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...