void
sema_down (struct semaphore *sema)
{
old_level = intr_disable();
while (sema->value == 0)
{
list_push_back (&sema->waiters, &thread_current()->elem);
thread_block();
}
sema->value--;
intr_set_level (old_level);
}
上面的一段代碼是PintOS中的mechanim鎖定互斥鎖。 PintOS是針對單處理器系統的。因爲這個事實,僅僅禁用中斷就足夠了。另一方不可能採取互斥體。多處理器體系結構和Ring 3
所以,讓我們考慮一個多處理器設計:
void
sema_down (struct semaphore *sema)
{
old_level = intr_disable();
while (!lock cmpxchg(1,0)) // it is just pseudocode-idea
{
list_push_back (&sema->waiters, &thread_current()->elem);
thread_block();
}
intr_set_level (old_level);
}
old_level = intr_disable();
。它關閉中斷,但僅在該CPU的情況下才是關鍵。
它可以是一個原型在MP架構中獲取互斥量的函數。但是,list_push_back
存在問題。它也必須是安全的 - 多線程。但是,我們不能用互斥體來保證它的安全,因爲我們現在只是在實施它!
的主要問題是: 有沒有可能是兩個(或更多)的CPU是在環0級(內核)執行代碼?
而且,依賴於答案的第一個子問題:
如果沒有,有我上述沒有問題。但是 - 它如何實施?
如果是的話(這似乎不可能或很難實現),那麼我的上述考慮(這只是潛在問題的例子)。 我們是否需要使用
spinlocks
或lock-free structures
?
您是否可以將帖子縮減爲單個明確的問題?自旋鎖和無鎖定編程如果用於同步訪問非常短的關鍵部分(如更新列表的部分)並且無法避免AFAIK,那麼它們並不壞。 –
@MargaretBloom,我編輯,使它更清楚我問什麼。基本上,這是單題問題。我沒有擺脫我的子問題,因爲它們是依賴於上下文的,並且沒有必要將它們放在其他帖子中。 ( 我想是這樣)。我希望它對你更友善。 – Gilgamesz
我對此特別困惑:「*是否有可能兩個(或更多)CPU在Ring 3級別(內核)*上執行代碼」。爲什麼你會發現令人驚訝的是不同的CPU可以執行相同的代碼?爲什麼* Ring 3 *(這是用戶模式)旁邊有一個*內核*? –