是brk(0)花了太多时间?

时间:2017-08-23 18:25:51

标签: c++ c redhat strace brk

这是strace -T -ttt -ff -x -y -o pid.trace -p 2145的输出。跟踪如下。

1503431273.934716 semop(1204093022, {{0, 1, SEM_UNDO}}, 1) = 0 <0.000004>
1503431273.934737 clock_gettime(CLOCK_REALTIME, {1503431273, 934741536}) = 0 <0.000004>
1503431273.934763 write(6</home/red/samples/debug/hexa.debug>, "17.08.23 01:17:53 [     hexa:2145"..., 79) = 79 <0.000016>
1503431273.934960 brk(0)                = 0x1adc000 <0.000004>
1503431273.934974 brk(0x1afd000)        = 0x1afd000 <0.000006>
1503431273.934994 brk(0)                = 0x1afd000 <0.000003>
1503431273.935006 brk(0)                = 0x1afd000 <0.000004>
1503431273.935017 brk(0x1afc000)        = 0x1afc000 <0.000008>
1503431273.935033 brk(0)                = 0x1afc000 <0.000003>
1503431273.935045 brk(0)                = 0x1afc000 <0.000004>
1503431273.935057 brk(0)                = 0x1afc000 <0.000004>
1503431273.935068 brk(0x1afb000)        = 0x1afb000 <0.000005>
1503431273.935080 brk(0)                = 0x1afb000 <0.000003>
1503431291.010338 brk(0)                = 0x1afb000 <0.000006>
1503431291.010366 brk(0x1b1c000)        = 0x1b1c000 <0.000006>
1503431291.010391 brk(0)                = 0x1b1c000 <0.000003>
1503431291.010403 brk(0)                = 0x1b1c000 <0.000004>
1503431291.010414 brk(0x1b12000)        = 0x1b12000 <0.000008>
1503431291.010430 brk(0)                = 0x1b12000 <0.000004>
1503431291.010443 brk(0)                = 0x1b12000 <0.000004>
1503431291.010455 brk(0)                = 0x1b12000 <0.000003>
1503431291.010466 brk(0x1b11000)        = 0x1b11000 <0.000004>
1503431291.010478 brk(0)                = 0x1b11000 <0.000004>
1503431301.277050 clock_gettime(CLOCK_REALTIME, {1503431301, 277067441}) = 0 <0.000005>
1503431301.277094 write(6</home/red/samples/debug/hexa.debug>, "17.08.23 01:18:21 [     hexa:2145"..., 91) = 91 <0.000019>
1503431301.277201 clock_gettime(CLOCK_REALTIME, {1503431301, 277216542}) = 0 <0.000005>
1503431301.277234 write(6</home/red/samples/debug/hexa.debug>, "17.08.23 01:18:21 [     hexa:2145"..., 126) = 126 <0.000018>
1503431301.277296 clock_gettime(CLOCK_REALTIME, {1503431301, 277301142}) = 0 <0.000004>
1503431301.277317 write(6</home/red/samples/debug/hexa.debug>, "17.08.23 01:18:21 [     hexa:2145"..., 126) = 126 <0.000012>
1503431301.288030 clock_gettime(CLOCK_REALTIME, {1503431301, 288037704}) = 0 <0.000004>

如果你看两个 brk(0)s (见1503431273.935080和1503431291.010478)的上述痕迹分别花费太多时间,分别在 17秒和10秒附近(比较左侧时间)。但是右侧的执行时间很短。我已经完成了多个这个程序的运行,在相同的 Redhat Linux框(7.2)中,所有运行都在系统调用的同一位置(brk(0))给出相同的时间(微秒差异)。

可能是什么问题?是在编程级别还是操作系统级别?我没有这方面的源代码,但我知道它是一个c / c ++程序。

1 个答案:

答案 0 :(得分:3)

要回答标题中的问题:不,brk(0)不会占用太多时间。

您可以通过查看系统调用本身报告的时间(<0.000003>添加-T)来查看此信息。那只有3微秒。

左侧的值是(绝对)时间戳。但这只是意味着该进程在1503431273.935080执行了brk系统调用,在1503431291.010338执行了另一个系统调用。这并不意味着任何单个系统调用需要17秒;这意味着该过程需要17秒才能到达下一个系统调用。

该过程本可以做很多其他事情,例如进行原始计算(刻录CPU)或不进行调度(因为系统忙于其他程序)。后一种选择是不可能的,因为你说这发生在程序的多次运行中。因此,我认为最可能的解释是代码只需要花费大量时间来计算内容而无需调用内核(例如,循环中的紧密数字代码,没有内存分配)。