Почему атомарность необходима для счетчика переменных в этом модуле ядра Linux, который запускает код только из своих фуLinux

Ответить
Anonymous
 Почему атомарность необходима для счетчика переменных в этом модуле ядра Linux, который запускает код только из своих фу

Сообщение Anonymous »

Я читаю этот пример модуля ядра Linux из руководства и не понимаю (в этой строке), почему переменная count в структуре Task_info должна быть атомной_t. Модуль имеет функцию mod_init, которая создает список и печатает, но не более того.
(примечание редактора: AFAICT не регистрирует никаких обратных вызовов или API-интерфейсов пользовательского пространства или любого другого способа запуска своего кода из чего-либо, кроме процесса начальной загрузки. Когда в этом вопросе говорится о «работающих модулях», я думаю, что это означает функции инициализации и выхода.)

Контекст: я знаю, что в ядре счетчики обычно защищаются атомарными операциями. Однако, поскольку мои знания о блокировках и связанных с ними темах недостаточны, я решил копнуть глубже, а не просто делать то, что мне сказали.
Вот что я исследовал:
  • Ядро Linux (это) работает в многоядерной среде;
  • Этот пример модуля не является многопоточным;
  • Однако планировщик может переключить текущий ЦП для выполнения других задач, а затем назначить другой ЦП для продолжения выполнения этой задачи (модуль ядра);
Кроме того, судя по тому, что я читал о многопоточности (что в данном случае НЕ так), причина, по которой мы хотим использовать атомарность или блокировку для защиты этого счетчика, заключается в случайности в планировании - при условии, что программу запускают два ЦП. одновременно:
В псевдосборке и в порядке временной метки:

Код: Выделить всё

           thread 1                              thread 2
mov rax, [memory_of_counter]
inc rax
(CPU context switches)
mov rax, [memory_of_counter]
inc rax
mov [memory_of_counter], rax

mov [memory_of_counter], rax
Проблема в том, что в конечном итоге счетчик увеличивается только один раз, а не дважды. Я полностью понимаю, почему мы хотим защитить счетчик в этом случае.
Однако я НЕ думаю, что это относится к этому модулю ядра. AFAIK, он не запускается одновременно (если только по умолчанию все модули ядра Linux не запускаются одновременно, но я не нашел ссылки на это), поэтому, когда происходит переключение контекста, следующий процессор продолжит выполнять следующую инструкцию:

Код: Выделить всё

           CPU 1                              CPU 2
mov rax, [memory_of_counter]
inc rax
(CPU context switches)

mov [memory_of_counter], rax
В этом случае счетчик корректно увеличивается на 1. Итак, мой вопрос: зачем нам вообще нужен атомный_t для счетчика? Это просто обучающий инструмент (в лаборатории действительно кое-что преподают об атомарности) или на это есть законные причины? Кстати, этот вопрос SO также предполагает, что атомарность здесь бесполезна - работает только один экземпляр этого модуля ядра (я ошибаюсь?), и этот модуль не обращается ни к каким общим ресурсам (переменная используется только сама по себе).

Подробнее здесь: https://stackoverflow.com/questions/798 ... module-whi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»