Как Linux синхронизирует счетчик вытеснения

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

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

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

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


person mousey    schedule 03.09.2010    source источник


Ответы (3)


Он увеличивает preempt_count() — обратите внимание на () — макрос определяется как:

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

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


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

  • Обработчики прерываний обычно могут быть прерваны другими обработчиками прерываний;
  • Обработчики прерываний могут работать на одном ядре ЦП, в то время как другой код ядра выполняется на другом ядре;
  • Прерывания обычно отключаются с помощью аппаратного механизма. Они, как правило, запоминают ожидающие прерывания, но не более одного на вектор прерывания.
person caf    schedule 03.09.2010
comment
Большое спасибо. не могли бы вы, пожалуйста, ответить на мои следующие вопросы, пожалуйста. - person mousey; 03.09.2010
comment
@caf и mousey: если inc/dec также вызывается обработчиками ошибок или обработчиками прерываний, будет ли это безопасно? Или есть какие-то правила, говорящие, что этого делать нельзя? Идеи? - person minghua; 26.05.2013
comment
@minghua: к нему нельзя обращаться в контексте прерывания - в любом случае в этом нет смысла. - person caf; 26.05.2013
comment
@caf: Я тоже так понимаю. Но посмотрите на netif_rx(), в конце он вызывает put_cpu(), который, в свою очередь, вызывает preempt_enable(). Также в обработчиках прерываний часто используется функция spin_unlock_irqrestore(), которая увеличивает preempt_count. Я правильно читаю код? Я смотрю, когда CONFIG_PREEMPT включен. - person minghua; 29.05.2013
comment
Оглядываясь вокруг, я полагаю, что счетчик управляется обработчиками ошибок и обработчиками прерываний. Поскольку обработчики ошибок и обработчики прерываний строго вложены друг в друга, они не вызывают искажения значения счетчика. Обработчики в контексте прерывания просто используют счетчик любого текущего потока, пока текущий поток не может быть переключен до тех пор, пока все обработчики не вернутся. Учитывая это, операция чтения-изменения-записи на самом деле не является атомарной. Это гарантирует, что после завершения R-M-W переключение контекста больше не произойдет до тех пор, пока не будет выполнено сопряжение preempt_disable() и пока счетчик не достигнет нуля. - person minghua; 29.05.2013

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

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

person minghua    schedule 03.06.2013

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

person msw    schedule 03.09.2010
comment
проверьте источник. Он не использует никаких конкретных системных инструкций. Он просто увеличивает - person mousey; 03.09.2010