日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

使用 UNIX System V IPC 機制共享應(yīng)用程序數(shù)據(jù)( 三 )


sunbox$ ./mq_client
My key is 704654099
Message identifier is 2
Hello, world! (104)
客戶端和服務(wù)器的輸出表明,它們得出了相同的 IPC 密鑰,因為它們都引用同一個文件和標(biāo)識符 。服務(wù)器創(chuàng)建了 IPC 實例,內(nèi)核為該實例分配了值 2,并且客戶端應(yīng)用程序知道這一點 。這樣,客戶端從消息隊列提取回“Hello, world!就沒什么奇怪的了 。
此示例顯示了最簡單的情況 。消息隊列對于短期進(jìn)程是有用的,例如將工作提交給重負(fù)荷后端應(yīng)用程序(例如某個批處理應(yīng)用程序)的 Web 事務(wù) 。客戶端也可以是服務(wù)器,并且多個應(yīng)用程序可以向隊列提交消息 。消息類型字段允許應(yīng)用程序?qū)⑾l(fā)送給特定的讀取器 。
使用信號量鎖定資源
進(jìn)程之間的通信不需要涉及到發(fā)送大量的數(shù)據(jù) 。實際上,單個位可能就足以指示某個進(jìn)程在使用某個資源 。請考慮兩個需要訪問某個硬件部分的進(jìn)程,但是一次只有一個進(jìn)程能夠使用該硬件 。每個進(jìn)程就包含引用計數(shù)器的點達(dá)成一致 。如果一個進(jìn)程讀取該計數(shù)器并看到其值為 1,則它就知道另一個進(jìn)程正在使用該硬件 。如果該計數(shù)器的值為 0,則該進(jìn)程就可以自由使用該硬件資源,前提是在該硬件操作期間將計數(shù)器設(shè)置為 1 并在結(jié)束操作時將其重置為 0 。
此場景存在兩個問題:第一個問題不過就是設(shè)置共享計數(shù)器并就其位置達(dá)成一致,再沒有比這麻煩的了 。第二個問題是鎖定硬件資源所需要的獲取和設(shè)置操作不是原子的 。如果一個進(jìn)程在讀取計數(shù)器時,其值為 0,但是在它還沒有機會將計數(shù)器設(shè)置為 1 之前,另一個進(jìn)程已搶先讀取了該計數(shù)器,則第二個進(jìn)程就能夠讀取和設(shè)置計數(shù)器 。兩個進(jìn)程都會認(rèn)為它們可以使用該硬件 。沒有辦法知道另一個或其他進(jìn)程是否會設(shè)置該計數(shù)器 。這稱為爭用條件 。信號量通過提供一個公共應(yīng)用程序接口,以及通過實現(xiàn)原子測試和設(shè)置操作,從而同時解決了這兩個問題 。
信號量的 SysV 實現(xiàn)比上述解決方案更通用 。首先,信號量的值不需要是 0 或 1;它可以是 0 或任何正數(shù) 。其次,可以執(zhí)行一系列信號量操作,與用于 msgrcv 的 type 參數(shù)非常類似 。這些操作作為一個指令集提供給內(nèi)核,并且這些指令要么全部運行,要么一個也不會運行 。內(nèi)核要求將這些指令放在一個名為 sembuf 的結(jié)構(gòu)中,該結(jié)構(gòu)具有以下成員(按順序):
sem_num:描述正在操作該集合中的哪一個信號量 。
sem_op:一個有符號整數(shù),其中包含要執(zhí)行的指令或測試 。
sem_flg:熟悉的 IPC_NOWAIT 標(biāo)志(它指示測試應(yīng)該立即返回還是阻塞直至通過)和 SEM_UNDO(它在進(jìn)程提前退出時導(dǎo)致撤銷該信號量操作)的組合 。
sem_op 是放置許多配置的地方:
如果 sem_op 為 0,則測試 sem_num 以確定它是否為 0 。如果 sem_num 為 0,則運行下一個測試 。如果 sem_num 不為 0,則在未設(shè)置 IPC_NOWAIT 時,操作將阻塞直至信號量變?yōu)?0,而在設(shè)置了 IPC_NOWAIT 時,則跳過其他測試 。
如果 sem_op 是某個正數(shù),則將信號量的值加上 sem_op 的值 。
如果 sem_op 是一個負(fù)整數(shù),并且信號量的值大于或等于 sem_op 的絕對值,則從信號量的值減去該絕對值 。
如果 sem_op 是一個負(fù)整數(shù),并且信號量的值小于 sem_op 的絕對值,則在 IPC_NOWAIT 為 true 時立即停止測試的執(zhí)行,而在該值為 false 時則阻塞,直至信號量的值變得大于 sem_op 的絕對值 。
清單 5 中的示例闡明了信號量的使用,其中研究了一個可同時運行多次的程序,但是該程序確保一次只有一個進(jìn)程處于關(guān)鍵部分 。其中使用了簡單情況下的信號量;當(dāng)信號量的值為 0 時釋放資源 。

推薦閱讀