Linux Kernel 2.6.27.45 の組み込みシステムでデーモンを実行しています。プロセスの 1 つが想定どおりに実行されず、さらに分析するためにstraceを使用しようとしました (ネット上のいくつかの投稿に従って、接続されたプロセスのスタック トレースを strace に出力する機能を追加しました)。使用したコマンドは次のとおりです。
enter code here
strace -T -i -r -tt -q -O 1 -o /tmp/syscallsM -p $tpid
次のような出力が得られます (列 1 でソートした後):
0.966638 [088cea24: 360eead8 08f9e71c ]089985d4 ]08998e20 ]12c9352c ]1058e71c ]10551388 ]1054e120 ]10517f40 ]105143e0 ]10514c1c ]write(33, "x", 1) = 1 <0.028588>
0.417500 [088d625c: 3b3e1878 121576e8 ]12163e1c ]1216473c ]12b6e75c ]112bc3e0 ]112d7880 ]112d7aa0 ]112d6b00 ]112d9aec ]112fd000 ]ioctl(29, 0x20004c01, 0) = 0 <0.000032>
0.282577 [1019e878: 30766c98 1374a008 ]1374a1f0 ]10198854 ]10198b0c ]1019908c ]10195cb4 ]10195e08 ]1019611c ]1019a810 ]10191fa0 ]--- SIGVTALRM (Virtual timer expired) @ 0 (0) ---
0.252104 [082f4808: 35a55a08 0899e314 ]1217ecb8 ]11c47918 ]1219a614 ]12bfeee4 ]1058e71c ]105c51f0 ]105c5980 ]10578674 ]105bfa4c ]futex(0x89ba380, FUTEX_LOCK_PI, 1) = 0 <0.000033>
私の質問は次のとおりです。
(1) たとえば、0.252104 で始まる行を考えると、252ms には、以前にスタックにあったすべての関数 (1019e878,...10191fa0) と futex( ) 現在のスタック (082f4808...1219a614,..10578674) に加えて、タスクがスケジュールされた時間に加えて、futex() 呼び出しの実行 (33us) を加えますか?
(2) futex() 呼び出しが本当にプロセスを待機させたかどうかを確認する方法はありますか?
(3) カーネルは、システム コールを行うたびにこのタスクをスケジュールしますか?
(4) 0.282577 で始まる行では、SIGALARM 時間によって 283ms の遅延が発生しますか? (5) 0.417500 で始まる行で ioctl() 呼び出しを行うと、418ms の遅延が発生しますか? (ただし、ioctl() 自体は 32us で行われます)。ありがとうございます。