Я читаю Linux Kernel Development Роберта Лава и пытаюсь понять механизм синхронизации ядра. Я пытаюсь понять некоторые моменты, связанные с механизмом блокировки, который упоминается в книге следующим образом:
«в некоторых ситуациях не требуется спин-блокировка, но отключение выгрузки из ядра отключено. Наиболее частоиз этих ситуаций данные для каждого процессора. Если данные уникальны для каждого процессора, может быть, нет необходимости защищать их блокировкой, потому что только один процессор может получить доступ к данным. Если спин-блокировки не удерживаются, ядро предварительнои только что запланированное задание получило бы доступ к этой же переменной.
Следовательно, даже если бы это был однопроцессорный компьютер, к этой переменной можно было бы обращаться псевдо-одновременно несколькими процессами. Обычно этоДля переменной потребуется блокировка вращения (для предотвращения истинного параллелизма на многопроцессорных машинах). Однако, если бы это была переменная для процессора, для нее не требовалась бы блокировка. Для решения этой проблемы выгрузка ядра может быть отключена с помощью preempt_disable () "
Итак, учитывая мультиПроцессорная система здесь - я понимаю, что в то время как текущим процессом манипулируется переменная per-cpu, другой процесс может быть запланирован из-за SMP и пытаться манипулировать той же переменной per-cpu, поэтому выгрузка должна быть отключена, как объяснено в книге,Но один момент, который я не могу понять, это то, что если мы отключим только вытеснение ядра, и текущий процесс пытается манипулировать данными для каждого процессора, и в то же время прерывание произошло на текущем процессоре, и поскольку прерывание не былоотключено, процессор останавливает текущую задачу и начинает выполнять обработчик прерываний, теперь этот обработчик также хочет манипулировать той же переменной для каждого процессора. Таким образом, в этом случае переменная может содержать несогласованные данные?
Значит ли это, что прерывание также необходимо отключить на текущем процессоре, если переменная per-cpu также доступна из обработчика прерываний?
Платформа: Linux на x86