Transcript 共有メモリ
共有メモリ 共有メモリ 共有メモリのシステム概要 共有メモリの特徴と利用手順 共有メモリの操作 ipcs - IPC リソース情報の表示 ipcrm – IPCの各資源(メッセージキュー・セマフォ集合・共有メモリ ID) を削除する shmgetシステムコール shmatシステムコール shmdtシステムコール shmctlシステムコール 共有メモリ 共有メモリのシステム概要 プロセスAとBは、 同じ鍵を持っている 共有メモリを使うプロセス共通のキー プロセス A プロセス B プロセスA プロセスB shmget(); shmat(); shmget(); shmat(); write(); read(); プロセス間通信 •パイプライン •シグナル •共有メモリ •セマフォ •ソケット カーネル 共有メモリ カーネル 共有メモリ 共有メモリの特徴と利用手順 共有メモリプロセス間通信の特徴 共有メモリは、プロセス間通信に、プロセスの親子関係が不要 パイプラインは親子プロセスのみ 共有メモリを利用する手順 共有メモリ識別子を獲得(shmget)。メモリ上に共有メモリの領 域が確保される。 共有メモリにアタッチ(shmat)。利用できる共有メモリの先頭ア ドレスが返される。 共有メモリにデータを書き込む/読込む。 共有メモリをデタッチ(shmdt) 共有メモリ領域を開放する(shmctl, ipcrmコマンド)。 (例)カット&ペースト mcut 標準入力から入力されたデータを共有メモリに入れる mpaste 共有メモリからデータを取出しプリントする 共有メモリ 共有メモリの操作 $ ipcs -m 共有メモリの 利用状況 ------ シェアードメモリセグメント -------キー shmid 所有者 権限 バイト $ w | ./mcut $ ipcs -m nattch 状態 nattch 0 状態 利用者情報を カット ------ シェアードメモリセグメント -------キー shmid 所有者 権限 バイト 0x61018088 360453 oida 666 4096 利用者情報を ペースト $ ./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 リソース情報の表示 ipcs は、IPC リソース機能に関する情報を出力する。 -i を指定すると、後続の id で指定されたリソースの情報だけが出 力される。 リソースの指定は次のようになる: -m シェアードメモリセグメントを指定する。 -q メッセージキューを指定する。 -s セマフォを指定する。 -a すべてのリソースの情報が出力される(ディフォルト)。 出力フォーマットの指定は、次のようになる: -t リソースが最後に変更された時間を出力する。 -p リソースの所有、作成、最終変更を示すプロセスIDを出力する。 -c リソースの作成ユーザーおよびグループの情報を出力する。 -l 各リソースの上限値を出力する。 -u 各リソースの使用状況を示すサマリが出力される. 共有メモリ ipcrm – IPCの各資源(メッセージキュー・ セマフォ集合・共有メモリ ID)を削除する ipcrm は System V プロセス間通信 (interprocess communication, IPC) オブジェ クトと、それに関連するデータ構造をシステムから削除する。 これらのオブジェクトを削除するためには、スーパーユーザーであるか、オブ ジェクトの作成者または所有者でなければならない。 メッセージキューオブジェクトとセマフォオブジェクトの削除は、 (他のプロセス がそのオブジェクトの IPC 識別子を持っていたとしても) 即座に行われる。 共有メモリオブジェクトが削除されるのは、現在付加 (attach) されている全て のプロセスが (shmdt(2) で) 仮想アドレス空間からオブジェクトを分離 (detach) してからである。 -M shmkey 最後の分離が行われた後、 shmkey で作成された共有メモリセ グメントを削除する。 -m shmid 最後の分離が行われた後、 shmid で識別される共有メモリセグ メントを削除する。 -Q msgkey msgkey で作成されたメッセージキューを削除する。 -q msgid msgid で識別されるメッセージキューを削除する。 -S semkey semkey で作成されたセマフォを削除する。 -s semid semid で識別されるセマフォを削除する。 共有メモリ 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 共有メモリをプロセスにアタッチ インクルードファイル #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は、読取り れ以外は、読書きモード) 共有メモリ プロセス shmat 戻値 モード、そ 共有メモリ 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 共有メモリを削除