Kernel
自旋鎖和信號量有什麼區別?
自旋鎖和信號量之間的基本區別是什麼?
兩者都管理有限的資源。我將首先描述二進制信號量(互斥鎖)和自旋鎖之間的區別。
自旋鎖執行繁忙的等待 - 即它保持循環執行:
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)