Kernel

自旋鎖和信號量有什麼區別?

  • July 5, 2016

自旋鎖和信號量之間的基本區別是什麼?

兩者都管理有限的資源。我將首先描述二進制信號量(互斥鎖)和自旋鎖之間的區別。

自旋鎖執行繁忙的等待 - 即它保持循環執行:

while (try_acquire_resource ());
...
release();

它執行非常輕量級的鎖定/解鎖,但如果鎖定執行緒將被其他嘗試訪問相同資源的執行緒搶占,第二個執行緒將簡單地嘗試獲取資源,直到它用完 CPU 配額。

另一方面,互斥鎖的行為更像:

if (!try_lock()) {
   add_to_waiting_queue ();
   wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

因此,如果執行緒將嘗試獲取阻塞的資源,它將被掛起,直到它可用為止。鎖定/解鎖要繁重得多,但等待是“免費的”和“公平的”。

信號量是一個允許多次使用(從初始化中知道)次數的鎖——例如,允許 3 個執行緒同時持有資源,但不能更多。例如,它用於生產者/消費者問題或一般用於隊列:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

引用自:https://unix.stackexchange.com/questions/5214