Как spinlock предотвращает прерывание процесса?

Я прочитал ответ на этом сайте, в котором говорится, что спин-блокировка уменьшает накладные расходы с помощью переключений контекста, и после этого я прочитал утверждение учебника, связанное с этим:

Спин-блокировка не позволяет прерывать занятую ожидающую программу.

Мой вопрос в заголовке.

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

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

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

Для получения более подробной информации о моем замешательстве: я думаю, что для заданного цикла while

while (this == true);

не более чем расширенная версия

if (this == true);
if (this == true);
if (this == true);
...
...    
if (this == true); // (*)
...            
...
if (this == true);
...

Так почему же он не будет прерван на каком-то (*) шаге выше, по какой-то причине, например, временной интервал для процесса закончился и из очереди готовности выбран другой процесс?


person Kindred    schedule 25.12.2018    source источник
comment
Итак, ваш настоящий вопрос: как спин-блокировка предотвращает прерывание процесса?, не так ли? Кстати, выражение while (this == true); выражает spin (ожидание занятости), но не spinlock, что дополнительно обеспечивает защиту от переключения процесса.   -  person Tsyvarev    schedule 25.12.2018


Ответы (1)


Спин-блокировка действительно предотвращает прерывание процесса другими процессами. Реализация этого предотвращения зависит от ОС: поскольку ОС сама выполняет планирование процессов, она может пометить процесс как не подлежащий повторному планированию.

Но вы спрашиваете, будет ли справедливо, чтобы другие процессы помечали этот процесс как непрерываемый. На самом деле существует 2 (по крайней мере) понятия спин-блокировки: одно для потоков пространства ядра и одно для потоков пользовательского пространства:

  1. Процессы ядра, как часть ядра ОС, доверяют сами себе: если один процесс получает спин-блокировку, он рассчитывает снять ее в ближайшее время. После снятия спин-блокировки процесс больше не рассматривается как непрерывный и может быть переключен.

    В большинстве книг, описывающих спин-блокировки, говорится о процессах ядра (доверенных).

  2. Пользовательские процессы, напротив, не доверяют себе. Вот почему настоящая спин-блокировка, которая делает процесс непрерывным в течение бесконечного времени, не предоставляется для пользовательских процессов. В лучшем случае ОС предоставляет гибридную версию спин-блокировки и мьютекса: в течение короткого промежутка времени процесс, пытающийся захватить спин-блокировку, фактически отображается как непрерываемый. Но если время истекает до того, как процесс получит спин-блокировку, процесс переводится в состояние ожидания, что позволяет запускать другие процессы на том же ядре. Так что справедливость обеспечена.


На самом деле истинная спин-блокировка делает процесс непрерывным не только во время ожидания, но и пока он удерживает спин-блокировку. Это необходимо для избежания взаимоблокировок. Это работает для процессов ядра (которые доверяют себе). Что касается пользовательских процессов, ОС может предоставить процессу некоторое (также короткое) время непрерывного состояния, пока он не снимет спин-блокировку. Если время истекает до снятия спин-блокировки, процесс снова становится прерываемым.

person Tsyvarev    schedule 25.12.2018
comment
Думайте о такой спин-блокировке как о мьютексе. Критическая секция, обеспечиваемая мьютексом, может быть свободно прервана. - person Tsyvarev; 26.12.2018
comment
Так дело в том, что другие потоки не могут попасть в критическую секцию? И спасибо за вашу доброту - person Kindred; 26.12.2018
comment
Основная цель спин-блокировки и мьютекса в пользовательском пространстве — предоставить критический раздел с монопольным доступом. Этот аспект отвечает за корректность программы, и и спин-блокировка, и мьютекс справляются с этой задачей хорошо и без ограничений. В качестве дополнительной цели спин-блокировка пытается снизить затраты ЦП, связанные с переключением процессов в случае попытки захвата спин-блокировки, которая в настоящее время удерживается другим процессом. Эта задача не влияет на корректность программы. - person Tsyvarev; 26.12.2018
comment
можно запланировать запуск только одного потока? - Не совсем так. Только один поток может перейти к критической секции. Другие потоки могут находиться в состоянии ожидания или ожидания. - person Tsyvarev; 26.12.2018
comment
Ни один процесс не может войти в критическую секцию, пока эта секция удерживается кем-то другим. Удержание свойства не связано с тем, работает ли владелец в данный момент или нет. - person Tsyvarev; 26.12.2018
comment
Теперь я думаю, что я неправильно использовал слово упреждающий с прерванным, и вызываю себе много вопросов, ваш не может быть перенесен гораздо лучше, чем не может быть прерван, извините, это моя вина. - person Kindred; 27.12.2018