Может ли процесс / поток выполняться при отключенных прерываниях? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть следующая «притворная» реализация операции семафора wait(). Предположим, одноядерное окружение с одним процессором:

wait () { 
 Disable interrupts
 sem->value--
 if (sem->value < 0) {
 save_state (current) ; //"Manually" save the context of the current running process
 State[current] = Blocked; //Block it
 Queue current to block queue;
 current = Select from the ready queue; //Select another process to run
 State[current] = Running; //Put the retrieved process in the running state
 restore_state (current); //"Manually" restore the context of the new process
 }
 Enable interrupts
}

Реализация состоит в том, чтобы проверить наши знания по отключению прерываний для защиты критической секции. Один из вопросов состоит в том, чтобы определить, выполняется ли новый процесс, выбранный из очереди готовности в wait(), в то время как прерывания отключены или после того, как они включены.

Я борюсь с ответом, каким я его вижудвумя способами.

  • (Очевидный ответ): процессу разрешено запускаться, когда прерывания отключены, поскольку, очевидно, это то, для чего предназначен код. Но у меня есть сомнения ...
  • Когда прерывания отключены, ядро ​​не знает о каких-либо изменениях, внесенных в рабочее состояние / заблокированное состояние. Распределение регистров и других ресурсов может быть выполнено только после разрешения прерываний.

Буду признателен за любые подсказки.

1 Ответ

0 голосов
/ 13 октября 2019

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

Для некоторых процессоров при некоторых условиях (например, 80x86 с IOPL, установленным в 3) ОС может разрешить процессу / потоку отключить прерывания IRQ, и можно запустить процесс / потокс отключенными IRQ, но без возможности включать / отключать IRQ (например, отключать IRQ в ядре непосредственно перед возвратом в пространство пользователя);но из-за проблем с безопасностью очень немногие операционные системы могут это допустить.

Однако;Семафоры также включают взаимодействие с планировщиком (блокирование задачи до тех пор, пока она не может получить семафор, и разблокирование задачи, когда она может получить семафор), и планировщик (его очереди «готов к выполнению», состояния процессов / потоков и т. д.) ивозможность доступа к полному состоянию процесса / потока (например, специальные регистры «только для ядра», например, какой регистр управляет тем, какое виртуальное адресное пространство выбрано в настоящее время) также обычно доступны только из кода ядра (и не разрешены для доступа из пространства пользователя(процессом / потоком).

Другими словами;разумно (игнорируя причудливые и маловероятные случаи) предположить, что более 50% кода в вашей функции wait() не может быть реализовано в пространстве пользователя и должно быть реализовано в ядре;и поэтому разумно предположить, что ваша функция wait() предназначена для реализации в ядре (и не предназначена для реализации в пользовательском пространстве процессом или потоком) .

...