共享記憶體和訊號

2021-06-01 02:48:37 字數 1121 閱讀 7865

1.共享記憶體概述

共享記憶體允許兩個或更多程序共享一給定的儲存區。因為資料不需要在各個程序之間複製,所以這是最快的一種程序間通訊方式。使用共享記憶體時的關鍵點在於如何在多個程序之間對一給定的儲存區進行同步訪問。

例如若乙個程序正在將資料放入共享記憶體區,則在它做完這一操作之前,其他程序不應該去取這些資料。通常,訊號量被用來實現對共享記憶體訪問的同步。如果只有兩個程序訪問共享記憶體,那麼我們可以使用訊號來實現同步。

2.舉例說明

如上圖所示,讀者和寫者依次讀出和寫入資料。當共享記憶體不可讀或寫時,相關程序會等待,直到收到對方的訊號。

3.要點分析

我們以寫者為例分析一下實現步驟

1)讀者和寫者通過訊號同步的前提是必須知道對方的程序號。這裡可以利用共享記憶體的前四個位元組存放自己的程序號並獲取對方的程序號。

2)由於兩個程序執行的先後順序不確定,因此約定先執行的程序建立共享記憶體,並寫入自己的程序號。後執行的程序開啟共享記憶體,獲取對方的程序號後再寫入自己的程序號。

3)寫者將內容寫入共享記憶體後給讀者發訊號通知對方可以讀,然後將自己阻塞,直到讀者給自己發訊號為止

4.參考**

// writer.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define size 64

typedef struct

shm;

void handler(int signo) // 訊號處理函式

int main(int argc, char *argv)

if ((shmid = shmget(key, sizeof(shm), ipc_creat|ipc_excl|0666)) = = -1)

}else // 共享記憶體被建立

while ( 1 )

return 0;

}讀者可以參考以上**實現reader.c,並新增程式退出時的處理。

共享記憶體和訊號量

共享記憶體和訊號量實現程序間通訊的另外兩種機制。一.共享記憶體 1.共享記憶體的結構 2.實現共享記憶體的函式 1 shmget 函式 功能 建立共享記憶體 引數 key 共享記憶體的名字 size 共享記憶體的大小 以頁為單位分配資源 返回值 成功返回乙個非負整數,即共享記憶體的識別符號 失敗返回...

Linux訊號量和共享記憶體

include include include include include include include include static intset semvalue void static intsemaphore p void static intsemaphore v void stat...

共享記憶體,訊號量

一.共享記憶體 共享記憶體 允許兩個不相關的程序訪問同乙個邏輯記憶體。為兩個正在執行的程序之間共享和傳遞資料不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,是非同步通訊,也就是說,在第乙個程序結束對共享記...