C プログラム (並列処理)

マルチプロセス

Unix/Linux系 OS でマルチプロセスを実現するには,fork を使います. fork を呼び出したプロセスを親プロセス,新たに作り出されたプロセスを子プロセスと呼び,fork の戻り値により親と子の処理が区別できます(子プロセスの戻り値は 0,親プロセスの戻り値は新たに生成された子プロセスのプロセス識別子,エラーの場合は -1).

マルチプロセスのサンプルプログラムとして,複数の子プロセス (デフォルトは 2個) を生成し,親プロセスを含め各プロセスが 1秒ごとに 5 までカウントするプログラムを fork_test.c に示します.

プログラムの基本的な処理は以下です.

共有メモリ

複数のプロセスがプロセス間通信を行うには,システムが管理しているメモリの一部を共有する方法が採られます (共有メモリ). 複数のプロセスが同じメモリを共有するので,プロセス間の待ち合わせや排他制御が必要になります.その場合には,セマフォを使用します.

共有メモリは,一般に次の手順で操作します.

  1. shmget で共有メモリ・セグメントの識別子を取得する.または,共有メモリ・セグメントを新規に生成する.
  2. 各プロセスは,shmat で自プロセスのアドレス空間に共有メモリ・セグメントを付加 (アタッチ) する.これにより,共有メモリへのデータの読み書きが可能になる.
  3. 各プロセスで共有メモリが不要になったら,shmdt で自プロセスのアドレス空間に配置された共有メモリ・セグメントを分離 (デタッチ) する.
  4. shmctl で共有メモリ・セグメントを破棄する.

マルチプロセス処理における共有メモリのサンプルプログラムを shdmem.c に示します.ここでは,生成された子プロセス間で共有メモリを介してデータを受渡しします.

マルチスレッド

マルチプロセスでは,各プロセスがそれぞれ独立した論理メモリ空間を持ちますが,マルチスレッドは親プロセスのメモリ空間を共有します.

Unix/Linux系 OS でマルチスレッドを実現するには,pthread を使います.pthread は POSIX が仕様化したスレッドモデルです.

プロセスは,1 つ以上のスレッドとメモリ上にあるプログラムのコード,データなどのリソースから構成されます.各スレッドはプロセスのリソースを共有できるので,複数スレッドを生成し並列で処理を行う場合,共有リソースに対するスレッド間での排他制御が必要になります.

マルチスレッドのサンプルプログラムとして,10個のスレッドを生成し,各スレッドで 100回外部変数をカウントアップするプログラムを thread_test.c に示します.ここで,変数 count_1 は mutex を使い排他制御されていますが,変数 count_2 は排他制御されていません. count_1 は常に 1000 になりますが,count_2 は 1000 より小さくなる場合があります.

プログラムの基本的な処理は以下です.

inserted by FC2 system