Вопрос

  1. Могут ли два процессора удерживать два «разных» спиновых замка одновременно одновременно?

  2. Итак ... это означает: CPU Sigle (Uniprocessor) не может удерживать два «разных» спинтования одновременно?

  3. Итак ... это означает: количество спинток на одном ЦП не может быть> 1.

PS: «Различный» подразумевающий спинлок, связанный с разными ресурсами памяти.


Кто-нибудь знает, как работает SpinLocks внутри страны? ... Я имею в виду, они замораживают автобус во время операций по тестированию? Я гуглил, но нет абсолютного ответа.

Это было полезно?

Решение

Спин-замок более или менее только общий int, к которому пишеты синхронизированы. Для процессора нет специального флага. Таким образом, вы можете получить более одного спина-блокировки. (Вы не должны ...)

Для предотвращения блокировки Uni-Processor-системы Windows повышает IRQL для DISPATCH_LEVEL. Отказ Процессор может иметь только одну «нить» DISPATCH_LEVEL, Так же фиксируя несколько спин-блокировков одновременно, безопасно в этих системах.

Реализация должна быть такая: (не на 100% верно и может расходиться из-за деталей)

LONG lock = 0;

KeAcquireSpinlock( ... )
{
    // raise irql. etc.
    while( InterlockedExchange( &lock, 1 ) != 0 ) 
        /* do nothing*/;
}

KeReleaseSpinLock( ... )
{
     InterlockedExchange( &lock, 0 );
     // lower irql ... etc.
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top