Как спин-блокировка предотвращает прерывание процесса? - PullRequest
0 голосов
/ 25 декабря 2018

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

Spin-lock делает ожидание занятымПрограмма не должна быть прервана.

Мой вопрос к названию.

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

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

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

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

while (this == true);

- не более чемзатраченная версия

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

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

1 Ответ

0 голосов
/ 26 декабря 2018

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

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

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

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

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


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

...