程序間對共享記憶體同步的三種方式

2021-09-11 07:16:29 字數 1491 閱讀 8501

如果我們有多個程序訪問一塊共享記憶體,有時候我們為了保證資料的一致我們不得不對共享記憶體中的資料採取同步措施。對於共享記憶體的同步基本上有以下三種方式。

一 記錄鎖(檔案鎖)

我們首先來看記錄鎖,記錄鎖的功能是當乙個程序正在讀或者修改檔案的某乙個部分時,它可以阻止其他程序修改同一檔案區。它其實是「位元組範圍鎖」,因為它鎖定的是檔案中的乙個區域,當然,也可能是整個檔案。

//posix標準只定義fock結構中必須有以下的資料成員,具體實現可以增加

具體使用:高階i/o之記錄鎖

二 訊號量

訊號量我們都很熟悉,為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 **的臨界區域。臨界區域是指執行資料更新的**需要獨佔式地執行。而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個執行緒在訪問它, 也就是說訊號量是用來調協程序對共享資源的訪問的。它可用於執行緒也可用於程序,但是通常我們不用訊號量來做執行緒間的同步,而是用互斥量,基本上對於共享記憶體的同步都用訊號量來做。

具體使用:linux程序間通訊-訊號量(semaphore)

三 互斥量

互斥量即我們常用的mutex,通常我們拿它來做執行緒間的同步,很少用來對程序間做同步,其實它也是可以做到的。

不過我們需要把互斥量放在多程序訪問的共享記憶體中,並且設定呼叫pthread_rwlockattr_setpshared linuxapi設定pthread_process_shared屬性這樣互斥量才能對多程序可見。

四 那麼對於這三種到底用哪種方式好呢,

首先我們看一看他們的效能差距。下圖顯示了在linux上,使用這3種不同技術進行鎖操作所需的時間。在每一種情況下,資源都被分配、釋放1000000次。這同時由3個不同的程序執行。

我們可以看到互斥量的效能是最好的,但是很難在多個程序間共享的記憶體中使用互斥量來恢復乙個終止的程序(不是很理解),其次,程序共享的互斥量屬性並沒有得到所有平台的支援。如果我們能單一資源加鎖,並且不需要訊號量的其他功能,則記錄鎖比訊號量要好。因為他使用起來更快,當程序終止時系統會管理遺留下來的鎖,但是總感覺用檔案鎖來同步對共享記憶體有點怪怪的,因為訊號量才是真正用來程序間同步的。最後說到訊號量雖然它沒有記錄鎖快,但是如果你對效能沒有非常苛刻的要求,不論從程式設計的難易度還是安全性來(記錄鎖要依賴乙個外部的檔案而訊號量則不需要要i)考慮訊號量都是乙個最好的選擇。

程序間共享記憶體的8種方式

無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方式。有名管道 named pipe 有...

程序間通訊的三種方式

程序通訊 終端 sigqueue 新的傳送訊號和訊息的函式類似於kill 無名管道 父子間mkfifo 守護程序 會話 使用者 會話其 對應乙個使用者,從乙個使用者的登陸到登出 程序組 乙個會話其利誘多個程序組,乙個程序組分為多個程序 終端 乙個會話可以有乙個中斷或沒有,在有的前提下,所以就會有乙個...

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

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