Можно ли реализовать Test and Set в программном обеспечении без аппаратной поддержки?

Вот тест и набор, написанные в программном обеспечении:

boolean TestAndSet(boolean *target) {
    boolean rv = *target;
    *target = TRUE;
    return rv;
}

и

do {
    while(TestAndSetLock(&lock))
        ; // do nothing
        // critical section
    lock = FALSE;
        // remainder section
} while(TRUE);

Можем ли мы использовать этот механизм в процессорах, которые не поддерживают проверку и установку на аппаратном уровне? Если да, то как обеспечивается атомарность?


person Arjun Sreedharan    schedule 04.08.2014    source источник
comment
Существуют запрограммированные алгоритмы синхронизации (не тестировать и не устанавливать, но вы все равно можете настроить надежные блокировки), такие как алгоритм Деккера, которые полагаются только на атомарность операций чтения и записи в память. Без такой атомарности при чтении и записи трудно понять, как закодировать какой-либо спин-цикл, ожидающий завершения другого процесса; вы никогда не могли быть уверены, что проверяемый вами флаг завершения процессора был надежным.   -  person Ira Baxter    schedule 04.08.2014
comment
Что касается алгоритма Деккера: вы должны знать об аппаратном механизме, который может нарушить алгоритм. Например. порядок записи-чтения на IBM-370.   -  person Philipp    schedule 04.08.2014


Ответы (2)


Вы можете использовать алгоритм взаимного исключения «пекарня» Лампорта на машинах без TAS/CAS, чтобы ограничить доступ к «атомарному» (защищенному) значению.

http://www.disi.unige.it/person/DelzannoG/SO1/AA0607/bakery.htm

Это усложняется только в том случае, если у вас нет разумно ограниченных процессов «N».

person dbrower    schedule 04.08.2014

Тест и установка не могут быть реализованы в программном обеспечении без аппаратной поддержки так, как вы предложили.

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

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

person xxa    schedule 21.09.2014