2016-06-25 2 views
-1

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

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

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

Q1. Почему это даже имеет значение в случае работы с атомным замком?

Q2. Каковы другие проблемы, возникающие при реализации операций блокировки в многопроцессорной среде с отключением прерываний?

ответ

0

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

Например, пусть L - объект LOCK, а L.status - «FREE», а X - это процесс, который имеет четыре потока T1, T2, T3, T4, и каждый из них работает на отдельных процессорах P1, P2 , P3, P4.

Давайте предположим, что псевдокод для ЗАМОК :: приобретают() выглядит следующим образом,

LOCK::acquire(){ 
     if(status==BUSY){ 
      lock.waitList.add(RunningThread); 
      TCB t == readyList.remove(); 
      thread_switch(RunningThread,t); 
      t.state=running;  

     } 
     else{ 
      status=BUSY; 
     } 


} 

Если отключить только прерывания, коды Т1, Т2, Т3, Т4 может по-прежнему работать на соответствующем процессоры. Предположим, что замок свободен в один момент.

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

Именно поэтому при реализации объектов блокировки для нескольких процессоров используются различные атомные операции, такие как test_and_set. Эти атомные операции позволяли бы только один поток из одних кодов блокировки множественного доступа.

Смежные вопросы