Почему отключение прерываний приводит к взаимному исключению в однопроцессорных системах? - PullRequest
0 голосов
/ 29 марта 2019

Раздел 28.5 Глава о блокировках книги OSTEP показывает, что отключение прерываний обеспечивает взаимное исключение между потоками в однопроцессорных системах. Я не понимаю: что, если поток, содержащий блокировку, вызывает некоторые системные вызовы в критической секции? В этом случае он освобождает ЦП перед снятием блокировки, и, таким образом, другой поток, ожидающий блокировки, может также войти в критическую секцию. Я прошел раздел, но не смог найти ответ.

Согласно слайду 2 других заметок для лекций , Internal events are thread does something to relinquish the CPU и Preventing internal events is easy. Затем слайд 3 объясняет ту же реализацию блокировки, отключая прерывания, что и в книге OSTEP.

Хотя я в некотором роде подтвердил, что действительно необходимо рассмотреть случай, когда поток, удерживающий блокировку, освобождает процессор самостоятельно, у меня все еще есть два вопроса:

  1. почему реализация в обеих вышеприведенных ссылках рассматривает возможность отключения прерываний только при игнорировании обработки внутренних событий?
  2. Почему внутренние события легко предотвратить? Как этого добиться? Единственное решение, которое я придумал, состояло в том, чтобы запретить потоку вызывать любые системные вызовы в критической секции, что, на мой взгляд, слишком ограничительно.

Может ли кто-нибудь поделиться со мной мудростью?

Ответы [ 2 ]

1 голос
/ 29 марта 2019

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

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

0 голосов
/ 29 марта 2019

Почему внутренние события легко предотвратить?

Вы цитировали слайд лекции:

Согласно слайду 2 другой лекционной заметки, Внутренние событияПоток делает что-то, чтобы освободить процессор

«Поток делает что-то, чтобы освободить процессор».Например, Thread выполняет системный вызов блокировки.Вы можете предотвратить это, если не напишите код , который освободит процессор, находясь внутри критической секции.

...