睡眠作業の場合、WCHAN = 0ですか?

睡眠作業の場合、WCHAN = 0ですか?

私が進行中のプロセスの状態は少し混乱しています。次のようになります。

$ ps -eal | head -n 1 ; ps -eal | grep perf
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  7843  7842  0  80   0 - 10838 -      pts/6    00:00:00 perf

-- 従って状態はありSmanページの説明はです。「S中断可能な省電力モード(イベントが完了するまで待機)」、イベントを待っています。どこか待機チャンネルに登録されているようです。ただし、スタンバイチャネルはですWCHAN -。どのmanページで説明する「ジョブを実行すると、この列にダッシュ('-')が表示されます。」

また、含まれて/proc/7843/status含まれます。私は同じことを言うと思います。仕事は何も待っていません。State: S (sleeping)/proc/7843/wchan00proc//wchan

私が何かを間違って理解したのでしょうか、それとも矛盾していますか?

-そして、ジョブが実際に実行されていません。これがwchan予約されるのを待っているという意味ではありません。

出力が正しく設定されていない可能性がありますかwchan?私はUbuntu 14.04、カーネル3.13.0-86-genericを実行しています。

他のプロセスを確認すると、次のようになります。

$ ps -eal | head -n 1 ; ps -eal | grep fish
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  2407  2399  0  80   0 - 47675 wait   pts/0    00:00:07 fish
1 S  1000  2409     1  0  80   0 -  5500 poll_s ?        00:00:00 fishd
0 S  1000  2507  2399  0  80   0 - 45333 poll_s pts/3    00:00:00 fish
0 S  1000  2567     1  0  80   0 -  8366 wait   ?        00:00:00 fish

- ではWCHANここでは問題ありません。

答え1

プロセス状態とwchanはカーネルによって自動的に返されません。

これは、プロセス状態にアクセスしてwchan情報を取得する間に、その状態がスリープモードで実行中に変わる可能性があることを意味します。

だから競争があります。

これスタックウォーキングコースカーネル内でwchan情報を取得することも問題があり、すべてのケースを扱うことはできません。

クロスチェックcat /proc/$pid/stack(ルートのみ)、またはcat /proc/$pid/syscallプロセスがカーネルのどこにあるかに関する追加情報を取得できます。

答え2

WCHAN値が計算されたようです。カーネルソースコードからarch/x86/Kconfig

config SCHED_OMIT_FRAME_POINTER 
   Single-depth WCHAN output
   Calculate simpler /proc/<PID>/wchan values. If this option
   is disabled then wchan values will recurse back to the
   caller function. This provides more accurate wchan values,
   at the expense of slightly more scheduling overhead.

そして次からDocumentation/filesystem/proc.txt

wchan Present with CONFIG_KALLSYMS=y: it shows the kernel function
      symbol the task is blocked in - or "0" if not blocked.

だから時々wchanは計算を間違っていると思います。

関連情報