Shared Memory & Memory Mapped File Back

  • 共享內存機制: 進程間需要共享的數據被放在IPC共享內存區域, 若要訪問則把該共享區域映射到本進程的地址空間中.
  • 內存映射文件機制: 不同進程通過映射同一個普通文件實現共享內存, 進程可讀寫內存.
  • 內存映射文件機制是共享內存的方式之一
  • 最高效的IPC機制之一

Shared Memory

1. Create a shared memory area

method
int shmget(key_t key, int nbytes, int flags)
parameters
  • key: 鍵值, 由ftok()獲取
    • IPC_PRIVATE: key由系統分配
  • flags: 標誌位
return value
  • 0: 共享段的描述字id

  • -1: failure

2. Map

  • 把該共享區域映射到本進程的地址空間中.
method
char* shmat(int segid, char* addr, int flags)
parameters
  • segid: shmget()返回的共享段描述字
  • addr: 映射目的地的地址, 若不關心則設置為0(有系統選擇可用地址)
return value
  • 共享內存段在進程地址空間的首地址

3. Unmap

  • 調用成功後內存段訪問計數減一
method
int shmdt(char* addr)
parameters
  • addr: shmat()返回的首地址
return value
  • 0

3. Control

method
int shmct(int segid, int cmd, struct shmid_ds* sbuf)
parameters
  • segid: shmget()返回的共享段描述字
  • cmd: 命令
    • SHM_LOCK: 共享段鎖定在內存, 禁止換出(Root用戶才有權限)
    • SHM_UNLOCK: 與LOCK相反
    • IPC_STAT: 獲取消息隊列信息, 返回的信息存儲在sbuf指向的shmid_ds結構體中
    • IPC_SET: 設置消息隊列屬性, 要設計的屬性存儲在sbuf指向的shmid_ds結構體中
    • IPC_RMID: 存儲段可釋放
return value
  • 0: success
  • -1: failure

Memory Mapped File

1. Map

method
void* mmap(void* addr, size_t len, int prot, int flags, int fd, off_t offset)
parameters
  • fd: 文件描述符, 一般由open()獲取
  • len: 映射區的大小(從文件開頭的offset個字節後開始計算)
  • prot: 指定共享內存的訪問權限
  • offset: 文件頭, 一般設置為0
  • addr: 指定映射的地址
return value
  • 最終映射的地址

2. Unmap

method
int munmap(void* addr, size_t len)
parameters
  • addr: mmap()最終映射的地址
  • len: 映射區的大小
return value
  • 0: success
  • -1: failure

3. Data Synchronize

  • 實現磁盤上文件內容與共享內存區的內容同步.
  • 共享內容改變一般不會採用寫直達法寫回磁盤文件, 而是當munmap()被調用後才寫回.
method
int msync(void* addr, size_t len, int flags)
parameters
  • addr: mmap()最終映射的地址
  • len: 映射區的大小
  • flags: 同步標誌
return value
  • 0: success
  • -1: failure

results matching ""

    No results matching ""