共享記憶體與程序通訊通訊方式

2022-05-03 11:48:25 字數 1939 閱讀 4797

不同程序之間共享的記憶體通常為同一段物理記憶體。程序可以將同一段物理記憶體連線到他們自己的位址空間中,所有的程序都可以訪問共享記憶體中的位址。共享記憶體是兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。

原理

在linux中,每個程序都有屬於自己的程序控制塊(pcb)和位址空間,並且都有乙個與之對應的頁表,負責將程序的虛擬位址與實體地址進行對映,通過記憶體管理單元(mmu)進行管理。兩個不同的虛擬位址通過頁表對映到物理空間的同一區域,它們所指向的這塊區域即共享記憶體。

共享記憶體是在程序建立之前,考慮到資料通訊的需要而建立的,程序的位址空間是在程序建立的時候分配的

1、程序的位址空間是在建立之初就分配好了

2、程序的位址空間是虛擬記憶體,32位機器上程序空間的大小為4g(0~3g是使用者空間,3~4g是核心空間)

3、如果某個程序向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他程序。

4、所以共享記憶體的程序之間 ,讀寫操作要互斥,確保乙個程序在寫的時候不能被讀,因此我們使用訊號量來實現同步與互斥

訊號量的使用主要是用來保護共享資源,使得資源在乙個時刻只有乙個程序(執行緒)所擁有

訊號量的值為正的時候,說明它空閒。

所測試的執行緒可以鎖定而使用它。若為0,說明它被占用,測試的執行緒要進入睡眠佇列中,等待被喚醒。

對訊號量的操作

管道、訊息佇列、共享記憶體,訊號量,socket,訊號,檔案鎖

1、匿名管道:

2、命名管道: 

概念:在核心中申請一塊固定大小的緩衝區,程式擁有寫入和讀取的權利,沒有血緣關係的程序也可以程序間通訊。

3、特點:

1、面向位元組流,

2、生命週期隨核心

3、自帶同步互斥機制。

4、半雙工,單向通訊,兩個管道實現雙向通訊。

概念:在核心中建立一佇列,佇列中每個元素是乙個資料報,不同的程序可以通過控制代碼去訪問這個佇列。

訊息佇列提供了⼀個從⼀個程序向另外⼀個程序傳送⼀塊資料的⽅法。

每個資料塊都被認為是有⼀個型別,接收者程序接收的資料塊可以有不同的型別值

訊息佇列也有管道⼀樣的不⾜,就是每個訊息的最⼤⻓度是有上限的(msgmax),

每個訊息隊 列的總的位元組數是有上限的(msgmnb),系統上訊息佇列的總數也有⼀個上限(msgmni)

特點:

1、 訊息佇列可以認為是乙個全域性的乙個鍊錶,鍊錶節點鐘存放著資料報的型別和內容,有訊息佇列的識別符號進行標記。

2、訊息佇列允許乙個或多個程序寫入或者讀取訊息。

3、訊息佇列的生命週期隨核心。

4、訊息佇列可實現雙向通訊。

1、概念

在核心中建立乙個訊號量集合(本質是個陣列),陣列的元素(訊號量)都是1,使用p操作進行-1,使用v操作+1,

1、p(sv):如果sv的值⼤大於零,就給它減1;如果它的值為零,就掛起該程序的執⾏ 。

2、v(sv):如果有其他程序因等待sv而被掛起,就讓它恢復運⾏,如果沒有程序因等待sv⽽掛起,就給它加1。

pv操作用於同一程序,實現互斥。

pv操作用於不同程序,實現同步。

2、功能:

對臨界資源進行保護。

1、概念:

將同一塊物理記憶體一塊對映到不同的程序的虛擬位址空間中,實現不同程序間對同一資源的共享。

共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。

2、特點:

1、不用從使用者態到核心態的頻繁切換和拷貝資料,直接從記憶體中讀取就可以。

2、共享記憶體是臨界資源,所以需要操作時必須要保證原子性。使用訊號量或者互斥鎖都可以。

3、生命週期隨核心。

所有的以上的方式都是生命週期隨核心,不手動釋放就不會消失。

程序間通訊方式 共享記憶體

所有的函式共用標頭檔案 include include include 3.1建立共享記憶體 shmget 函式 int shmget key t key,size t size,int shm 成功返回共享記憶體的id,出錯返回 1 1 第乙個引數key是長整型 唯一非零 系統建立ipc通訊 訊息...

程序通訊 共享記憶體

定義 共享記憶體,就是通過核心操作,在記憶體上開闢一塊供多個程序共同訪問的記憶體塊。這塊記憶體塊的建立和 銷毀是由核心來控制 當然,也可以在程序內部呼叫系統庫函式來建立和銷毀,類似於訊息機制和訊號 量機制 在這個記憶體塊上,程序可以像操作記憶體一樣操作共享區記憶體。作用 第乙個,就是提供程序間大資訊...

程序通訊共享記憶體

共享記憶體是允許多個程序共享記憶體 共享記憶體結構 struct shmid ds struc ipc permshm perm 指向該記憶體指標 int shm segsz 共享記憶體的大小 ushort shm lkcnt 共享記憶體被鎖定的時間 pid t shm cpid 最近呼叫shomp...