Posix

有人可以解釋 Linux 中的睡眠/喚醒動態嗎?

  • June 29, 2020

我正在研究作業系統中的鎖定機制,並遇到了這些 POSIX 函式:

pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m);
pthread_cond_signal(pthread_cond_t *c);

我完全理解睡眠/喚醒背後的想法。但我不確定這是如何在硬體中完成的,以及它如何影響調度……等等

我的理解是,當執行緒執行時: pthread_cond_wait() 它進入睡眠狀態(阻塞),但這實際上意味著什麼?是的,它被取消調度並進入特權隊列中某處的阻塞狀態,但是當另一個程序執行 pthread_cond_signal() 時,CPU 如何喚醒阻塞執行緒?核心是否在定時器中斷期間檢查所有條件變數,然後決定喚醒與已釋放執行緒關聯的執行緒?

我在網上的任何地方都找不到詳細的解釋,或者我看的不正確。

非常感謝任何幫助。

通過將程序/執行緒插入要調度的程序/執行緒隊列中來喚醒程序/執行緒。如果您查看 的來源signal就會發現有一個使用者空間執行緒列表等待條件變數,其中一個執行緒被futex系統呼叫喚醒。每次滴答檢查一組條件變數會非常慢……

所以當他們描述執行緒被阻塞時,並不意味著它被放入阻塞隊列中,就像等待 I/O 的執行緒一樣?

執行緒被實現為使用者空間和核心空間的混合體。就像等待 I/O 的執行緒/程序被放在核心空間列表中以在該特定 I/O 操作完成時重新調度一樣,等待條件變數的執行緒被放在此條件變數的使用者空間列表中. 所以你的問題的答案是“是和不是”。:-)

並且目前的執行緒實現多年來一直在優化,所以當實現不符合(更簡單的)原則時不要掛斷。

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