0

Linux のプロセスについていくつか調べようとしていますが、いくつか質問がありますので、お答えいただければ幸いです。

この小さなプログラムを実行して、それがどのように機能するかを確認しました。

#!/bin/bash
count=1
while [ true ]
do
  echo "Counter $count "
  count=$(( $count + 1 ))
done

ただの無限ループです。

ここで、プログラムを実行topしてシェルでコマンドを使用すると、そのプロセスがより多くの CPU リソースを消費します。

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND   
4037 lola    20   0  16880 1248 1028 R   80  0.0   0:33.42 memoryleak.sh  

プログラムをしばらく実行させましたが、CPU 消費量が 85% を超えることはありません。なぜですか? それはOPの衛生のメカニズムだと思いますが、本当なら、どれが決定するパラメータですか. さらに、カウンターはまだ機能しており、私が見る限り、無限に機能する可能性があります. CPU を集中的に使用するプログラムが CPU をクラッシュさせないのはなぜですか?

ここで、プロセスを中断して( STOPシグナルを送信して)、以下を実行すると、次のps auxようになります。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
lola       3896 24.4  0.0  16880  1248 pts/3    T    09:15   0:37 /bin/bash ./cpukilla.sh

プロセスを停止した後、CPU 使用率が 24% のままなのはなぜですか? ゼロであってはいけませんか?

任意の支援をいただければ幸いです。

EDIT:メモリリーク用語の「混乱」については申し訳ありません。それでもなお、カウントは解放せずに多くのメモリを消費しているため、技術的にはメモリ リークではないでしょうか?

4

3 に答える 3

0

通常、メモリ リークとは、メモリのチャンクがプログラムに割り当てられ、(通常はプログラミング エラーが原因で) メモリのチャンクがプログラムによって解放されない状況を指します。実際には、ここの bash スクリプトにはメモリ リークはありません。

OS は、プロセスが CPU を 100% 制御することを防ぎます。Linux はプリエンプティブなマルチタスク システムです。CPU の制御を放棄することはありません。スケジューラは、CPU タイムスライスを必要とするすべてのプロセスが 1 つを取得することを保証します。Linux スケジューラーの詳細はこちら: http://www.ibm.com/developerworks/linux/library/l-scheduler/

STOP シグナルを送信してもプロセスは終了しません。一時停止するだけです。続行するには、SIGCONT を送信します。終了すると、プロセス リストから削除されます。

于 2012-04-09T14:23:20.770 に答える
0

まず第一に、これによりメモリリークはまったく発生しません。「メモリリーク」を別の概念と間違えているかもしれません。メモリ リークは、メモリを割り当てて解放できなかった場合に発生します。ここでは、メモリを直接割り当てていません。

  1. カーネルはすべてのプロセスに時間を予約するので、誰も「飢え」、特に自分自身のために時間を確保できるため、すべてをうまくスケジュールできます(ところで、そのようなスクリプトは、たとえば、マルチタスクが不十分に実装されている Windows 98 をクラッシュさせます)。
  2. なぜCPUがクラッシュするのですか?この質問は意味がありません。はい、無限に機能します。
  3. 実行されていません(thanks geekosaur)
于 2012-04-09T14:15:16.400 に答える