2016-05-27 5 views
1

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

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

Итак, мой вопрос (ы):

  1. Как мониторы реализованы в Windows?

  2. Можно ли вырезать нить, пока она находится в середине критической секции?

ответ

6

Windows спроектирована так, что потоки, даже при работе в режиме ядра, are always preemptible and always interruptible. Таким образом, критические разделы, конечно же, не реализуются путем отключения прерываний и не препятствуют преодолению.

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

В Windows, monitors are usually implemented using condition variables,, которые предоставляются планировщиком потоков как примитив. Я считаю, что это относится и к POSIX.

+0

Большое спасибо. Конечно, то, что вы говорите, имеет большой смысл. То, что я ошибочно предполагал, заключалось в том, что * при приобретении и выпуске блокировки *, процедура переходила бы в режим ядра, точно так же, как это делает, когда код пользователя создает «CreateThread» или «ThreadFork» в любом OS API. Хотя он запускает поток в пользовательском режиме, он должен добраться до * корня потока * и скопировать материал из стека в регистры. –

+0

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

+0

Я прочитаю документацию, с которой вы связались, но не могли бы вы быстро удовлетворить мое любопытство по поводу следующего вопроса? Является ли покупка блокировки в Windows запущена в пользовательском режиме? –

2

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

Кроме того, даже с отключенными прерываниями другие потоки могут работать на современном оборудовании, поскольку большинство процессоров теперь представляют собой несколько ядер. В наши дни очень сложно найти одноядерный процессор. С несколькими ядрами несколько потоков могут выполняться параллельно, не вытесняя друг друга.

+0

Благодарю вас. Вы делаете интересное наблюдение за отключением прерываний перед лицом многоядерных процессоров. –