天天看點

Linux IPC實踐(1) -- 概述

   程序同步: 多個程序需要互相配合共同完成一項任務。

   程序互斥: 由于各程序要求共享資源,而且有些資源需要互斥使用,是以各程序間競争使用這些資源,程序的這種關系為程序的互斥;系統中某些資源一次隻允許一個程序使用,稱這樣的資源為臨界資源或互斥資源, 而在程序中涉及到互斥資源的程式段叫臨界區.

   Linux下的程序通信手段基本上是從UNIX平台上的程序通信手段繼承而來的。而對UNIX發展做出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(加州大學伯克利分校的伯克利軟體釋出中心)在程序間的通信方面的側重點有所不同。前者是對UNIX早期的程序間通信手段進行了系統的改進和擴充,形成了“system V IPC”,其通信程序主要局限在單個計算機内;而BSD則跳過了該限制,形成了基于套接口(socket)的程序間通信機制。而Linux則把兩者的優勢都繼承了下來.

程序間通信分類

   檔案

   檔案鎖

   管道(pipe)和命名管道(FIFO)

   信号(signal)

   消息隊列

   共享記憶體

   信号量

   互斥量

   條件變量

   讀寫鎖

   套接字(socket)

Linux IPC實踐(1) -- 概述

IPC對象的持續性

   随程序持續:一直存在直到打開的最後一個程序結束。(如pipe和FIFO(程序結束,資料删除))

   随核心持續:一直存在直到核心自舉或顯式删除(如System V消息隊列、共享記憶體、信号量)

   随檔案系統持續:一直存在直到顯式删除,即使核心自舉還存在。(POSIX消息隊列、共享記憶體、信号量如果是使用映射檔案來實作)

     [IPC對象是由Linux核心管理的]

   死鎖是指多個程序之間互相等待對方的資源,而在得到對方資源之前又不釋放自己的資源,這樣,造成循環等待的一種現象。如果所有程序都在等待一個不可能發生的事,則程序就死鎖了。

死鎖産生的四個必要條件

(1)互斥條件

   程序對資源進行排它性使用,即在一段時間内某資源僅為一個程序所占用。 

(2)請求和保持條件

   當程序因請求資源而阻塞時,對已獲得的資源保持不放。 

(3)不可剝奪條件

   程序已獲得的資源在未使用完之前,不能被剝奪,隻能在使用完時由自己釋放。 

(4)環路等待條件

   各個程序組成封閉的環形鍊,每個程序都等待下一個程序所占用的資源

死鎖預防

   資源一次性配置設定:(破壞請求和保持條件)

   可剝奪資源:破壞不可剝奪條件)

   資源有序配置設定法:(破壞循環等待條件)

死鎖避免

   預防死鎖的幾種政策,會嚴重地損害系統性能。是以在避免死鎖時,要施加較弱的限制,進而獲得較滿意的系統性能。

   由于在避免死鎖的政策中,允許程序動态地申請資源。因而,系統在進行資源配置設定之前預先計算資源配置設定的安全性。若此次配置設定不會導緻系統進入不安全狀态,則将資源配置設定給程序;否則,程序等待。其中最具有代表性的避免死鎖算法是銀行家算法。

銀行家算法

為保證資金的安全,銀行家規定: 

   (1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客; 

   (2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量

   (3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款

   (4) 當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金. 

哲學家就餐問題

五個哲學家圍在一個圓桌就餐,每個人都必須拿起兩把叉子才能用餐;

哲學家就餐問題解法:

   (1)服務生解法: 将服務生看作是一個管理者, 哲學家在拿叉子之前需要征得服務生的同意;

   (2)最多4個哲學家;

   (3)僅當一個哲學家兩邊筷子都可用時才允許他拿筷子;

   (4)給所有哲學家編号,奇數号的哲學家必須首先拿左邊的筷子,偶數号的哲學家則反之;

   信号量和P、V原語由Dijkstra(迪傑斯特拉)提出, 迪傑斯特拉的三大貢獻: goto有害, PV原語, 迪傑斯塔拉最短路算法; 

信号量值含義

   S>0:S表示可用資源的個數

   S=0:表示無可用資源,無等待程序

   S<0:|S|表示等待隊列中程序個數

PV操作

繼續閱讀