• 締切済み

OSのコマンドを呼び出すとき、CPUを最大限に使いたい

OS(ディストリビューション)はUbuntu、言語はC++を用いています。 以下のプログラム: int main(void) { unsigned long int cnt_max=ULONG_MAX; for(unsigned long int i=2;i<=cnt_max;i++){ string str =":"; char c[1024]; strcpy( c, str.c_str() ); FILE *fp = popen(c, "r");・・・※ pclose(fp);・・・※ } } では、確かに実行したいこと(ここでは何もしませんが)が行われます。 ところが、topコマンドで見るとCPUを数%しか用いていません。 ※の部分を消すと、100%使いますので、 どうやらOSのコマンド(ここでは「:」)を実行するときには100%使ってくれないようです。 では、100%使ってくれるようにするにはどうしたらよいでしょうか?

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

setpriorityとgetpriorityを使用すると、プログラムの優先順位を変更することが出来ます。従って、そのプログラムで、setpriorityを呼び出し、そのプログラムの優先順位を上げることが出来ます。但し、優先順をあげる事が出来るのは、スーパーユーザのみですので、スーパーユーザになって、そのプログラムを実行する必要があります。詳しくは、 setpriorityについて調べて下さい。man setpriorityで参照可能です。

noname#108554
質問者

お礼

ありがとうございます。 priorityはもともと最優先になっています。 念のため、プログラム内でsetpriorityも記述してみましたが、 状況は変わりませんでした。

  • 6yemon
  • ベストアンサー率69% (25/36)
回答No.4

":"コマンドって何?という事はさておき、 popen()関数は子プロセスを起動します。ということは当たり前のことですが、関数内部でfork()システムコールを呼びます。fork()はカーネルの処理の中でも、比較的重い(時間のかかる)処理だと思います。さらに、起動された子プロセスがexitするまでpclose()関数はリターンしません(ブロックされる、と言います)。つまり、子プロセスにCPUが与えられないと全体の処理が進まないという事を意味します。 おそらくpopen()で子プロセスを起動することが要件としてあるのだと思いますが、ここでご理解いただきたいのは、子プロセスが速く処理を終了する事と、このプロセスが100%CPUを使う事は、決して両立しない、という事です。 文字列操作などは自分のメモリ上だけで処理できるのでCPUを100%使えますが、入出力処理があったり、マルチタスクやネットワークが関係する処理は、相手となるプロセスや周囲のプロセスの進行状況によって、自分の処理の進み具合が変わってしまいます。ですから、CPUを100%使えるほうが少ないと思います。 むしろ、自分が100%CPUを使おうとすれば、周りのプロセスが動けなくなり、かえって全体の処理が進まない、という結果になりかねません。物事がスムーズに進むためには譲り合いの精神が大切なんですね(笑)。 さて、このプログラムの処理が速く進むためには、子プロセスの実行が速やかに終了することが一つの条件のように思われます。そこで試しに、このプロセスのnice値(プロセスの優先度)を上げて起動してみたらいかがでしょうか。 このプロセスのnice値は子プロセスに引き継がれますので、子プロセスがいざ実行しようという時、有利になる(早くCPUが回ってくる)可能性があります。 ただし念のため繰り返しますが、何でもかんでもnice値を上げればよい、という「強欲」な姿勢ではいけません。この点、ご注意を。

noname#108554
質問者

お礼

ありがとうございます。 priorityはもともと最優先になっています。 念のため、プログラム内でsetpriorityも記述してみましたが、 状況は変わりませんでした。

noname#108554
質問者

補足

:コマンドは「何もしない」コマンドです。 http://flex.ee.uec.ac.jp/texi/sh/node49.html お礼等は後ほど書きますので、よろしくお願いします。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

その数%というのは、popen,pclose込みの使用率なのでしょうか? どうも、osのシステムコールを除いた分の使用率なんじゃないかと思うのですが、どうなんでしょう。

noname#108554
質問者

お礼

ありがとうございます。 ためしにforループ中で cout << i <<endl; で出力させてみましたが、 やはり※があるのとないのとでは全然速さが違います。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>100%使ってくれないとプログラムが遅くて全然進まないからです。 CPUの使用率を上げるよりも、そのプログラムのアルゴリズムを見直す、 といった方が、他のタスクを実行している人たちに迷惑がかからないと思います。 マルチタスキングOSで、特定のタスクがCPUをフルに使ってしまうと どうなるかはご存じですね?

noname#108554
質問者

お礼

私が用いようとしているサーバはほぼ私しか用いず、 さらに旧式なのでさほど問題とはなりません。 絶対に他の人がログインしないとは言い切れませんが、 私ほど重いタスクはしません。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

100%「も」CPUを使いたい理由は何ですか? そのループの中で無限ループを構成すれば、 ほぼ100%に近いCPU使用率を記録できるかもしれません。

noname#108554
質問者

お礼

ご回答ありがとうございます。 >100%「も」CPUを使いたい理由は何ですか? 100%使ってくれないとプログラムが遅くて全然進まないからです。 ちなみに、質問文のプログラムはサンプルプログラムで、 別に:コマンドを早く終了させたいわけではありません。 >そのループの中で無限ループを構成すれば、 >ほぼ100%に近いCPU使用率を記録できるかもしれません。 それはそうかもしれません。 ですが、ここではそうではなくて、 OSのコマンド実行時のことを考えております。 つまり、OSのコマンドをなるべく早く終了させたいということです。 以上、よろしくお願いいたします。

関連するQ&A