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


36

GNOMEシステムモニターの[プロセス]タブには、[待機チャネル]列があります。ここで見られる最も一般的な値はpoll_schedule_timeoutですが、0do_exitdo_waitfutex_wait_queue_mepipe_wait__ skb_recv_datagramunix_stream_data_waitの値もあります

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

スクリーンショット

回答:


42

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

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

  • poll_schedule_timeout

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

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

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

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

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

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

    プロセスがロックされたリソースを待機している場合、これはビジー待機 または「スピニング」と呼ばれ、可能な限りアクセスを試行することを指します。タスクはスピンするとブロックされると言われています。

    これを読むことができれば、この答えの少なくとも1つの間違いを訂正する義務があります:P

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

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

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


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

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

  • sk_wait_data

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

  • do_exit

    これはプロセスを終了する最後の部分です。次をdo_exit()呼び出して、schedule()別のプロセスをスケジュールします。とき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()メソッドを使用して、プロセスがスリープしています。このメソッドは、ナノ秒の精度で特定の時間間隔でスリープするプログラムに使用できます。

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


sleep_on_page_killableに出会いましたか?
アキシラス氏

sleep_on_page_killableの原因として最も可能性が高いのは、プロセスがメモリにないページをロードしようとしているため、ページフォールトが発生し、ページがロードされるまでプロセスをスリープ状態にする必要があることです。I / Oサブシステムが過負荷になっている場合(多くのI / Oを行っているためである可能性があります)、これは頻繁に表示される可能性があります。
ツナ

どうsignal?私はそれに遭遇しました。プロセスは停止していますか?ゾンビ?または何?プロセスはどうなりますか?
itsnotmyrealname

11

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

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

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

より詳細な情報が本当に必要な場合は、カーネルソースを確認してください。

あなたが入力した場合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ポーリング処理します

ソース:1. 待機チャネル(WCHAN)とアラームを処理しますか?-2. AskUbuntuの回答



私はあなたの答えを再利用してその答えを改善したことに気づいたようです;-)どのような帰属を持ちたいですか?
マキシムR.

2
あなたのコメントは私を満足させるのに十分すぎるほどです:)帰属がどのように機能するかについて知りたいなら、このテーマに関する素敵なSOブログ投稿があります。心配しないでください。できるだけ私の作品を再利用してもらいたいです。
ステファノパラッツォ

1
さて、私はメタに関するこのトピックに関する質問を書いていました。(すでにブログ投稿を読んでいた)
マキシムR.

それはですここ。そして、あなたの答えはある時点で私のものになるだろうと思います^^
マキシムR.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.