Раздел 28.5 Глава о блокировках книги OSTEP показывает, что отключение прерываний обеспечивает взаимное исключение между потоками в однопроцессорных системах. Я не понимаю: что, если поток, содержащий блокировку, вызывает некоторые системные вызовы в критической секции? В этом случае он освобождает ЦП перед снятием блокировки, и, таким образом, другой поток, ожидающий блокировки, может также войти в критическую секцию. Я прошел раздел, но не смог найти ответ.
Согласно слайду 2 других заметок для лекций , Internal events are thread does something to relinquish the CPU
и Preventing internal events is easy
. Затем слайд 3 объясняет ту же реализацию блокировки, отключая прерывания, что и в книге OSTEP.
Хотя я в некотором роде подтвердил, что действительно необходимо рассмотреть случай, когда поток, удерживающий блокировку, освобождает процессор самостоятельно, у меня все еще есть два вопроса:
- почему реализация в обеих вышеприведенных ссылках рассматривает возможность отключения прерываний только при игнорировании обработки внутренних событий?
- Почему внутренние события легко предотвратить? Как этого добиться? Единственное решение, которое я придумал, состояло в том, чтобы запретить потоку вызывать любые системные вызовы в критической секции, что, на мой взгляд, слишком ограничительно.
Может ли кто-нибудь поделиться со мной мудростью?