Действительно ли спин-блокировка полезна в единственном процессоре uni базовая архитектура?

Код получает значение window_height, с помощью которого он вычисляет переменную window_width, сохраняя при этом соотношение сторон изображения. Чтобы не допустить искажения.

import cv2

def resize(self,image,window_height = 500):
    aspect_ratio = float(image.shape[1])/float(image.shape[0])
    window_width = window_height/aspect_ratio
    image = cv2.resize(image, (int(window_height),int(window_width)))
    return image

img = cv2.imread(img_source)         #image location
img_resized = resize(img,window_height = 800)
cv2.imshow("Resized",img_resized)
cv2.waitKey(0)
cv2.destroyAllWindows()
13
задан RBerteig 22 June 2009 в 07:22
поделиться

4 ответа

Краткий ответ: нет

Согласно http://uw714doc.sco.com/en/man/html.3synch/Intro.3synch.html

Spin замки не должны использоваться в однопроцессорной системе. В лучшем случае спин-блокировка в однопроцессорной системе будет тратить ресурсы впустую, замедляя владельца блокировки; в худшем случае это приведет к взаимной блокировке процессора.

От: http://blogs.microsoft.co.il/blogs/sasha/archive/2008/08/10/practical-concurrency-patterns-spinlock .aspx

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

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

Да, спин-блокировки могут быть полезны и повышать эффективность некоторых операций. Однако обычно вам следует начинать с мьютекса, и если профилирование показывает, что это узкое место, вы можете рассмотреть возможность спин-блокировки.

10
ответ дан 1 December 2019 в 22:58
поделиться

Хорошее наблюдение: в однопроцессорной системе нет смысла крутить время ожидания ресурса, потому что вы можете переключить потоки раньше, чем позже. Мьютексы и семафоры делают именно это.

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

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

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

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

10
ответ дан 1 December 2019 в 22:58
поделиться

Да и нет; в зависимости от того, какая операционная система присутствует, присутствует ли она вообще и чего вы пытаетесь достичь.

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

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

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

Ожидание по условию, установленному в обработчике прерывания, или по условию, установленному в аппаратном регистре, - оба случая, когда один поток переднего плана в одном ядре может быть нет лучшего выбора, чем вращать флаг или регистр.

Изменить: Я попытался прояснить этот ответ, чтобы прояснить, что я говорю о синхронизации в целом больше, чем о реализации какой-либо конкретной ОС. спин-блокировка. Вопрос не в том t зависит от того, какая ОС (если есть), и также не помечен для какой-либо конкретной ОС.

0
ответ дан 1 December 2019 в 22:58
поделиться

Нет.

Для более подробного ответа см. « Как блокируются замки? » вместе с комментариями.

0
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: