Два Спинлока на одном процессоре? - PullRequest
2 голосов
/ 05 августа 2010
  1. Могут ли два ЦП одновременно удерживать две "разные" спин-блокировки?

  2. Итак ... это означает: однопроцессорный (однопроцессорный) ЦПне может одновременно удерживать две «разные» спин-блокировки?

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

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


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

1 Ответ

2 голосов
/ 05 августа 2010

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

Для предотвращения блокировки однопроцессорной системы Windows поднимает IRQL до DISPATCH_LEVEL.Процессор может иметь только один «поток», работающий на DISPATCH_LEVEL, поэтому одновременная блокировка нескольких спин-блокировок безопасна в этих системах.и может расходиться из-за деталей)

LONG lock = 0;

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

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

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

...