GNOMEシステムモニターの[プロセス]タブには、[待機チャネル]列があります。ここで私が見る最も一般的な値は poll_schedule_timeout 、しかし、他の値も表示されます: 、 do_exit、 do_wait、 futex_wait_queue_me、 pipe_wait、 __skb_recv_datagram そして unix_stream_data_wait。
では、この「Waiting Channel」列の意味は何ですか?そして、おそらくその中のいくつかの値は何を意味するのでしょうか?
待機チャネルは、タスクが現在待機しているカーネル内の場所です。タスクはリソース(データまたは処理時間)を待機する必要があります。これら2つには、ネットワークソケット、ハードウェア、ファイルなどが含まれます。 Unixライクなシステムでは、それらのほとんどが単なるファイルであるためです。
0
:プロセスは待機していません
poll_schedule_timeout
poll()
はシステムコールです1 I/Oの処理に使用されます。 select()
に似ています。2
非ブロックI/Oを使用するアプリケーションは、これらの呼び出しを使用して、ファイルをブロックすることなく、ファイルの読み取りまたは書き込みができるかどうかを確認します。これらは、多くの場合、入出力ストリームに使用されますが、ブロックされない場合があります(そうしないと、マウスの移動が停止する可能性があります)。
待機チャネルpoll_schedule_timeout
は、キーボードやマウスなどのハードウェア、サウンドデバイス、またはネットワークソケットのいずれかで、タスクがI/Oを待機していることを示します。
<linux/poll.h>
で定義されています。 poll
はSystem Vで最初に見られた実装でした。select
はBSD UNIXと同等です。futex_wait_queue_me
:
これを説明するには、ロックを調べる必要があります。ロックは、タスクがリソースで機能することを示す、システムに保存された状態です。たとえば、ファイルを読み取るタスクは1つだけです。このタスクはファイル、他のタスクをロックします1 ファイルを読み取ろうとすると、ファイルがロックされていることがわかり、ロックが解除されるのを待ってからアクセスできます。プロセッサー時間についても同じことが起こります。
Linuxの最新バージョン(ほとんどのアーキテクチャ)は、カーネルでFutex(高速ユーザー空間ミューテックス)ロックを使用します。ミューテックス、相互排除とは、共通のリソースにはいつでも1つのタスクしかアクセスできないという考え方を指します。このために、システム内のフラグが設定されます。
プロセスがロックされたリソースを待機している場合、これはBusy Waitingまたは「Spinning」と呼ばれ、可能な限りアクセスを試行するという事実を参照します。タスクは、スピンするとblockedと呼ばれます。
Futexロックは、ユーザー空間内の数値と考えることができ、タスクによって増減できます(リソースcanが複数のタスクからアクセスされる場合、この数値は1より大きくなる可能性があります)。これは図に示されている番号です4。
これらのタスクは、何らかの処理を行う必要があるタスクの単純なキューである待機キューに自分自身をキューに入れます。処理時間が使用可能になると、タスクは処理を行い、キューから削除されます。
futex_wait_queue_me
はタスクをキューに入れます。その後、シグナル、タイムアウト、またはウェイクアップを待ちます。この中にあるタスク待機チャネルは待機キューで待機しておらず、待ち行列に入れられるのを待っています。
__skb_recv_datagram
ロックされたネットワークソケット上のデータを待ちます。
sk_wait_data
ネットワークソケット上のデータを待ちます。
do_exit
これはプロセスを終了する最後の部分です。 do_exit()
は、schedule()
nextを呼び出して、別のプロセスをスケジュールします。 do_exit()
が呼び出されると、プロセスはZOMBIE
になります。
do_wait
スケジューラの待機キューにプロセスが追加されます。
pipe_wait
、unix_stream_data_wait
プロセスはサブプロセスからのデータを待っています。これは、たとえば次のようなコードを実行したときに発生します。
echo | sleep 10 && echo hallo # pipe
または
cat < hello.c # unix data stream
hrtimer_nanosleep
hrtimer_nanosleep()
メソッドを使用して、プロセスがスリープしています。このメソッドは、ナノ秒の精度で特定の時間間隔でスリープするプログラムに使用できます。
これらはすべてではありませんが、私は他を観察しませんでした。何か見逃した場合は、コメントを投稿してください。
待機チャネルの値は、プロセスが現在ブロックされているカーネル関数の名前です。
この名前は通常、システムコールに関連しており、システムコールにはマニュアルページがあります。
より詳細な情報が本当に必要な場合は、カーネル source を確認できます。
ターミナルでcat /proc/some_pid/stack
と入力すると、そのような出力が得られます:
[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff
そして、最初の行では、システムモニターに表示されるものを取得します。私の知る限り、poll_schedule_timeoutは、プロセスが何かを待っていることを示します。
Source(s):1. プロセス待機チャネル(WCHAN)およびアラーム? -2. AskUbuntuの回答