我需要监视包含分支的一段代码,并且要确认clock_gettime()被logging为适用于此scheme。
这是伪代码:
starttime = clock_gettime() if (fork() == 0) { /* in the child */ endtime = clock_gettime() print "elapsed time is " endtime - starttime }
我可以find使用这种技术的示例代码,但是我担心在分叉期间时钟将被重置,然后减去endtime和starttime将是没有意义的。
fork()的这个描述提到重设一些定时器,但没有提到这些定时器如何与clock_gettime()相关。 通过省略,人们可以认为它没有受到影响,但是在依靠这种技术之前,我希望得到更多的保证。 http://man7.org/linux/man-pages/man2/fork.2.html
位图正在拉伸,而不是平铺
多核心处理器中的线程
Windows中的SOCK_PACKET
我可以编写一个testing程序来找出发生的事情,但是我更感兴趣的是find关于什么被定义为正确行为的文档。
编辑:我打算使用CLOCK_PROCESS_cpuTIME_ID和CLOCK_MONOTONIC_RAW
编辑2:我可以看到在叉手册页,与时间(2)相关的cpu计数器被重置,但我看不到clock_gettime()计数器在哪里重置。 clock_gettime()使用times(2)计数器,我没有看到它在哪里被logging。 如果是这样的话,我会认为时间(2)将在clock_gettime手册页中被引用。
链接器返回“重定位在符号索引处具有无效符号…”
我的蹦床不会反弹(绕路,C ++,GCC)
将数据序列化代码从C ++ linux / mac移植到C ++窗口
如何使用套接字重叠I / O?
英特尔指令的LOCK前缀。 有什么意义?
如果您使用CLOCK_PROCESS_cpuTIME_ID ,那么正确的行为是子级中的endtime是一个小的,接近零的值,因为fork将子设置为零。 对于父母来说,这将是一个稍大于开始时间的值,但几乎相同。
这在fork(2) manpage中有很好的记录,这也是有意义的 – 你创建一个新的进程。 新进程当然不会消耗任何cpu时间。 毕竟这是一个新生的过程! 另一方面,父母已经消耗了明显的cpu,并继续这样做,没有很好的理由为什么它的计数器应该归零(这将是一个谎言)。
像CLOCK_REALTIME或CLOCK_MONOTONIC等其他时钟不会受到影响(前者可以独立于你分叉被特权用户修改,但后者不能)。
那也是按照常识告诉你的。 他们是全球性的计时员,如果分派一个新的进程(几乎所有的时间都在发生)干扰他们,那将是一场灾难。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。