II-8-5. スレッドプログラミング

複数プロセスの利用よりも軽量な並列プログラムを実現するスレッドプログラミングについて解説する。プロセスとスレッドの違いについて述べ、pthreadライブラリを利用してスレッドプログラミングを実現する方法を説明する。

【学習の要点】

* アドレス空間はプロセス毎に割り当てられるため、通常複数のプロセス間でアドレス空間は共有されない。

* スレッドは、プロセス内における実行の単位であり、スレッド同士はアドレス空間を共有することができる。スレッドはしばしば軽量プロセスと呼ばれる。

* スレッドはアドレス空間を共有しながら独立にスケジュール可能なため、並列プログラムを実現する際に用いられる。

* pthreadは、POSIXによって定義された、Linux標準のスレッドライブラリである。

 

プロセス

POSIXスレッド

生成方法

fork

pthread_create

共有されるリソース

記述子テーブル、メモリマッピングなど

プロセスアドレス空間全体

相互通信

パイプ、ソケット、共有メモリなど各種IPC

プロセスアドレス空間の参照

主要な同期方法

セマフォ、共有メモリ上のミューテックス

ミューテックス、条件変数

 

図II-8-5. プロセスとスレッド

 

【解説】

1) プロセスとスレッド

* プロセスとスレッドのどちらも、それを生成した親とは独立してスケジュールが可能である。つまり、親と並列して処理を行なうことができる。

* 子プロセスは、親プロセスとの間でプロセスリソースを共有するが、通常アドレス空間を共有しない(コピーが作成され、それぞれ独立に管理される)。

* あるプロセスにおいてスレッドが生成されると、そのスレッドは親プロセスとの間でアドレス空間を共有することができる。

* スレッドは、プロセス内での実行単位である。このことから軽量プロセス(Light Weight Process [LWS])と呼ばれることがある。

2) スレッドプログラミング

* 複数のプロセスを扱うプログラムと複数のスレッドを扱うプログラムの異なる点は、スレッドの場合はスレッド間でアドレス空間が共有されることである。

* 複数のスレッドが同じアドレス空間にアクセスできるということは、スレッド間で共有リソースに対して適切な同期が必要であることを示唆する。

* スレッド間で共有リソースに対して同期を行なうにはいくつかの方法がある。ミューテックスは最も基本的でよく使用される同期機構である。ミューテックスは、あるアドレス空間にある共有リソースに対して複数のスレッドが同時にアクセスすることを禁止する。

3) POSIXスレッド

* POSIXスレッドは、POSIXの定めるスレッドAPIである。

* POSIXスレッドは、スレッド使用時に必要とされる、ミューテックスやロックの操作に関するインタフェースも定義する。

* Linuxカーネル2.6は、POSIXスレッドを使ってスレッド機構を提供する。これは、NPTL (Native POSIX Thread Library) と呼ばれ、GNU Cライブラリに統合されている。

* POSIXスレッドの定める主な関数

- pthread_create

スレッドを新しく生成する

- pthread_exit

スレッドを終了する

- pthread_join

スレッドを親スレッドに合流させる

- pthread_detach

スレッドを親スレッドからデタッチする。デタッチされたスレッドは、その終了と同時にメモリリソースが解放される。

- pthread_self

現在実行中のスレッドIDを取得する。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。

フォーラム会員企業専用

記事配信

コンテンツ配信

ユーザログイン