[ruby-dev:31902] Re: 拡張ライブラリ内での SIGVTALRM

From: とみたまさひろ <tommy@...>
Date: 2007-09-29 12:35:58 UTC
List: ruby-dev #31902
とみたです。

On Wed, 26 Sep 2007 02:35:08 +0900
Yukihiro Matsumoto <matz@ruby-lang.org> 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 が発生するのやら…。

-- 
とみたまさひろ <tommy@tmtm.org>
3469 42CC 4D32 F53C AD98  65A5 8C37 FF09 69C1 6040

In This Thread