忙等的演算法
執行緒阻塞喚醒實現不忙等
t0執行,t2還未執行
t0t1flag[0]=true
沒執行turn=1
沒執行未進入迴圈,獲得了資源
沒執行t0執行時,t1也執行了
t0進入迴圈判斷前,t1將自己的競爭標誌位置為true,導致t0一直迴圈等待直到t1執行了turn=0將許可權交給t0時,t0才結束迴圈獲得到了資源。
t0t1
flag[0]=true
flag[1]=true
turn=1
沒執行沒有許可權迴圈等待
沒執行沒有許可權迴圈等待
turn=0
獲得許可權,結束迴圈獲得了資源
沒有許可權迴圈等待
flag[0]=false取消了競爭
沒有許可權迴圈等待
沒執行對方了取消了競爭,結束了迴圈獲得了資源
條件變數
執行緒呼叫
描述pthread_cond_init
建立乙個條件變數
pthread_cond_destory
撤銷乙個條件變數
pthread_cond_wait
阻塞以等待乙個訊號
pthread_cond_signal
向另乙個執行緒傳送訊號喚醒它
pthread_cond_broadcast
向多個執行緒傳送訊號喚醒它們
條件變數與互斥鎖的一同使用的例子
#include
int value=0;
pthread_mutex_t mutex;
pthread_cond_t cond;
void
provider()
unlock
(&mutex);}
void
consumer()
if(value>0)
unlock
(&mutex)
;}
條件變數解決的是在一些需要等待條件滿足的情況時,如果只使用互斥量則需要先加鎖再判斷條件是否滿足,若不滿足則需要釋放鎖並sleep或重複加鎖判斷。一直迴圈會造成cpu浪費,sleep再迴圈又因為等待條件滿足而sleep的時間無法判斷因此sleep時間可能會過長。
因此在這種情況下利用用等待佇列加上通知喚醒方式的條件變數就顯得效能更加強勁了,它在條件不滿足時會把執行緒加入到等待佇列中,而其他執行緒的工作導致條件滿足時可以喚醒乙個等待佇列中的執行緒。這樣既避免了迴圈加鎖判斷帶來的cpu浪費又避免了sleep時間過長的缺點。
作業系統之程序與執行緒4 程序排程
程序排程策略依照不同的應用也有不同的策略,比如衛星導航系統需要實時性強 嵌入式系統需要省電等排程策略具體實現。而且面對不同的情況,有無窮盡的排程策略,因此本文只討論一般普通pc機的幾種一般排程策略。由前邊程序 執行緒切換的知識可知,程序排程策略即是 如何從程序就緒佇列中選取下乙個即將執行的程序 即作...
《現代作業系統》之 程序與執行緒
作業系統中最核心的概念是程序,它是對正在執行程式的乙個抽象,包括作業系統。乙個程序就是乙個正在執行程式的例項,包括程式計數器 暫存器和變數的當前值。下圖中有四個程序,但是只有乙個物理程式計數器。在執行其中某個程式時,例如執行a程序,此時程序a的邏輯程式計數器就會被載入到物理程式計數器中。並且在實際的...
作業系統之程序與執行緒3
訊息傳遞 訊息組成的鍊錶,放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少 管道只能承載無格式位元組流以及緩衝區大小受限等缺點 共享記憶體允許多個程序共享乙個給定的記憶體區域,這一段儲存區可以被共享的程序對映至自身的位址空間中,乙個程序寫入共享記憶體的資訊,可以被其他使用這個共享記憶...