在共享存儲器系統中,相互通信的進程共享某些數據結構或是共享存儲區,進程之間能夠通過這些空間進行通信。根據進程之間共享對象的類型將共享存儲器系統分為兩種:基於共享數據結構的通信方式、基於共享存儲區的通信方式。
基本介紹
- 中文名:共享存儲器系統
- 外文名:Shared-Memory System
- 兩種類型:共享數據結構、共享存儲區
- 共享數據結構:效率低,只適用於傳遞少量信息
- 共享存儲區:效率高,可以傳送較多的數據
- 針對Linux:共享區的建立、操縱、附接與斷開
定義,類型,共享數據結構,共享存儲區,共享存儲實現,
定義
共享存儲器系統的方式是指,相互通信的進程共享某些數據結構或共享存儲區來交換或傳遞數據。
類型
共享數據結構
進程之間能夠通過某種類型的數據結構交換信息,如生產者-消費者問題中,便是利用有界緩衝區這種數據結構進行通信。在這種方式中,設定共享數據結構及對進程間同步的處理都是程式設計師的職責,這無疑增加了程式設計師的負擔,而作業系統卻只需提供共享存儲器。這種通信方式的效率低,因此只適用於傳遞少量信息。
共享存儲區
在提供這種通信方式的系統中,存儲器中劃出一塊共享存儲區,進程間可通過對共享存儲區中的數據進行讀或寫來實現通信。進程在通信前應向系統申請共享存儲區中的一個分區,並指定該分區的關鍵字,若系統已經給其他進程分配了這樣的分區,則將該分區的描述符返回給申請者,接著,申請者把獲得的共享存儲區連線到本進程上,此後便可像讀、寫普通存儲器一樣地讀、寫存儲分區。此種方法效率高,可以傳送較多的數據。
共享存儲實現
共享存儲區的建立
當進程要利用共享存儲區與另一進程進行通信時,必須先利用系統調用shmget()建立一塊共享存儲區,並提供該共享存儲區的名字key和共享存儲區以位元組為單位的長度size等參數。若系統中已經建立了指定的共享存儲區,則該系統調用將返回該共享存儲區的描述符shmid;若系統未建立,便為進程建立一個指定大小的共享存儲區。
共享存儲區的操縱
如同訊息機制一樣,可以用系統調用shmctl()對共享存儲區的狀態信息進行查詢,如長度、所連線的進程數、創建者標識符等等;也可設定或修改其屬性,如共享存儲區的許可權、當前連線的進程計數等;還可用來對共享存儲區加鎖或解鎖,以及修改共享存儲區標識符等。
共享存儲區的附接與斷開
當進程已經建立了共享存儲區或已獲得了其描述符後,還應利用系統給調用shmat()將該共享存儲區附接到用戶給定的某個進程的虛地址shmaddr上,並指定該存儲區的訪問屬性,即指明該區是唯讀,還是可讀可寫。此後,該共享存儲區便成為該進程虛地址空間的一部分。進程可採取與對其虛地址空間一樣的存取方法來訪問。當進程不再需要該共享存儲區時,再利用系統調用shmdt()把該區與進程斷開。