Блокировка для переменной процессора - PullRequest
0 голосов
/ 01 ноября 2019

Я читаю Linux Kernel Development Роберта Лава и пытаюсь понять механизм синхронизации ядра. Я пытаюсь понять некоторые моменты, связанные с механизмом блокировки, который упоминается в книге следующим образом:


«в некоторых ситуациях не требуется спин-блокировка, но отключение выгрузки из ядра отключено. Наиболее частоиз этих ситуаций данные для каждого процессора. Если данные уникальны для каждого процессора, может быть, нет необходимости защищать их блокировкой, потому что только один процессор может получить доступ к данным. Если спин-блокировки не удерживаются, ядро ​​предварительнои только что запланированное задание получило бы доступ к этой же переменной.

Следовательно, даже если бы это был однопроцессорный компьютер, к этой переменной можно было бы обращаться псевдо-одновременно несколькими процессами. Обычно этоДля переменной потребуется блокировка вращения (для предотвращения истинного параллелизма на многопроцессорных машинах). Однако, если бы это была переменная для процессора, для нее не требовалась бы блокировка. Для решения этой проблемы выгрузка ядра может быть отключена с помощью preempt_disable () "


Итак, учитывая мультиПроцессорная система здесь - я понимаю, что в то время как текущим процессом манипулируется переменная per-cpu, другой процесс может быть запланирован из-за SMP и пытаться манипулировать той же переменной per-cpu, поэтому выгрузка должна быть отключена, как объяснено в книге,Но один момент, который я не могу понять, это то, что если мы отключим только вытеснение ядра, и текущий процесс пытается манипулировать данными для каждого процессора, и в то же время прерывание произошло на текущем процессоре, и поскольку прерывание не былоотключено, процессор останавливает текущую задачу и начинает выполнять обработчик прерываний, теперь этот обработчик также хочет манипулировать той же переменной для каждого процессора. Таким образом, в этом случае переменная может содержать несогласованные данные?

Значит ли это, что прерывание также необходимо отключить на текущем процессоре, если переменная per-cpu также доступна из обработчика прерываний?

Платформа: Linux на x86

1 Ответ

1 голос
/ 02 ноября 2019

Итак, рассматривая многопроцессорную систему здесь - я понимаю, что в то время как текущим процессом манипулируется переменная per-cpu, другой процесс может планироваться из-за SMP и пытаться манипулировать той же самой переменной per-cp, отсюда и выгрузкадолжен быть отключен, как описано в книге.

Я думаю, что SMP здесь не играет никакой роли, потому что переменная для каждого процессора (не разделяется между процессорами). Другой процесс может быть запланирован, потому что наступит прерывание планировщика, которое не имеет отношения к SMP и может происходить также в однопроцессорных системах. Чтобы избежать этого преимущественного отключения используется. Для однопроцессорных систем с CONFIG_PREEMPT_ENABLE ядро ​​Linux говорит, что spinlock / unlock = preemp disable / enable

Так значит ли это, что прерывание также необходимо отключить натекущий процессор, если переменная per-cpu также доступна из обработчика прерываний?

Да, это так! И это также верно для однопроцессорных систем. В этом случае вы должны использовать irqsave API (или его эквиваленты):

spin_lock_irqsave(&xxx_lock, flags);
... critical section here ..
spin_unlock_irqrestore(&xxx_lock, flags);

Для однопроцессорного ядра эта спин-блокировка превратится в локальное включение / отключение irq. В системах SMP спин-блокировка - это фактическая спин-блокировка, реализованная посредством отключения / включения cmpxchg + irq.

...