• ベストアンサー

共有メモリ方式とメッセージパッシング方式

並列処理をプログラムで記述する方法について調べていて、共有メモリ方式とメッセージパッシング方式というものを見つけました。ただ、この2つについて何がどう違うのかがうまく理解できません。ぜひおしえてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

共有メモリ方式であれば各プロセスは,直接,共有メモリを参照したり書き換えたりできるんで,プログラミングは楽です.その代わり,排他書き込み処理あるいは,同期処理といったプログラマからは直接見えないオーバーヘッドが大きくなりがちです. メッセージパッシング方式は,各プロセスが全データを一部ずつ所有しています.あるプロセスが他のプロセスが所有しているデータが必要なときは,明示的ににデータの要求を出して,受け取るといった操作をします.プログラマの負担は増えますが,プロセス間通信の量や頻度を細かく制御できるので,凝った最適化が可能です.

その他の回答 (1)

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

並列処理の場合、計算の主体、例えばプロセスやスレッドあるいはより直感的にはプロセッサ、が複数あって、その間で通信、つまりデータのやり取りをして計算を並列に進めます。 で、このデータのやり取りが「通信」と呼ばれ、並列処理ではほとんどの場合でなんらかの通信が必要にります。逆に言えば、通信しない部分は逐次処理(ただしそれぞれのプロセスが計算をすれば並列処理になる)と全く同じです。 共有メモリというのは、2つのプロセス(スレッド)から同じメモリの内容(アドレスは違うかもしれない)が見えるような仕組み(多くはハードウェアによる。まれにソフトウェアで実現されている場合もある)になっていて、このメモリに一方が書き込んで、他方が読み込めば、データの受け渡しが実現できることになります。 一方、メッセージパッシング方式では、一方のプロセスではメッセージ(データ)を別のプロセスに送信する、という関数を呼び、他方のプロセスではデータを受信する関数を呼ぶことで、データの受け渡しを実現しています。メッセージパッシングではなんらかのネットワークを経由してメッセージが送られます。 他にも No.1 さんのおっしゃるように、同期とか排他制御とかいろいろとありますが、これらは書き出すときりがないのでこの辺りで止めておきます。

関連するQ&A

  • 共有メモリについて

    Linux関連でプログラムの作成をしているのですが、 共有メモリについての知識がほとんどありません。 それで 1.共有メモリの最大サイズ(カーネルの設定によると思いますが、デフォルトの値など) 2.共有メモリを使用するさいの排他処理について などがわかる方、もしくは解説したHPなどがありましたらどうか教えてください。 よろしくお願いします。

  • トークンパッシングのかんがえかたについて

    私は単なるしろうとユーザーなのですが、トークンリングに興味を持っていろいろ調べている所です。 パソコンのトークンリングはもう殆ど使われなくなったそうですが、FTTHに引継がれて活躍していると聞きました。 そこで素朴な質問なのですが、 セグメントの中でトークンを持った一つだけの信号が通過するから、トークンパッシング方式は衝突が起きずに高速安定が実現できる、と聞きました。 ということは、誰かひとりが超巨大ファイルの転送などで長いこと使っていると、その処理が終わるまで他の人は誰もネットワークを使えなくなる、ということかと思ったのですが、そうだと小規模LANなら待ってもらえばいいかもしれないけど、FTTHだとあってはならない障害になるだろうな、と思いました。 トークンパッシング方式というのは、こういう長時間の独占については、何人かの信号が並列できるような回避策がもりこまれているのでしょうか? あんまり専門的なことは解らないのですが、ひとりが使用中には本当に誰も使えないのか、複数のひとが使えるのかということだけしろうとレベルでわかれば幸いに思います。 どうぞよろしくおねがいします。

  • 共有メモリの削除

    Cでunix系のネットワークプログラムをくんでいます。 シェアードメモリ(共有メモリ)を使用して作業していますが、 あるブロックを指定して共有メモリを削除する方法はどうすればよいですか? *shmclientという構造体の共有メモリがあります。 n番目の共有メモリを削除したいです。 memcpy((char *)(shmclient+n), 0, sizeof(shmclient)); 上のように0(NULL)をコピーしましたが成功しませんでした。 よろしくお願いします。

  • 仮想記憶方式に関する問

    プログラムにおける2つの並列実行単位(タスク)が動作する論理記憶空間を同一にした場合と、分離した場合のメリットとデメリットを説明せよ。 という問題です。 スーパースカラ方式(多重並列命令制御の中でも、複数の命令を同時処理する方式)とVLIW(1つの大きな命令を作り出して実行する方式)の比較ということでしょうか? ご教示お願い致します。

  • 共有メモリについて

    はじめまして! JAVA初心者です。 JAVAで共有メモリって使えるんですか? Cで生成した共有メモリをアタッチ出来る方法 をご存知の方がいらっしゃいましたら、教えて 頂けないでしょうか? お願いします。

  • 1個のメモリを2個のCPUで共有する方法

    お世話になります。 1個のメモリを2個のCPUで共有する方法について、参考例教えてください。 メモリに画像を取り込み認識するのですが、処理速度向上のため、画像取り込みその他の仕事と、認識を分けてと考えています。 メモリを共有するときに気おつけ無ければならないことも御願いします。 よろしく御願いします。

  • 1個のメモリを2個のCPUで共有する方法

    お世話になります。 1個のメモリを2個のCPUで共有する方法について、参考例教えてください。 メモリに画像を取り込み認識するのですが、処理速度向上のため、画像取り込みその他の仕事と、認識を分けてと考えています。 メモリを共有するときに気おつけ無ければならないことも御願いします。 よろしく御願いします。

  • 情報処理技術者の問題で。

    多重プログラミングに関する記述として適切なものはどれか。 ア、ジョブとしては多重で処理されるが、シングルタスクで実行する イ、タスクの実行中に、入出力などを行ったために生じるCPUの空き時間を利用して別タスクを並列に実行する。 ウ、プログラムの実行中に、自分自身を呼び出して実行するプログラミング方法である。 エ、プログラムを並列に処理するので、ハードウェアとして複数のプロセッサとメモリを結合した並列処理システムが必要である。 答えはイだと思うのですが、 ア、ウ、エの文章のそれぞれどこが違うのかも理解しておきたいと思っています。 ア、ウ、エはどこが間違っているでしょうか?

  • サンク方式について

    1. サンク方式とは、動的に関数を作る方法。 つまりnewなどでメモリを確保し、そこに関数のコードを書き込む、という認識でよろしいでしょうか? 2. 理解力不足で申し訳ないのですが、サンク方式の必要性がいまいち理解出来ません。 これは例えばどんな場合に必要になるものなんですか?

  • 【Fortran】共有メモリの使い方

    【Fortran】共有メモリの使い方 http://rakasaka.fc2web.com/delphi/mapping.html こちらを参考にして、WindowsでC++から Fortran(77)プログラム呼び出して、 共有メモリを使用したソースを書こうと思っていますが 全然ソースが書けません。 何か参考となるページやアドバイスを頂けませんでしょうか。 現在、C++からCreatProcessでFortranのプログラムを呼び出すこと までできています。 C++のソースは http://staff.aist.go.jp/toru-nakata/sukkoro.html を参考にして作っています。