9

これはLinuxOS上にあります。アプリはACEライブラリを使用してC++で記述されています。

プロセス内のスレッドの1つが異常に長い時間(5〜40秒)ブロックされることがあると思われます。この問題がある1日に数回を除いて、アプリはほとんどの場合正常に動作します。ボックスで実行されている他の同様の5つのアプリがありますが、これらのアプリも、ソケットの着信データが重いためにI/Oバウンドになっています。

スレッド/プロセスがタイムスライスを取得しているかどうかを確認するためにプログラムで実行できることがあるかどうかを知りたいです。

4

1 に答える 1

4

プロセスが不足している場合、そのプロセスの自己監視はそれほど生産的ではありません。ただし、そのプロセスにしばらく実行されていないことを通知したい場合は、times定期的に呼び出して、経過時間の相対的な差をスケジュールされたユーザー時間の相対的な差と比較できます(必要に応じてフィールドtms_utimetms_cutimeフィールドを合計します)子供を待つことを生産的な時間として数えるために、そしてあなたがあなたに代わって費やされたカーネル時間を生産的な時間として数えるならば、あなたはtms_stimeとフィールドに合計するでしょう)。tms_cstimeスレッド時間については、私が知っている唯一の方法は/procファイルシステムを調べることです。

優先度の高い外部プロセスまたは優先度の高いスレッドは、プロセス(およびスレッド)の適切な/proc/<pid>/statエントリを読み取ることにより、対象のプロセス(およびスレッド)を外部から監視できます/proc/<pid>/task/<tid>/stat。ユーザー時間は、ファイルの14番目と16番目のフィールドにありstatます。システム時間は、15番目と17番目のフィールドにあります。(フィールドの位置は、私のLinux 2.6カーネルでは正確です。)

2つの時点の間で、経過した経過時間を決定します(通常、モニタープロセスまたはスレッドは定期的にウェイクアップします)。次に、これらの各時点での累積処理時間の差は、対象のスレッドがその時間中に実行された時間を表します。経過時間に対する処理時間の比率は、タイムスライスを表します。

最後にもう1つ、Linuxでは、次を使用して、ディレクトリ内tidの権利を調べるための現在のスレッドを取得します。task/proc/<pid>/task/

tid = syscall(__NR_gettid);

gettidこれを行うのは、文書化されていても、システム上のどのライブラリからも実際にエクスポートされたシステムコールが見つからなかったためです。しかし、それはあなたのもので利用できるかもしれません。

于 2012-06-19T21:45:57.910 に答える