10
共共共共共 共共共共共 共共共共共 共共共共共 共共共共共共共共共共共共 共共共共共共共共共共共共 共共共共共共共共共共共共共 共共共共共共共共共共共共共 共共共共共共共共 共共共共共共共共 ipcs - IPC ipcs - IPC 共共共共共共共共共 共共共共共共共共共 ipcrm – IPC ipcrm – IPC 共共共共 共共共共共共共共共共共共共共共共共共共共共 共共共共 共共共共共共共共共共共共共共共共共共共共共 ID ID 共共共共 共共共共 shmget shmget 共共共共共共共 共共共共共共共 shmat shmat 共共共共共共共 共共共共共共共 shmdt shmdt 共共共共共共共 共共共共共共共 shmctl shmctl 共共共共共共共 共共共共共共共

共有メモリ

  • Upload
    ziva

  • View
    41

  • Download
    0

Embed Size (px)

DESCRIPTION

共有メモリ. 共有メモリのシステム概要  共有メモリの特徴と利用手順  共有メモリの操作  ipcs - IPC リソース情報の表示 ipcrm – IPC の各資源(メッセージキュー・セマフォ集合・共有メモリ ID )を削除する  shmget システムコール  shmat システムコール  shmdt システムコール shmctl システムコール. 共有メモリのシステム概要. プロセス A と B は、 同じ鍵を持っている. プロセス A と B は、 同じ鍵を持っている. 共有メモリを使うプロセス共通のキー. プロセス A shmget(); - PowerPoint PPT Presentation

Citation preview

Page 1: 共有メモリ

共有メモリ共有メモリ

共有メモリ共有メモリ 共有メモリのシステム概要 共有メモリのシステム概要  共有メモリの特徴と利用手順 共有メモリの特徴と利用手順  共有メモリの操作 共有メモリの操作  ipcs - IPC ipcs - IPC リソース情報の表示リソース情報の表示 ipcrm – IPCipcrm – IPC の各資源(メッセージキュー・セマフォ集合・共有の各資源(メッセージキュー・セマフォ集合・共有

メモリ メモリ IDID )を削除する )を削除する  shmgetshmget システムコール システムコール  shmatshmat システムコール システムコール  shmdtshmdt システムコールシステムコール shmctlshmctl システムコールシステムコール

Page 2: 共有メモリ

共有メモリ共有メモリ

カーネル

共有メモリのシステム概要共有メモリのシステム概要

プロセスA

プロセスB

カーネル

プロセス間通信

•パイプラインパイプライン•シグナルシグナル

•セマフォ•ソケット

プロセス A

shmget();shmat();

write();

プロセス B

shmget();shmat();

read();

•共有メモリ 共有メモリ共有メモリ共有メモリ共有メモリ

プロセスプロセス AAとと BBは、は、同じ鍵を持ってい同じ鍵を持っているる

プロセスプロセス AAとと BBは、は、同じ鍵を持ってい同じ鍵を持っているる共有メモリを使うプロセス共通のキー

Page 3: 共有メモリ

共有メモリ共有メモリ

共有メモリの特徴と利用手順共有メモリの特徴と利用手順

共有メモリプロセス間通信の特徴共有メモリプロセス間通信の特徴 共有メモリは、プロセス間通信に、プロセスの親子関係共有メモリは、プロセス間通信に、プロセスの親子関係

が不要 が不要 パイプラインは親子プロセスのみパイプラインは親子プロセスのみ

共有メモリを利用する手順共有メモリを利用する手順 共有メモリ識別子を獲得(共有メモリ識別子を獲得( shmgetshmget )。メモリ上に共有メ)。メモリ上に共有メ

モリの領域が確保される。モリの領域が確保される。 共有メモリにアタッチ(共有メモリにアタッチ( shmatshmat )。利用できる共有メモ)。利用できる共有メモ

リの先頭アドレスが返される。リの先頭アドレスが返される。 共有メモリにデータを書き込む/読込む。共有メモリにデータを書き込む/読込む。 共有メモリをデタッチ(共有メモリをデタッチ( shmdtshmdt )) 共有メモリ領域を開放する(共有メモリ領域を開放する( shmctl, ipcrmshmctl, ipcrm コマンド)。コマンド)。

(例)カット&ペースト(例)カット&ペースト mcutmcut  標準入力から入力されたデータを共有メモリに入 標準入力から入力されたデータを共有メモリに入

れるれる mpaste mpaste 共有メモリからデータを取出しプリントする共有メモリからデータを取出しプリントする

Page 4: 共有メモリ

共有メモリ共有メモリ

共有メモリの操作共有メモリの操作

$ ipcs -m$ ipcs -m

------ ------ シェアードメモリセグメント シェアードメモリセグメント ----------------キー キー shmid shmid 所有者 権限 バイト 所有者 権限 バイト nattch nattch 状態状態

$ w | ./mcut$ w | ./mcut$ ipcs -m$ ipcs -m

------ ------ シェアードメモリセグメント シェアードメモリセグメント ----------------キー キー shmid shmid 所有者 権限 バイト 所有者 権限 バイト nattch nattch 状態状態0x61018088 360453 oida 666 4096 00x61018088 360453 oida 666 4096 0

$ ./mpaste$ ./mpaste 12:04pm up 1:38, 2 users, load average: 0.00, 0.00, 0.0012:04pm up 1:38, 2 users, load average: 0.00, 0.00, 0.00USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAToida pts/0 pupa 11:33am 1:41 0.03s 0.03s -bashoida pts/0 pupa 11:33am 1:41 0.03s 0.03s -bashoida pts/1 pupa 11:43am 0.00s 0.05s 0.01s woida pts/1 pupa 11:43am 0.00s 0.05s 0.01s w$ ipcrm shm 360453$ ipcrm shm 360453リソースを削除しましたリソースを削除しました$$

shmid

利用者情報を利用者情報をカットカット

利用者情報を利用者情報をペーストペースト

共有メモリの共有メモリの利用状況利用状況

Page 5: 共有メモリ

共有メモリ共有メモリ

ipcs - IPC ipcs - IPC リソース情報の表示 リソース情報の表示

ipcs ipcs は、は、 IPC IPC リソース機能に関する情報を出力する。リソース機能に関する情報を出力する。 -i -i を指定すると、後続の を指定すると、後続の idid で指定されたリソースの情報だで指定されたリソースの情報だ

けが出力される。 けが出力される。

リソースの指定は次のようになるリソースの指定は次のようになる : : -m-m シェアードメモリセグメントを指定する。シェアードメモリセグメントを指定する。 -q -q メッセージキューを指定する。 メッセージキューを指定する。 -s -s セマフォを指定する。 セマフォを指定する。 -a -a すべてのリソースの情報が出力されるすべてのリソースの情報が出力される (( ディフォルディフォル

トト )) 。 。

出力フォーマットの指定は、次のようになる出力フォーマットの指定は、次のようになる : : -t -t リソースが最後に変更された時間を出力する。 リソースが最後に変更された時間を出力する。 -p -p リソースの所有、作成、最終変更を示すプロセスリソースの所有、作成、最終変更を示すプロセス IDID を出力を出力

する。 する。 -c -c リソースの作成ユーザーおよびグループの情報を出力する。リソースの作成ユーザーおよびグループの情報を出力する。

-l -l 各リソースの上限値を出力する。 各リソースの上限値を出力する。 -u -u 各リソースの使用状況を示すサマリが出力される各リソースの使用状況を示すサマリが出力される . .

Page 6: 共有メモリ

共有メモリ共有メモリipcrm – IPCipcrm – IPC の各資源(メッセージの各資源(メッセージキュー・セマフォ集合・共有メモリ キュー・セマフォ集合・共有メモリ IIDD )を削除する)を削除する

ipcrm ipcrm は は System V System V プロセス間通信 プロセス間通信 (interprocess communication, IPC) (interprocess communication, IPC) オオブジェクトと、それに関連するデータ構造をシステムから削除する。ブジェクトと、それに関連するデータ構造をシステムから削除する。

これらのオブジェクトを削除するためには、スーパーユーザーであるこれらのオブジェクトを削除するためには、スーパーユーザーであるか、オブジェクトの作成者または所有者でなければならない。 か、オブジェクトの作成者または所有者でなければならない。

メッセージキューオブジェクトとセマフォオブジェクトの削除は、 メッセージキューオブジェクトとセマフォオブジェクトの削除は、 (( 他のプロセスがそのオブジェクトの 他のプロセスがそのオブジェクトの IPC IPC 識別子を持っていたとして識別子を持っていたとしてもも ) ) 即座に行われる。即座に行われる。

共有メモリオブジェクトが削除されるのは、現在付加 共有メモリオブジェクトが削除されるのは、現在付加 (attach) (attach) されてされている全てのプロセスが いる全てのプロセスが ((shmdtshmdt(2) (2) でで ) ) 仮想アドレス空間からオブジェ仮想アドレス空間からオブジェクトを分離 クトを分離 (detach) (detach) してからである。 してからである。

-M-M shmkey shmkey 最後の分離が行われた後、 最後の分離が行われた後、 shmkeyshmkey で作成された共有で作成された共有メモリセグメントを削除する。 メモリセグメントを削除する。

-m-m shmid shmid 最後の分離が行われた後、 最後の分離が行われた後、 shmidshmid で識別される共有で識別される共有メモリセグメントを削除する。メモリセグメントを削除する。

-Q-Q msgkey msgkey msgkeymsgkey で作成されたメッセージキューを削除する。 で作成されたメッセージキューを削除する。 -q-q msgid msgid msgidmsgid で識別されるメッセージキューを削除する。 で識別されるメッセージキューを削除する。 -S-S semkey semkey semkeysemkey で作成されたセマフォを削除する。 で作成されたセマフォを削除する。 -s-s semid semid semidsemid で識別されるセマフォを削除する。 で識別されるセマフォを削除する。

Page 7: 共有メモリ

共有メモリ共有メモリ

shmgetshmget システムコールシステムコール

インクルードファイル #include <sys/ipc.h>#include <sys/shm.h>

書式 int shmget(key_t key, int size, int shmflg);戻値 成功時 共有メモリ識別子

失敗時  -1key:  共有メモリを使うプロセス共通のキーsize:  確保する共有メモリのサイズ(バイト)shmflg: IPC_CREAT: 新規作成(同じキーで割当てられていれば、既にある 共有メモリを使う)

IPC_EXCL: 同じキー値で既に割当てられていれば、エラーを返す

アクセス権 : ファイルの許可ビットと同じ

例:  IPC_CREAT|0666  新規作成、全ての人が読書可能IPC_CREAT|IPC_EXCL|0666 割当てられていない新しいメモリ

一意に決まるキーの作り方(1) IPC_PRIVATE: 親子関係プロセス用 (2)ファイル名と1文字からつくる: 関数 ftok

shmget shmget 共有メモリを割当て、識別子を得る共有メモリを割当て、識別子を得る

Page 8: 共有メモリ

共有メモリ共有メモリ

shmatshmat システムコールシステムコール

インクルードファイル #include <sys/types.h>#include <sys/shm.h>

書式 void *shmat(int shmid, const void *shmaddr, int shmflg);戻値 成功時 アタッチされた共有メモリの開始アドレス

失敗時  -1int shmid:  共有メモリ識別子( shmget の戻値)const void *shmaddr:  アタッチするアドレス(共有メモリの先頭

からのオフセット)shmflg: 共有メモリの操作モード( SHM_RDONLY は、読取りモード、それ以外は、読書きモード)

プロセス

shmat

共有メモリ共有メモリ

戻値戻値

shmat shmat 共有メモリをプロセスにアタッチ共有メモリをプロセスにアタッチ

Page 9: 共有メモリ

共有メモリ共有メモリ

shmdtshmdt システムコールシステムコール

インクルードファイル #include <sys/types.h>

#include <sys/shm.h>書式   int shmdt(const void *shmaddr);戻値 成功時  0

失敗時  -1

shmdt shmdt 共有メモリをディスアタッチ共有メモリをディスアタッチ

プロセス

shmdt

共有メモリ共有メモリ

Page 10: 共有メモリ

共有メモリ共有メモリ

shmctlshmctl システムコールシステムコール

インクルードファイル #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  共有メモリを削除

shmctl shmctl 共有メモリを監視・制御する共有メモリを監視・制御する