From: "とみたまさひろ" Date: 2007-09-29T21:35:58+09:00 Subject: [ruby-dev:31902] Re: 拡張ライブラリ内での SIGVTALRM とみたです。 On Wed, 26 Sep 2007 02:35:08 +0900 Yukihiro Matsumoto wrote: > |# setitimer(ITIMER_VIRTUAL) はユーザー空間での CPU 時間がカウントされる > |# ものだと思っていたので、システムコール中に SIGVTALRM が発生するのが不 > |# 思議。そういうものではないのかな…。 > 「プロセスの実行時間」にはユーザー空間だけでなくシステムコー > ルによるものも含むようです。ユーザー空間の実行時間によるタイ > マーも欲しいですよねえ。 Linux のソースを眺めてみたんですが、一応ユーザー時間だけを数えているよ うに見えました。 kernel/posix-cpu-timers.c の次の辺り。 | if (cputime_ge(utime, sig->it_virt_expires)) { | /* ITIMER_VIRTUAL fires and reloads. */ | sig->it_virt_expires = sig->it_virt_incr; | if (!cputime_eq(sig->it_virt_expires, cputime_zero)) { | sig->it_virt_expires = cputime_add( | sig->it_virt_expires, utime); | } | __group_send_sig_info(SIGVTALRM, SEND_SIG_PRIV, tsk); | } でも、Solaris も同様なんですよね…。 uts/common/os/clock.c: | /* | * If CPU was in user state, process lwp-virtual time | * interval timer. | */ | if (user_mode && | timerisset(&lwp->lwp_timer[ITIMER_VIRTUAL].it_value) && | itimerdecr(&lwp->lwp_timer[ITIMER_VIRTUAL], usec_per_tick) == 0) { | poke = 1; | sigtoproc(pp, t, SIGVTALRM); | } 何故 Solaris ではシステムコール中で SIGVTALRM が発生するのやら…。 -- とみたまさひろ 3469 42CC 4D32 F53C AD98 65A5 8C37 FF09 69C1 6040