为什么调用 chill() 后时间戳会增加,但 vtimestamp 和 walltimestamp 不会增加?

为什么调用 chill() 后时间戳会增加,但 vtimestamp 和 walltimestamp 不会增加?

我想了解为什么调用chill()DTrace 操作块会增加timestamp变量,但不会增加vtimestampwalltimestamp

timestamp这是一个显示调用后增加的示例chill()

# dtrace -w -c true -n 'pid$target:::entry {self->t = $1; chill(1); printf("%d\n", $1 - self->t);}' timestamp
dtrace: description 'pid$target:::entry ' matched 3082 probes
dtrace: allowing destructive actions
dtrace: pid 6734 has exited
CPU     ID                    FUNCTION:NAME
  5  83475          _r_debug_postinit:entry 11258

  5  85771                     atexit:entry 2218

  5  86468              __libc_atexit:entry 491

  5  86428                       exit:entry 441

  5  85397    __cxa_thread_call_dtors:entry 441

  5  86213             __cxa_finalize:entry 447

  5  86213             __cxa_finalize:entry 565

  5  83470            _rtld_addr_phdr:entry 454

  5  86213             __cxa_finalize:entry 431

  5  83470            _rtld_addr_phdr:entry 1645

  5  84405                      _exit:entry 432

如果我们运行相同的脚本但使用walltimestamp(或vtimestamp),我们将看到计数器没有增加:

# dtrace -w -c true -n 'pid$target:::entry {self->t = $1; chill(1); printf("%d\n", $1 - self->t);}' walltimestamp
dtrace: description 'pid$target:::entry ' matched 3082 probes
dtrace: allowing destructive actions
dtrace: pid 6707 has exited
CPU     ID                    FUNCTION:NAME
  4  83475          _r_debug_postinit:entry 0

  4  85771                     atexit:entry 0

  4  86468              __libc_atexit:entry 0

  4  86428                       exit:entry 0

  4  85397    __cxa_thread_call_dtors:entry 0

  4  86213             __cxa_finalize:entry 0

  4  86213             __cxa_finalize:entry 0

  4  83470            _rtld_addr_phdr:entry 0

  4  86213             __cxa_finalize:entry 0

  4  83470            _rtld_addr_phdr:entry 0

  4  84405                      _exit:entry 0

这对于 来说是可以理解的vtimestamp,因为执行 DTrace 代码时它不会增加,但我不明白walltimestamp这里的行为。

我在 amd64 上运行 FreeBSD 13.1-RELEASE-p1。

答案1

显然,这是 DTrace 中的一个错误。显然, 的实现chill()仅使变量的缓存值无效timestamp,而 for 的实现则不然walltimestamp,这是不正确的。

感谢马克约翰斯顿提供的答案FreeBSD DTrace 邮件列表

相关内容