IPC(Inter Process Communication) とは?

IPCの基本:


Linuxだけではなく、マルチタスクをサポートしたOSでは各タスク(=プロセス)が強調動作できるようにタスク間通信をサポートしています。

 特に、仮想メモリをサポートし、カーネル空間とユーザー空間をプロテクション機構によって分断されたメモリ空間でユーザープロセスが動作するようなシステムでは、ユーザープロセス同士で直接データをやり取りすることができません。
 また、FreeRTOSのように仮想アドレスでの動作では無いものの、複数スレッドの動作が可能となるような環境下では通信の確実性、つまり通信の途中でスケジューリングされてデータ転送が不完全な状態になる、といった事象をさけるためにもOSがタスク間通信をサポートしています。


Uinuxでは、Inter Process Communication = IPC としてサポートしています。

 基本となるIPC関連のシステムコールには下記のものがあります。
  ・メッセージキュー
  ・共有メモリ
  ・パイプ
  ・ソケット
  ・シグナル
  ・セマフォ

このうち、メッセージキュー、セマフォ、共有メモリは歴史的に SYSTEM V IPC と呼ばれ、ファイルシステムを利用しないIPCとなっています。


以下、それぞれの特徴について簡単に記述します。

 メッセージキュー:
いわゆるメッセージボックスのような動作を行う IPC です。
プロセス間で一意に識別できるメッセージキューに対してメッセージを書き込み、受け取りができます。


 共有メモリ:
カーネルが管理するメモリ空間をユーザープロセスに”見えるようにする”ことで、複数のプロセス間で同じメモリ空間を利用することができます。
プロセスからは通常のメモリと同様に見えるため、同じエリアに対しての同時書き込みなどについては、排他制御を行う、あるいはアトミックな操作とするなどの対応が必要になります。


パイプ:
コマンドのリダイレクションで使われるパイプです。
先のコマンドの標準出力を次のコマンドの標準入力にパイプでつなぐことでプロセス間の通信を行っています。


ソケット:
インターネットの基礎ともいえる通信です。
ソケットは同じノード(CPU)内でのプロセス間通信だけではなく、ノード間のプロセス間通信をサポートしており、データの転送もバイトストリームとデータグラムを選択することができます。


シグナル:
プロセスに対して非同期のイベント通知を行います。
プロセス側でシグナルハンドラを定義することで、非同期通知を受けることができます。
Ctrl+C で、動作中のコマンド(プロセス)を停止できますが、Ctrl+C は SIGINT というシグナルを発生させてプロセスの停止を行っています。


セマフォ:
プロセス間でシステム上の資源を同時アクセスする場合に、排他制御を行うために利用されます。
セマフォとは聞き慣れない言葉ですが、昔の腕木式信号機ことをセマフォと読んでいたことに由来するようです。


 Wikipedia、セマフォより。

単線区間を列車が通過するためには、その区間を排他的に利用しないと第事故になります。

次回より、これらIPC関連のシステムコールプログラミングについて解説します。



Lightning Brains

コメント

このブログの人気の投稿

Linuxシステムコール、共有メモリの使い方

Linuxシステムコール、メッセージキューの使い方

Linuxシステムコール、セマフォの使い方