共有メモリ

Download Report

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 共有メモリを削除