小编avn*_*ner的帖子

跨CPU核心的rdtsc精度

我正在从一个线程发送网络数据包,并在另一个运行在不同CPU核心上的线程上接收回复.我的进程测量每个数据包的发送和接收之间的时间(类似于ping).我正在使用rdtsc来获得高分辨率,低开销的时序,这是我的实现所需要的.

所有测量看起来都很可靠.尽管如此,我仍然担心核心的rdtsc准确性,因为我一直在阅读一些暗示tsc未在核心之间同步的文本.

在维基百科上找到了关于TSC的以下信息

恒定的TSC行为可确保每个时钟周期的持续时间均匀,并支持将TSC用作挂钟定时器,即使处理器内核更改频率也是如此.这是所有英特尔处理器的架构行为.

我仍然担心核心的累积性,这是我的问题

更多信息

  • 我在Intel nehalem机器上运行我的进程.
  • 操作系统是Linux.
  • 为所有核设置" constant_tsc "cpu标志.

linux multicore rdtsc

31
推荐指数
1
解决办法
2万
查看次数

即使在unsetenv("LD_PRELOAD")之后,LD_PRELOAD也会影响新的孩子

我的代码如下:preload.c,具有以下内容:

#include <stdio.h>
#include <stdlib.h>

int  __attribute__((constructor))  main_init(void)
{
    printf("Unsetting LD_PRELOAD: %x\n",unsetenv("LD_PRELOAD"));
    FILE *fp = popen("ls", "r");
    pclose(fp);
}
Run Code Online (Sandbox Code Playgroud)

然后在shell中(小心做第二个命令!!):

    gcc preload.c -shared -Wl,-soname,mylib -o mylib.so -fPIC
    LD_PRELOAD=./mylib.so bash
Run Code Online (Sandbox Code Playgroud)

!小心最后一个命令,它将导致无限循环的分叉"sh -c ls".用^ C后2秒钟停止它(或者更好^ Z然后看ps).

更多信息

  1. 这个问题在某种程度上与bash有关; 或者作为用户运行的命令,或者作为popen执行的bash.
  2. 其他关键因素:1)从预加载的库中执行popen,2)可能需要在库的初始化部分中执行popen.
  3. 如果您使用:

    LD_DEBUG=all LD_DEBUG_OUTPUT=/tmp/ld-debug LD_PRELOAD=./mylib.so bash
    
    Run Code Online (Sandbox Code Playgroud)

    而不是最后一个命令,您将获得许多ld-debug文件,名为/tmp/ld-debug.*.每个分叉过程一个.在所有这些文件中,您将看到首先在mylib中搜索符号.即使LD_PRELOAD已从环境中删除.

c linux bash shared-libraries popen

7
推荐指数
1
解决办法
5256
查看次数

标签 统计

linux ×2

bash ×1

c ×1

multicore ×1

popen ×1

rdtsc ×1

shared-libraries ×1