並列処理によるソースヤキソバの作成
2008年06月03日13:15
12:37 PM 6/3/2008 並列プログラミングとは
○ 並列プログラミングとは
どんな順番で実行しても必ず結果が正しくなるように組むことだ。
例として、普通のプログラミングでカップソースヤキソバを作ってみる。
void カップソースヤキソバを作る() {
お湯を火にかける();
パッケージを開封する();
フタをとる();
具を入れる();
お湯が沸くまで待つ();
お湯を入れる();
3分待つ();
お湯を切る();
ソースを入れる();
}
このとき、うっかりこのプログラムを入力しまちがえたとする。
.
.
具を入れる();
お湯が沸くまで待つ();
ソースを入れる();
お湯を入れる();
.
.
順番が変わってしまった。 こうなってしまうと、正しいソースヤキソバを食べることが出来なくなってしまう。
ところが、並列プログラミングをしていると、日常的にこういうことが起こる。何故かと言うと、並列プログラミングでは、各処理をまるで大勢で手分けして実行しているようなものだからだ。 実行は人によってスピードが異なる。 すばやく働く者もいればダラダラ働く者もいる。 だから、処理中に先に実行した人を後から実行した人が追い越してしまうことがままある。
だから、ソースを入れる人がもたもたしているうちに、お湯を入れる人が先に処理を開始してしまうことがたまに起こる。 するとソースヤキソバは中華風酸味スープソバになってしまう。
これを回避するためには『この処理が必ずこの処理の後で無ければいけない』という前後関係を守るようなコードが必要になる。
void ソースを入れる() {
必ず「お湯を切る」が終わるまで待つ();
ソースの封を切る();
.
.
.
}
もし前後関係を守るコードが適切に組み込まれていれば、例え以下の様に逆の順番で処理を行ったとしても、結果は等しくなるはずだ。
ソースを入れる();
お湯を切る();
3分待つ();
お湯を入れる();
お湯が沸くまで待つ();
具を入れる();
フタをとる();
パッケージを開封する();
お湯を火にかける();
また、このように順不同で処理を行っても結果が等しくなるように組まなければ、何かのタイミングで処理結果が変化してしまうことがありえる、ということなのだ。
○ 並列プログラミングとは
どんな順番で実行しても必ず結果が正しくなるように組むことだ。
例として、普通のプログラミングでカップソースヤキソバを作ってみる。
void カップソースヤキソバを作る() {
お湯を火にかける();
パッケージを開封する();
フタをとる();
具を入れる();
お湯が沸くまで待つ();
お湯を入れる();
3分待つ();
お湯を切る();
ソースを入れる();
}
このとき、うっかりこのプログラムを入力しまちがえたとする。
.
.
具を入れる();
お湯が沸くまで待つ();
ソースを入れる();
お湯を入れる();
.
.
順番が変わってしまった。 こうなってしまうと、正しいソースヤキソバを食べることが出来なくなってしまう。
ところが、並列プログラミングをしていると、日常的にこういうことが起こる。何故かと言うと、並列プログラミングでは、各処理をまるで大勢で手分けして実行しているようなものだからだ。 実行は人によってスピードが異なる。 すばやく働く者もいればダラダラ働く者もいる。 だから、処理中に先に実行した人を後から実行した人が追い越してしまうことがままある。
だから、ソースを入れる人がもたもたしているうちに、お湯を入れる人が先に処理を開始してしまうことがたまに起こる。 するとソースヤキソバは中華風酸味スープソバになってしまう。
これを回避するためには『この処理が必ずこの処理の後で無ければいけない』という前後関係を守るようなコードが必要になる。
void ソースを入れる() {
必ず「お湯を切る」が終わるまで待つ();
ソースの封を切る();
.
.
.
}
もし前後関係を守るコードが適切に組み込まれていれば、例え以下の様に逆の順番で処理を行ったとしても、結果は等しくなるはずだ。
ソースを入れる();
お湯を切る();
3分待つ();
お湯を入れる();
お湯が沸くまで待つ();
具を入れる();
フタをとる();
パッケージを開封する();
お湯を火にかける();
また、このように順不同で処理を行っても結果が等しくなるように組まなければ、何かのタイミングで処理結果が変化してしまうことがありえる、ということなのだ。
コメント一覧
退会したユーザー 2008年06月03日 23:00
(ラ王のソースにお湯を注いだことがあります。)
「特に複数人のプロジェクトでは、記述を間違えても安全機構が働くコードを、必ず書くようにしろ」という内容を、どこかで読んだ気がします。自分で書いたコードの意味さえも、半年後には忘れていて、僕はC言語ですごい苦労をしました。
「特に複数人のプロジェクトでは、記述を間違えても安全機構が働くコードを、必ず書くようにしろ」という内容を、どこかで読んだ気がします。自分で書いたコードの意味さえも、半年後には忘れていて、僕はC言語ですごい苦労をしました。
ねこ☆ミ。 2008年06月05日 00:04
にゃるほど。
並列プログラムは組んだことないんだけど、、、
一つの処理は、一回だけ起きるっていうのは、前提でO.Kですか?
でなければ、、、
void ソースを入れる() {
もうソースが入っていたら終了();
必ず「お湯を切る」が終わるまで待つ();
ソースの封を切る();
.
.
.
}
とか
並列プログラムは組んだことないんだけど、、、
一つの処理は、一回だけ起きるっていうのは、前提でO.Kですか?
でなければ、、、
void ソースを入れる() {
もうソースが入っていたら終了();
必ず「お湯を切る」が終わるまで待つ();
ソースの封を切る();
.
.
.
}
とか
ねこ☆ミ。 2008年06月05日 00:38
作るべきカップソースヤキソバは、ひとつ、でいいのかも、
気になる、、、(たんなる職業病です)
気になる、、、(たんなる職業病です)