Entry

低水準言語の習得者は並列処理の飲み込みが早い気がする

2011年02月24日

昨今は,マルチコアなプロセッサが当たり前のように出回っていて,ソフトウェアもこれに対応する動きがやっとこさ本格化してきました。

で,仕事でも,若い社員を対象に,マルチコアなりマルチプロセッサなりを意識したプログラミングを紹介しているんだけれども,比較的高水準な言語(Java あたりを想像してください)だけを扱っているプログラマに,スレッドを説明するのがすこぶる難しい。反対に,低水準な言語(C/C++ あたりを想像してください)を扱っている向きは,割と飲み込みがいい感じ。個人の素質ということもあるんだろうけれども,狭いうちの社内で見る限りそゆ傾向があります。

並列処理をマルチスレッドで行う場合,踏まえておかなくちゃいけない大切な仕組みが,コンテキスト切り替えの仕組みです。これが分かっていないと,何も理解していないのと同じ,と個人的には思います。具体的に言うと,コンテキスト切り替えで「何が切り替えられて何が切り替えられないのか」ということを踏まえているかという話。

よく引き合いに出されるプロセスとスレッドの違いから説明すると,まず,各プロセスは仮想メモリ空間(Windows の場合デフォルト設定だと2GB)を個別に持っています。仮想メモリ空間が別々にあるということは,そこに生成されるスタック空間も別々に持っているわけですね。

一方,スレッドという単位は,仮想メモリ空間を各スレッドで共有しています。しかし,それぞれの処理単位でスタック空間は個別に持っている。この点が大きな違いです。スタック空間というのは,C言語でいうならローカル変数や関数引数が格納されるメモリ領域です。こいつは各スレッドで別々。スタック空間を個別に持っているということは,IP(インストラクションポインタ)も別々に持っているわけで,ということは,CPU のレジスタの値も別々に持っているわけですね。

コンテキスト切り替えの話に戻ると,プロセスをタイムスライスごとに切り替える場合,仮想メモリ空間をゴッソリと切り替えることになります。CPU の命令数で見ても,これは非常に高価な処理になります。

一方,スレッドの場合は,プロセス空間(仮想メモリ空間)は共有しているので,スレッドを切り替えるために仮想メモリをごっそりと置き換える必要はありません。プロセス切り替えと比較すると,圧倒的に安価な処理です。

と,ここまでがあたしのした話。あたしの周りの Java プログラマさんは,「仮想メモリって何よ?」な認識なのか,あまりここら辺の話にピンとくるものがないようです。例えば,「これを踏まえてスレッドセーフな関数を作りましょうね」という話をすると,某氏はきょとんとしている。

仮想メモリ空間やスタック空間のような基本的な話を踏まえていれば,スレッドセーフな関数がどういう関数なのかも分かると思うし,排他/同期のかけかたも分かると思うんだけれども,そゆわけではないんだろうか……。なんだか,教え方に自信がなくなってきそうです。基本ってだいじですね。

まとまらないけどそんな感じ

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN