• ベストアンサー

共有メモリを使う場合のCPU負荷について

共有メモリを使うプログラムでCPU負荷が100%になります.対策方法があれば教えてください. ちなみにCreateFileMapping関数で読み書きを行っています.

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

  • ベストアンサー
noname#30727
noname#30727
回答No.2

#1です。 現在の状態はこんな感じですよね。 ■プロセスA (Writing) while (1) { 共有メモリに書き込み(); } ■プロセスB (Reading) while (1) { 共有メモリから読み込み(); 読み込んだデータを表示(); } 私ならどうするかでお答えしますが、まずはCreateEventのドキュメントを読んで下さい。 名前付イベントオブジェクトを作成しますが、2つのプロセスで全く同じに作成すれば、後から作成される方は作成済みオブジェクトをオープンします。 lpEventAttributesは必要がなければNULL、bManualResetは自動リセットでいいのでFALSE、bInitialStateは非シグナル状態でいいのでFALSE。lpNameは適当な名前にして下さい。 この例では各プロセスで2つずつ作成しています。 ■プロセスB (Reading) HANDLE handle1 = CreateEvent(NULL, FALSE, FALSE, "name1"); HANDLE handle2 = CreateEvent(NULL, FALSE, FALSE, "name2"); while (1) { WaitForSingleObject(handle1, INFINITE); // 共有メモリに書き込みされるまで待つ 共有メモリから読み込み(); SetEvent(handle2); // 受け取ったことを通知する 読み込んだデータを表示(); } このような感じで作成してみて下さい。 必要であればWaitForSingleObject()のタイムアウト値を数秒に設定してタイムアウトの処理を入れて下さい。 WaitForSingleObject()は、指定したオブジェクトがシグナル状態になるまでスレッドを停止させます。CPU負荷は0に近いです。 SetEvent()は、イベントオブジェクトをシグナル状態にします。自動リセットにしているので、WaitForSingleObject()で待ち終われば非シグナル状態に自動で戻ります。 ■プロセスA (Writing) HANDLE handle1 = CreateEvent(NULL, FALSE, FALSE, "name1"); HANDLE handle2 = CreateEvent(NULL, FALSE, FALSE, "name2"); while (1) { Sleep(1000); // テスト用に少し間隔をあけておく、実際には新たに書き込むデータが定期的に作成されるはず 共有メモリに書き込み(); SetEvent(handle1); // 書き込み終了を通知する。プロセスBのWaitForSingleObjectを呼び出したスレッドが動き出す WaitForSingleObject(handle2, INFINITE); // 書き込んだデータが受け取られるのを待つ } こちらも必要であればタイムアウトの処理などを追加して下さい。 お互いにお互いを待っています。書き方を間違えるとデッドロックするので注意して下さい。 どこか間違っているかもしれませんが、色々試してみてください。 とういか、長文疲れました(笑

robo344
質問者

お礼

長文で詳細な説明をありがとうございます.”CreateEvent”を使うのですね.しかし,私は自作の構造体への読み書きがよくわかりません.  私が最終的にしたいのは複数のプロセスへの読み書きです.まずは,inthefloiさんが述べられておられるような「2つのプロセス間の読み書き」をしようと考えております. まだだいぶ違うのでしょうがこういった形になりました.日記のところに書き込みました.ご指導よろしくお願いします. http://members.goo.ne.jp/home/goo043322

その他の回答 (2)

noname#30727
noname#30727
回答No.3

#1です。 なんとも誤解があるようですね。 私が書いたのは、2つのプロセス間の読み書きの方法ではなくて、質問にあるように、CPU負荷が100%になる理由と対策についてのヒントです。 それらを足がかりにして、関連するドキュメントを読んで同期について理解を深めれば、プロセスが幾つであっても問題ではないはずです。 頑張ってください。

robo344
質問者

お礼

ご返答ありがとうございます.たしかにCPU負荷が少なそうです.CreateEvent関連のドキュメントをチェックしてがんばってみます.それでは.

noname#30727
noname#30727
回答No.1

非同期でポーリングしつづけているって事ですか? どういう使い方をしているのか良くわかりません。 共有メモリに書き込んだ事をEventオブジェクトで通知するとか、Sleepを入れるとか、とにかくポーリング間隔をできるだけ大きくすればいいんじゃないかと。

robo344
質問者

お礼

CPU使用率100%になる原因は,無限ループを使うことで起こりました.共有メモリの操作部分ではなかったです.今,CPU使用率100%のプロセスの優先度を下げるためにCreateProcess関数を使おうと考えております. Windowsにおけるプログラミングで「CPU使用率100%=悪」というわけではないのですね. 共有メモリはデータを受け渡しすることが目的なのでデッドロックさえ回避すればCPU使用率100%でもちゃんとデータが渡るはずですね. どうしてもデータが受け渡らなければマルチプログラミングで複数のプロセスのスケジューリングをしてみます. ご親切に詳細なご説明をありがとうございました.

robo344
質問者

補足

開発環境 OS:Win2k, Pen3 500MHz または OS:WinXP, Pen4 2.4GHz コンパイラはいずれもVC++6.0を使用しております. よろしくおねがいします.

関連するQ&A

  • メモリを増やせばCPUの負荷が減るかどうか

    今使っているソフトを起動した上でCPUの負荷を調べてみると、80パーセント以上使っていました。これからもっと負荷がかかるようになると思うのですが、メモリを増やせばCPUの負荷がかるくなるといったことはあるのですか?

  • Delphi6 DLL内でのメモリ共有(?)

    こんにちは、honiyonです。  複数アプリケーションからそれぞれコールバック関数を登録してもらい、状況に応じてそれぞれのコールバック関数を呼び出す、というDLLを作成しています。  しかし現在、呼び出しアプリケーションごとにメモリ空間が独立してしまい、コールバック情報を同一空間内で管理出来ずに困っています。  旧VerのDelphiで16bit DLLなら、interface部に定義した変数、オブジェクトはDLL内で同一空間内で共有出来るようですが、これをDelphi6 32bitDLLで行う事は不可能でしょうか? もしくは、その他の方法で独立メモリ空間を作らないようにする方法はありますでしょうか?  不可能な場合、CreateFileMappingが次に有効な手段として候補に挙がると思います。CreateFileMappingで管理クラスのポインタを渡してクラス共有というのは現実的な手法でしょうか?  よろしくお願いいます(..

  • パソコンのメモリとCPUの負荷について

    パソコンのメモリとCPUの負荷について 私は富士通のFMV-BIBLO NF/D70 CORE2(2.53GHZ×2)、 メモリ4GB ウインドウズVISTAのノートパソコンを使っています。購入して半年くらいです。無線LANでネットをしています。 普段はブラウザとメーラー、サイドバーくらいしか起動しておらず、PC起動時に勝手に?常駐するプログラムで使わないものは、終了させて負荷を減らしています。 しかし、CPUとメモリのメーターを見ると、メモリが常に半分くらい使用されおり、時々何も触っていないのに、パソコンからファンの音がして、CPUにかなり負荷がかかっている場合があります。時にはMAX近くまで行ってしまいます。 動画も見ませんし、ハードディスクの空きもあります。 メモリの増設は4GBがMAXで増設できないようです。 パソコンのスペック的には、全く問題ないと思うのですが、異常に負荷がかかった状態になってしまうのは何が原因と考えられますか? 関係あるかわかりませんが、ウイルスソフトはノートンインターネットセキュリティです。 ご存知の方いらっしゃいましたら、ご教授願います<m(__)m>

  • CPUにかなりの負荷がかかるのですが・・・

    2年半ほど前に知人に作ってもらった自作パソコンを使用しているのですが、ここ最近CPUの負荷の掛かりかたがどうもおかしいんです。 なにもしていない状態なら使用率は0~10%ぐらいなのですが、タスクマネージャーを開くだけで一時的に100%になったり、動画を見ると80~100%のまま動きがカクカクして見えたりと、全体的に重くなっています。 プロセスを見てみると、起動したアプリケーションが40~50%、「explorer.exe」が25~40%を占めています CPUはPentium4 2.8GHzです。 メモリはメーカー不明ですが512M+1Gを搭載していますので、メモリが足りないということはないと思います。ちなみに1Gのメモリは1ヶ月ほど前に増設しました。 ウィルスもavastで検索してみましたが見つかりませんでした。 なにぶん自作パソコンなのである程度動作が不安定なのは解っていますが、もし対策などがあれば教えてください。 よろしくお願いします。

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

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

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

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

  • 共有メモリでのデータ読み書きについて

    Linuxで共有メモリを複数プロセスで読み書きする場合について質問させて頂きます。 CPUは32ビットで、共有メモリ上の、int(32ビット)の領域を 複数のプロセスで読み書きする場合を想定した場合、 セマフォ等でロックした方が良いのでしょうか? または、CPUが1命令で読み書きすることが可能 (と思っていますが、違っていればご指摘お願い致します)なので、 セマフォ等のロックをかけなくても、問題はないものなのでしょうか? 割りと良くありそうな疑問だと思ったのですが、 ウェブで調べた限りでは該当する質問はありませんでしたので、 質問させて頂きました。 ご回答宜しくお願い致します。

  • CPUとメモリってそもそもなんですか?

    メモリとCPUの違いがよくわかりません。 一番聞きたいのは、メモリを増設するとCPUへの負荷が減るかどうかということです。 よろしくお願いします。

  • 原因はメモリ?CPU?

    パソコンでネットをしてるときにウィンドウを10個くらい開くとパソコンがウィーンとうなるのですが(負荷がかかってると思う)、これをやわらげる方法はメモリを増やせばいいのでしょうか?もっといいCPUにすればいいのでしょうか?それとも他? 今はvistaのcore2の2.00GHzで、3Gのメモリを使っています。 またこの負荷をやららげることによってスムーズに通信できる等の何かいいことはあありますか? 2点お願いします。

  • CPUに負荷がかかると遅くなる

    CPUに負荷がかかるとファイルを開くにしろ、アプリケーションを使うにしろ、とにかく起動が遅くなります。再起動すれば直るんですが、再起動などしなくても直せる方法はないでしょうか?

専門家に質問してみよう