死鎖的四個必要條件:
①資源有限②持有等待③不能搶占④迴圈等待條件
死鎖的應對方式:
①消除獨佔條件(即將資源無限增加或者變為共享)
②消除保持和請求條件(即乙個程序一次請求其所需要的所有資源,而不是請求一點資源做一點事情,但是這樣太過浪費。)
③消除非搶占條件(即允許對資源進行搶占)
④消除迴圈等待條件(即產生迴圈等待的原因是程序請求資源的順序是隨即的,乙個程序可以先請求a
資源再請求
b資源,也可以反過來,這時規定對於
a/b資源的請求順序,就可以避免死鎖)
銀行家演算法:死鎖避免演算法
程序間通訊:
popen和
pclose
popen(
const char*cmdstring
,const char* type(「r
」「w」))會限制性
fork
,然後exec
執行cmdstring
,然後根據r或者
w確定可讀還是可寫。
fifo,有名管道。
mkfifo
呼叫mknod
建立乙個
fifo
檔案。
無名管道:管道用於父子程序之間的通訊,pipe在
fork
前使用,之後父子程序各自關閉不用的埠,一端進行寫,一端進行讀。
有名管道:彌補了必須是有血緣關係的程序間才能進行的通訊,在記憶體中穿件fifo檔案,多個不相關的程序可以進行讀寫操作。管道都是半雙工的。
訊號量:訊號量是乙個計數器,用來控制多個程序對資源的訪問,經常用於控制資源的訪問。
共享記憶體:對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,多個程序都可以訪問。他專門針對程序通訊方式執行效率低而設計的,所以他是最快的ipc方式。
套接字:可以用於不同機器間的程序通訊。
執行緒間的通訊方式:
互斥鎖:同一時間僅僅能被乙個執行緒訪問的機制,而其他試圖再次進行加鎖的執行緒將被阻塞。
自旋鎖:自旋鎖和互斥鎖類似,但是自旋鎖不會引發互斥鎖的阻塞睡眠,而是一直處於忙等狀態,一直占用cpu的資源。所以在使用資源時間較短並且希望降低排程上花費的成本時使用自旋鎖。
讀寫鎖:每次只有乙個執行緒可以占有寫模式的讀寫鎖,但是多個執行緒可以同時占用讀模式的讀寫鎖。寫加鎖模式下,試圖再次進行寫操作的執行緒將阻塞。讀加鎖模式下,可以再次進行讀加鎖,寫加鎖將被阻塞。這樣容易造成寫操作的餓死,一種解決的方法是,當處於讀模式的讀寫鎖收到乙個寫操作的時候,便會阻塞之後的讀加鎖操作。
rcu鎖:讀,複製,更新鎖。實際上是對讀寫鎖的一種改進,他允許多個讀者和寫著同時訪問被保護的資源。寫者的同步開銷取決於使用的寫者間同步機制。寫者修改資料前先拷貝乙個副本,在副本上進行修改,當所有的讀者都已經完成讀操作之後,便會進行真正的拷貝,拷貝已經完成的寫操作的副本到源資源中。
條件變數:以原子的方式阻塞程序,知道某個特定的條件為真。條件變數通常與互斥鎖一起使用。條件變數的型別為pthread_cond_t。
程序間通訊和執行緒間通訊
程序間通訊 ipc,interprocess communication 是一組程式設計介面,讓程式設計師能夠協調不同的程序,使之能在乙個作業系統裡同時執行,並相互傳遞 交換資訊。這使得乙個程式能夠在同一時間裡處理許多使用者的要求。因為即使只有乙個使用者發出要求,也可能導致乙個作業系統中多個程序的執...
程序間通訊ipc 執行緒間通訊
程序間通訊 ipc,inter process communication 指至少兩個程序或執行緒間傳送資料或訊號的一些技術或方法。程序是計算機系統分配資源的最小單位 嚴格說來是執行緒 每個程序都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的程序互相訪問資源並進行協調工作,才有了程序間通...
程序間 執行緒間通訊方式總結
管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對共...