110 likes | 335 Views
共有メモリ. 共有メモリのシステム概要 共有メモリの特徴と利用手順 共有メモリの操作 ipcs - IPC リソース情報の表示 ipcrm – IPC の各資源(メッセージキュー・セマフォ集合・共有メモリ ID )を削除する shmget システムコール shmat システムコール shmdt システムコール shmctl システムコール. 共有メモリのシステム概要. プロセス A と B は、 同じ鍵を持っている. プロセス A と B は、 同じ鍵を持っている. 共有メモリを使うプロセス共通のキー. プロセス A shmget();
E N D
共有メモリ • 共有メモリのシステム概要 • 共有メモリの特徴と利用手順 • 共有メモリの操作 • ipcs - IPC リソース情報の表示 • ipcrm – IPCの各資源(メッセージキュー・セマフォ集合・共有メモリ ID)を削除する • shmgetシステムコール • shmatシステムコール • shmdtシステムコール • shmctlシステムコール
共有メモリのシステム概要 プロセスAとBは、 同じ鍵を持っている プロセスAとBは、 同じ鍵を持っている 共有メモリを使うプロセス共通のキー プロセスA shmget(); shmat(); write(); プロセスB shmget(); shmat(); read(); プロセス A プロセス B プロセス間通信 • パイプライン • シグナル カーネル 共有メモリ • 共有メモリ • セマフォ • ソケット カーネル
共有メモリプロセス間通信の特徴 共有メモリは、プロセス間通信に、プロセスの親子関係が不要 パイプラインは親子プロセスのみ 共有メモリを利用する手順 共有メモリ識別子を獲得(shmget)。メモリ上に共有メモリの領域が確保される。 共有メモリにアタッチ(shmat)。利用できる共有メモリの先頭アドレスが返される。 共有メモリにデータを書き込む/読込む。 共有メモリをデタッチ(shmdt) 共有メモリ領域を開放する(shmctl, ipcrmコマンド)。 (例)カット&ペースト mcut 標準入力から入力されたデータを共有メモリに入れる mpaste 共有メモリからデータを取出しプリントする 共有メモリの特徴と利用手順
共有メモリの操作 共有メモリの 利用状況 $ ipcs -m ------ シェアードメモリセグメント -------- キー shmid 所有者 権限 バイト nattch 状態 $ w | ./mcut $ ipcs -m ------ シェアードメモリセグメント -------- キー shmid 所有者 権限 バイト nattch 状態 0x61018088 360453 oida 666 4096 0 $ ./mpaste 12:04pm up 1:38, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT oida pts/0 pupa 11:33am 1:41 0.03s 0.03s -bash oida pts/1 pupa 11:43am 0.00s 0.05s 0.01s w $ ipcrm shm 360453 リソースを削除しました $ 利用者情報をカット 利用者情報をペースト shmid
ipcs は、IPC リソース機能に関する情報を出力する。 -i を指定すると、後続の idで指定されたリソースの情報だけが出力される。 リソースの指定は次のようになる: -m シェアードメモリセグメントを指定する。 -q メッセージキューを指定する。 -s セマフォを指定する。 -a すべてのリソースの情報が出力される(ディフォルト)。 出力フォーマットの指定は、次のようになる: -t リソースが最後に変更された時間を出力する。 -p リソースの所有、作成、最終変更を示すプロセスIDを出力する。 -c リソースの作成ユーザーおよびグループの情報を出力する。 -l 各リソースの上限値を出力する。 -u 各リソースの使用状況を示すサマリが出力される. ipcs - IPC リソース情報の表示
ipcrm は System V プロセス間通信 (interprocess communication, IPC) オブジェクトと、それに関連するデータ構造をシステムから削除する。 これらのオブジェクトを削除するためには、スーパーユーザーであるか、オブジェクトの作成者または所有者でなければならない。 メッセージキューオブジェクトとセマフォオブジェクトの削除は、 (他のプロセスがそのオブジェクトの IPC 識別子を持っていたとしても) 即座に行われる。 共有メモリオブジェクトが削除されるのは、現在付加 (attach) されている全てのプロセスが (shmdt(2) で) 仮想アドレス空間からオブジェクトを分離 (detach) してからである。 -M shmkey最後の分離が行われた後、 shmkeyで作成された共有メモリセグメントを削除する。 -m shmid最後の分離が行われた後、 shmidで識別される共有メモリセグメントを削除する。 -Q msgkeymsgkeyで作成されたメッセージキューを削除する。 -q msgidmsgidで識別されるメッセージキューを削除する。 -S semkeysemkeyで作成されたセマフォを削除する。 -s semidsemidで識別されるセマフォを削除する。 ipcrm – IPCの各資源(メッセージキュー・セマフォ集合・共有メモリ ID)を削除する
shmgetシステムコール shmget 共有メモリを割当て、識別子を得る インクルードファイル #include <sys/ipc.h> #include <sys/shm.h> 書式 int shmget(key_t key, int size, int shmflg); 戻値 成功時 共有メモリ識別子 失敗時 -1 key: 共有メモリを使うプロセス共通のキー size: 確保する共有メモリのサイズ(バイト) shmflg: IPC_CREAT: 新規作成(同じキーで割当てられていれば、既にある 共有メモリを使う) IPC_EXCL: 同じキー値で既に割当てられていれば、エラーを返す アクセス権: ファイルの許可ビットと同じ 例: IPC_CREAT|0666 新規作成、全ての人が読書可能 IPC_CREAT|IPC_EXCL|0666 割当てられていない新しいメモリ 一意に決まるキーの作り方 (1)IPC_PRIVATE: 親子関係プロセス用 (2)ファイル名と1文字からつくる: 関数ftok
共有メモリ プロセス shmat 戻値 shmatシステムコール shmat 共有メモリをプロセスにアタッチ インクルードファイル #include <sys/types.h> #include <sys/shm.h> 書式 void *shmat(int shmid, const void *shmaddr, int shmflg); 戻値 成功時 アタッチされた共有メモリの開始アドレス 失敗時 -1 int shmid: 共有メモリ識別子(shmgetの戻値) const void *shmaddr: アタッチするアドレス(共有メモリの先頭 からのオフセット) shmflg: 共有メモリの操作モード(SHM_RDONLYは、読取り モード、それ以外は、読書きモード)
shmdtシステムコール shmdt 共有メモリをディスアタッチ インクルードファイル #include <sys/types.h> #include <sys/shm.h> 書式 int shmdt(const void *shmaddr); 戻値 成功時 0 失敗時 -1 共有メモリ プロセス shmdt
shmctlシステムコール shmctl 共有メモリを監視・制御する インクルードファイル #include <sys/ipc.h> #include <sys/shm.h> 書式 int shmctl(int shmid, int cmd, struct shmid_ds *buf); 戻値 成功時 0 失敗時 -1 cmd: IPC_STAT 共有メモリの状態を得る IPC_SET 共有メモリの状態を変更 IPC_RMID 共有メモリを削除