回答:
待機チャネルは、タスクが現在待機しているカーネル内の場所です。タスクはリソース(データまたは処理時間)を待機する必要があります。これら2つには、ネットワークソケット、ハードウェア、ファイルなどが含まれます。Unixライクなシステムでは、それらのほとんどは単なるファイルであるためです。
0
:プロセスは待機していません
poll_schedule_timeout
poll()
I / Oの処理に使用されるシステムコール1です。に似てい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つのタスクのみが共通リソースにアクセスできるという考え方です。このために、システム内のフラグが設定されます。
プロセスがロックされたリソースを待機している場合、これはビジー待機 または「スピニング」と呼ばれ、可能な限りアクセスを試行することを指します。タスクはスピンするとブロックされると言われています。
フューテックスロックは、ユーザー空間の数値と考えることができ、タスクによって増減できます(リソースに複数のタスクがアクセスできる場合、この数値は1より大きくなります)。これは図4に示されている番号です。
これらのタスクは、いくつかの作業を実行する必要があるタスクの単純なキューである待機キューに自分自身をエンキューします。処理時間が使用可能になると、タスクは作業を実行し、キューから削除されます。
futex_wait_queue_me
タスクをキューに入れます。その後、シグナル、タイムアウト、またはウェイクアップを待ちます。この待機チャネルにあるタスクは待機キューで待機しておらず、キューに登録されるのを待っています。
__skb_recv_datagram
ロックされたネットワークソケット上のデータを待ちます。
sk_wait_data
ネットワークソケット上のデータを待ちます。
do_exit
これはプロセスを終了する最後の部分です。次をdo_exit()
呼び出して、schedule()
別のプロセスをスケジュールします。とき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()
メソッドを使用して、プロセスがスリープしています。このメソッドは、ナノ秒の精度で特定の時間間隔でスリープするプログラムに使用できます。
これらはすべてではありませんが、私は他を観察しませんでした。何か見逃した場合は、コメントを投稿してください。
signal
?私はそれに遭遇しました。プロセスは停止していますか?ゾンビ?または何?プロセスはどうなりますか?
待機チャネルの値は、プロセスが現在ブロックされているカーネル関数の名前です。
この名前は通常、システムコールに関連しており、システムコールにはマニュアルページがあります。
より詳細な情報が本当に必要な場合は、カーネルソースを確認してください。
あなたが入力した場合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は、プロセスが何かを待っていることを示します。
ソース:1. 待機チャネル(WCHAN)とアラームを処理しますか?-2. AskUbuntuの回答