Linux共享記憶體的管理

OldBoy~發表於2018-06-07

在程式通訊應用中會用到共享記憶體,這就涉及到了IPC,與IPC相關的命令包括:ipcs、ipcrm(釋放IPC)。IPCS命令是Linux下顯示程式間通訊設施狀態的工具。我們知道,系統進行程式間通訊(IPC)的時候,可用的方式包括訊號量、共享記憶體、訊息佇列、管道、訊號(signal)、套接字等形式[2]。使用IPCS可以檢視共享記憶體、訊號量、訊息佇列的狀態。

當下系統是Centos,執行ipcs命令檢視

說明:

  • 第一列就是共享記憶體的key;
  • 第二列是共享記憶體的編號shmid;
  • 第三列就是建立的使用者owner;
  • 第四列就是許可權perms;
  • 第五列為建立的大小bytes;
  • 第六列為連線到共享記憶體的程式數nattach;
  • 第七列是共享記憶體的狀態status。其中顯示“dest”表示共享記憶體段已經被刪除,但是還有使用者在使用它,當該段記憶體的mode欄位設定為 SHM_DEST時就會顯示“dest”。當使用者呼叫shmctl的IPC_RMID時,記憶體先檢視多少個程式與這個記憶體關聯著,如果關聯數為0,就會銷 毀這段共享記憶體,否者設定這段記憶體的mod的mode位為SHM_DEST,如果所有程式都不用則刪除這段共享記憶體。

具體的用法總結如下:
1、顯示所有的IPC設施

# ipcs -a

2、顯示所有的訊息佇列Message Queue

# ipcs -q

3、顯示所有的訊號量

# ipcs -s

4、顯示所有的共享記憶體

# ipcs -m

5、顯示IPC設施的詳細資訊

# ipcs -q -i id

id 對應shmid、semid、msgid等。-q對應設施的型別(佇列),檢視訊號量詳細情況使用-s,檢視共享記憶體使用-m。

6、顯示IPC設施的限制大小

# ipcs -m -l

-m對應設施型別,可選引數包括-q、-m、-s。

7、顯示IPC設施的許可權關係

# ipcs -c
# ipcs -m -c
# ipcs -q -c
# ipcs -s -c

8、顯示最近訪問過IPC設施的程式ID。

# ipcs -p
# ipcs -m -p
# ipcs -q -p

9、顯示IPC設施的最後操作時間

# ipcs -t
# ipcs -q -t
# ipcs -m -t
# ipcs -s -t

10、顯示IPC設施的當前狀態

# ipcs -u

Linux上的ipcs命令,不支援UNIX上的-b、-o指令,同樣UNIX中不支援-l、-u指令,所以在編寫跨平臺的指令碼時,需要注意這個問題。

刪除IPC

ipcrm -m| -q| -s shm_id

例如,我們在以0x12345678為KEY建立了一個共享記憶體,可以直接使用ipcrm -M 0x12345678來刪除共享記憶體區域。

下面的命令可以釋放所有已分配的共享記憶體:

ipcs -m | awk '$2 ~ /[0-9]+/ {print $2}' | while read s; do sudo ipcrm -m $s; done

相關文章