2014年4月11日金曜日

Pthreadsプログラミング::なぜマルチスレッドなのか?

- マルチスレッドプログラミングを体系的に学びたい
- 予備知識はほぼゼロ
といった状況なので、まずはライブラリを触ってみておおまかな実装を抑えてみることにする。

Pthreadプログラミングというまさにジャストな本があったので読みはじめました。
今日は第一章で学んだことをアウトプットします。


1章 なぜマルチスレッドなのか?


性能を向上させる一つの方法が、マルチタスク処理。
プログラムを複数のタスクに分配する方法としてはプロセスとスレッドがある。
プロセスとスレッドの違いについては、「メモリ空間がどのように使われるか」を把握すればスッキリ理解できる。


プロセスの仮想アドレス空間では以下の4つの領域が使われる。

  •  [スタック]  実行時の関数の自動変数が置かれるスタック領域
  •  [テキスト] プログラム命令用の読み込み専用のテキスト領域
  •  [データ]   グローバルデータ用読み書き領域
  •  [ヒープ]   mallocシステムコールによる動的割り当てがなされるヒープメモリ領域


システムリソースとしては、SP・PC・その他といった分類ができる。

  •  [SP]   スタックフレームへのポインタ(SP)
  •  [PC]   実行中の命令を指すプログラムカウンタ
  •  [etc]   システムが提供するリソース(オープンされたファイル、ソケット、ロック、シグナル)


プロセスの複製は上記の登場人物全部をまるっと複製する一方で、スレッドの複製はSPとPCだけを複製する。
どちらも独自のPC, SPを持つので、プログラムのテキスト中の異なる位置の命令を実行できるという理屈。

以下の図からもわかるように「スレッドはメモリ空間を共有するというのはものすごく重要なので抑えておく。
プロセスリソースの共有は、パフォーマンス上の主要な利点の一つ。
各スレッドが共有リソースにアクセスできることはスレッド間の通信を容易にする反面、
スレッド同士の干渉が起きる可能性があるためプログラミングを困難にする。

マルチスレッドのコンテキスト切り替えに伴うコスト@ id:naoya より引用


並列化により高速化できるケース

- ブロッキングI/Oがある
 コンピュータ内部のCPUと周辺装置のデータ入出力で、処理の官僚を待ってから他の処理を開始する方式。システムコールが完了するまで処理をブロックし、リソースを浪費する

- 非同期イベントがある
 非同期処理のスレッドと別の処理を行うスレッドで分ける工夫ができる


UNIXの並行プログラミングのイメージ

マルチプロセス:

マルチスレッド:


並列(Parallel)と並行(Concurrent)の違い

オラクルさんの説明によると以下のとおり。
並行性と並列性マルチスレッドプロセスがシングルプロセッサ上で動作する場合は、プロセッサが実行リソースを各スレッドに順次切り替えて割り当てるため、プロセスの実行状態は並行的になります。
同じマルチスレッドプロセスが共有メモリー方式のマルチプロセッサ上で動作する場合は、プロセス中の各スレッドが別のプロセッサ上で同時に走行するため、プロセスの実行状態は並列的になります。

今読んでる"Pthreadプログラミング"によると概念的にはこんな感じです。
「並列」といったときは狭義の並行を意味していて、
複数のタスクが異なるプロセッサ上で同時に実行される様子を意味している。
「並行」といったときはオラクルさんが言うように、シングルプロセッサでマルチスレッドプロセスが動いているような状況のことを意味すると理解。




番外編
* PthreadのPって何?
 Pthread: POSIX(Portable Operating System Interface) thread

* なぜ並列プログラミングが必要なの?
[理由1] シングルプロセッサでは高速化に限界が見えてきた。
 UDACITYでNVIDIAのエンジニアが教えてくれました。
  - トランジスタは小さく、速く、省電力になって幸せ
  - クロック周波数は頭打ちになってきてるよ不幸せ


参考書

この記事は"Pthreadプログラミング"の第一章に毛を生やしたものです。
参考になった方、もっと読んでみたい方は是非おすすめします。
引き続き読み進めた上で、自分の頭のなかでまとまったら続きを書きます。

0 件のコメント:

コメントを投稿