web-dev-qa-db-ja.com

プロセスの「待機チャネル」とは何ですか?

GNOMEシステムモニターの[プロセス]タブには、[待機チャネル]列があります。ここで私が見る最も一般的な値は poll_schedule_timeout 、しかし、他の値も表示されます: 、 do_exit、 do_wait、 futex_wait_queue_me、 pipe_wait、 __skb_recv_datagram そして unix_stream_data_wait

では、この「Waiting Channel」列の意味は何ですか?そして、おそらくその中のいくつかの値は何を意味するのでしょうか?

Screenshot

36
8128

待機チャネルは、タスクが現在待機しているカーネル内の場所です。タスクはリソース(データまたは処理時間)を待機する必要があります。これら2つには、ネットワークソケット、ハードウェア、ファイルなどが含まれます。 Unixライクなシステムでは、それらのほとんどが単なるファイルであるためです。

  • 0:プロセスは待機していません

  • poll_schedule_timeout

    poll()はシステムコールです1 I/Oの処理に使用されます。 select()に似ています。2

    非ブロックI/Oを使用するアプリケーションは、これらの呼び出しを使用して、ファイルをブロックすることなく、ファイルの読み取りまたは書き込みができるかどうかを確認します。これらは、多くの場合、入出力ストリームに使用されますが、ブロックされない場合があります(そうしないと、マウスの移動が停止する可能性があります)。

    待機チャネルpoll_schedule_timeoutは、キーボードやマウスなどのハードウェア、サウンドデバイス、またはネットワークソケットのいずれかで、タスクがI/Oを待機していることを示します。

    1. カーネルの機能
    2. それらは<linux/poll.h>で定義されています。 pollはSystem Vで最初に見られた実装でした。selectはBSD UNIXと同等です。
  • futex_wait_queue_me

    これを説明するには、ロックを調べる必要があります。ロックは、タスクがリソースで機能することを示す、システムに保存された状態です。たとえば、ファイルを読み取るタスクは1つだけです。このタスクはファイル、他のタスクをロックします1 ファイルを読み取ろうとすると、ファイルがロックされていることがわかり、ロックが解除されるのを待ってからアクセスできます。プロセッサー時間についても同じことが起こります。

    Linuxの最新バージョン(ほとんどのアーキテクチャ)は、カーネルでFutex(高速ユーザー空間ミューテックス)ロックを使用します。ミューテックス、相互排除とは、共通のリソースにはいつでも1つのタスクしかアクセスできないという考え方を指します。このために、システム内のフラグが設定されます。

    プロセスがロックされたリソースを待機している場合、これはBusy Waitingまたは「Spinning」と呼ばれ、可能な限りアクセスを試行するという事実を参照します。タスクは、スピンするとblockedと呼ばれます。

    If you can read this, you are obligated to correct at least one mistake in this answer :P

    Futexロックは、ユーザー空間内の数値と考えることができ、タスクによって増減できます(リソースcanが複数のタスクからアクセスされる場合、この数値は1より大きくなる可能性があります)。これは図に示されている番号です4

    これらのタスクは、何らかの処理を行う必要があるタスクの単純なキューである待機キューに自分自身をキューに入れます。処理時間が使用可能になると、タスクは処理を行い、キューから削除されます。

    futex_wait_queue_meはタスクをキューに入れます。その後、シグナル、タイムアウト、またはウェイクアップを待ちます。この中にあるタスク待機チャネルは待機キューで待機しておらず、待ち行列に入れられるのを待っています。


    1. タスクはプロセスのいずれかです3 またはスレッド2
    2. スレッドはプロセスのサブセクションです。多くのスレッドが並行して実行できます
    3. プロセスは本格的なプログラムであり、1つ以上のスレッドで構成されますが、プログラムは複数のプロセスで構成することもできます。
    4. 覚えておいて、これはまだ物事の非常に高レベルのビューであり、実装の詳細を考慮していない
  • __skb_recv_datagram

    ロックされたネットワークソケット上のデータを待ちます。

  • sk_wait_data

    ネットワークソケット上のデータを待ちます。

  • do_exit

    これはプロセスを終了する最後の部分です。 do_exit()は、schedule() nextを呼び出して、別のプロセスをスケジュールします。 do_exit()が呼び出されると、プロセスはZOMBIEになります。

  • do_wait

    スケジューラの待機キューにプロセスが追加されます。

  • pipe_waitunix_stream_data_wait

    プロセスはサブプロセスからのデータを待っています。これは、たとえば次のようなコードを実行したときに発生します。

    echo | sleep 10 && echo hallo              # pipe
    

    または

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    hrtimer_nanosleep()メソッドを使用して、プロセスがスリープしています。このメソッドは、ナノ秒の精度で特定の時間間隔でスリープするプログラムに使用できます。

これらはすべてではありませんが、私は他を観察しませんでした。何か見逃した場合は、コメントを投稿してください。

42
Stefano Palazzo

待機チャネルの値は、プロセスが現在ブロックされているカーネル関数の名前です。

この名前は通常、システムコールに関連しており、システムコールにはマニュアルページがあります。

  • futex_wait_queue_mefutex に関連しています。これはミューテックスのタイプを指します ロック (高速ユーザー空間相互排除)は、1つのプロセッサーで多くのプロセスの動作をスケジュールするために使用されます。状態は、プロセスがロックを受け取るためにキューに入れられていることを示します。2
  • do_waitwait に関連しています。
  • 等.

より詳細な情報が本当に必要な場合は、カーネル 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は、プロセスが何かを待っていることを示します。

非同期I/O および ポーリング を扱います。

Source(s):1. プロセス待機チャネル(WCHAN)およびアラーム? -2. AskUbuntuの回答

11
Maxime R.