本文主要對實現共享記憶體同步的四種方法進行了介紹。
共享記憶體是一種最為高效的程序間通訊方式,程序可以直接讀寫記憶體,而不需要任何資料的拷貝。它是ipc物件的一種。
為了在多個程序間交換資訊,核心專門留出了一塊記憶體區,可以由需要訪問的程序將其對映到自己的私有位址空間。程序就可以直接讀寫這一記憶體區而不需要進行資料的拷貝,從而大大提高的效率。
同步(synchronization)指的是多個任務(執行緒)按照約定的順序相互配合完成一件事情。由於多個程序共享一段記憶體,因此也需要依靠某種同步機制,如互斥鎖和訊號量等 。
訊號燈(semaphore),也叫訊號量。它是不同程序間或乙個給定程序內部不同執行緒間同步的機制。訊號燈包括posix有名訊號燈、 posix基於記憶體的訊號燈(無名訊號燈)和system v訊號燈(ipc物件)
方法
一、利用posix有名訊號燈實現共享記憶體的同步
有名訊號量既可用於執行緒間的同步,又可用於程序間的同步。
兩個程序,對同乙個共享記憶體讀寫,可利用有名訊號量來進行同步。乙個程序寫,另乙個程序讀,利用兩個有名訊號量semr, semw。semr訊號量控制能否讀,初始化為0。 semw訊號量控制能否寫,初始為1。
讀共享記憶體的程式示例**如下
semr = sem_open("mysem_r", o_creat | o_rdwr , 0666, 0);
if (semr == sem_failed)
semw = sem_open("mysem_w", o_creat | o_rdwr, 0666, 1);
if (semw == sem_failed)
if ((shmid = shmget(key, maxsize, 0666 | ipc_creat)) == -1)
if ((shmadd = (char *)shmat(shmid, null, 0)) == (char *)(-1))
while (1)
寫共享記憶體的程式示例**如下
。。。。。。
//同讀的程式
while (1)
方法
二、利用posix無名訊號燈實現共享記憶體的同步
posix無名訊號量是基於記憶體的訊號量,可以用於執行緒間同步也可以用於程序間同步。若實現程序間同步,需要在共享記憶體中來建立無名訊號量。
因此,共享記憶體需要定義以下的結構體。
typedef struct
shm;
讀、寫程式流程如下圖所示。
方法
三、利用system v的訊號燈實現共享記憶體的同步
system v的訊號燈是乙個或者多個訊號燈的乙個集合。其中的每乙個都是單獨的計數訊號燈。而posix訊號燈指的是單個計數訊號燈
system v 訊號燈由核心維護,主要函式semget,semop,semctl 。
乙個程序寫,另乙個程序讀,訊號燈集中有兩個訊號燈,下標0代表能否讀,初始化為0。 下標1代表能否寫,初始為1。
程式流程如下:
寫的流程和前邊的類似。
方法
四、利用訊號實現共享記憶體的同步
訊號是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式。利用訊號也可以實現共享記憶體的同步。
思路:
reader和writer通過訊號通訊必須獲取對方的程序號,可利用共享記憶體儲存雙方的程序號。
reader和writer執行的順序不確定,可約定先執行的程序建立共享記憶體並初始化。
利用pause, kill, signal等函式可以實現該程式(流程和前邊類似)。
linux實現共享記憶體同步的四種方法
華清遠見嵌入式學院講師。本文主要對實現共享記憶體同步的四種方法進行了介紹。共享記憶體是一種最為高效的程序間通訊方式,程序可以直接讀寫記憶體,而不需要任何資料的拷貝。它是ipc物件的一種。為了在多個程序間交換資訊,核心專門留出了一塊記憶體區,可以由需要訪問的程序將其對映到自己的私有位址空間。程序就可以...
共享記憶體的資料同步
在後台開發中,經常需要在多程序間進行資料共享,共享記憶體是乙個較常見的選擇。其他的ipc方式,包括磁碟檔案 訊號 套接字 管道 訊息佇列等,在需要傳輸大量資料時,效能都遜於共享記憶體。共享記憶體是一段可以被多程序共享的物理記憶體,各個程序在使用之前,需要將這段物理記憶體對映到本程序的虛擬位址空間,系...
共享記憶體 同步 互斥
共享記憶體沒有提供互斥機制,需要程式設計師自己實現。1.對於多個程序共享的共享記憶體來說,惟一可靠的互斥機制 就是帶sem undo的system v訊號量。原因 某乙個程序在持有鎖期間意外退出,所持有的鎖還沒有來得及釋放,這回造成 所有等待 p操作 這個鎖的程序 執行緒死鎖。所以不建議使用posi...