我試圖找到一種簡單的方法來確保通過同一命令的多個實例獨佔訪問資源,同時確保無論哪個進程都需要資源首先會先得到它。first-order-first-served fair mutex
如果我做的:
#! /bin/sh -
{ flock 3
some-possibly lengthy code
} 3<> some-resource
(flock(1)
使用flock(2)
),我得到的獨家訪問,但此腳本證實:
flock a-resource sleep 6 &
for i in 1 2 3 4 5; do
sleep 1
flock a-resource echo "$i" &
done
wait
,我們已經有了一個進程(sleep
)持有資源6秒,在此期間5個其他進程請求訪問資源,在sleep
已放棄資源後獲得資源的人是隨機的。
看起來像fcntl(F_SETLK)
或信號量 API不能保證首先提供的服務。
是否有Linux系統API(儘管我也有興趣知道關於可移植性還是來自其他Unices),這將允許這樣做,而不必在用戶空間中實現它?
如果不是這樣,這將是實現一種機制的過程中,要求對資源的獨佔訪問不需要專用主管過程,仲裁資源的分配和最好的方式,其中流程等待在資源被放棄之前資源將會睡眠(不會被調度),並且這將保證首先被訂購的服務)?
雖然這是一個理論問題,但爲了幫助理解問題,一個真實的例子可能是由某個Web服務器運行的CGI腳本,它基於Web客戶端輸入更新文件的內容,我想確保如果Joe先查詢該URL,如果露西之後詢問它,它將在露西之前得到響應。我想規範的方法是建立一個序列化請求的守護進程。我知道該怎麼做,我只想知道是否有一個Unix API會授予排它鎖,同時將請求的進程放入以FIFO方式處理的隊列中。或者,如果沒有,一些整潔/巧妙的機制(整潔,更少過度設計/笨重,我可以與,看到我自己的答案)做到這一點。
如果是希望只有一個進程一次訪問控制資源的FIFO,爲什麼您需要資源控制呢?即對於1 2 3中的x;做睡1;睡覺6; echo $ i;完成 – DarkHeart
@DarkHeart,那個例子只是爲了說明的目的。我們假設在一般情況下,我無法控制這些進程何時開始或需要多長時間。我只是希望他們排隊等待資源,沒有人跳過隊列。 –