当前位置: 首页 > 面试题库 >

有没有一种方法可以检查处理器缓存是否最近已刷新?

巩光誉
2023-03-14
问题内容

在i386 linux上。如果可能,最好在c /(c / posix std libs)/ proc中。如果没有,那么任何程序集或第三方库都可以做到这一点?

编辑:我正在尝试开发测试内核模块是否清除缓存行或整个处理器(与wbinvd())。程序以root身份运行,但我希望尽可能保留在用户空间中。


问题答案:

高速缓存一致性系统会尽最大努力向您隐藏此类信息。我认为您将不得不通过使用性能计数寄存器来检测高速缓存未命中,或者通过使用高分辨率计时器仔细测量读取存储位置的时间来间接观察它。

程序在我的x86_64机器上运行,以演示的效果clflush。它使用乘以读取全局变量所需的时间rdtsc。作为一条直接与CPU时钟相关的指令,可以直接利用它来rdtsc实现这一目标。

这是输出:

花了81刻
花了81刻
同花顺:花了387滴答
花了72刻

您会看到3次试验:第一个确保i在高速缓存中(之所以如此,因为它只是作为BSS的一部分被清零了),第二个是读取i应在高速缓存中的内容。然后将其clflush踢出i缓存(及其邻居),并显示重新读取将花费更长的时间。最终读取将验证它是否已返回高速缓存。结果是非常可重现的,并且差异足够大,很容易看到高速缓存未命中。如果您要校准开销,则rdtsc()可以使差异更加明显。

如果你看不懂,你要测试的内存地址(虽然连mmap/dev/mem应该为这些目的工作)你可以推断出你想要的东西,如果你知道的缓存中的缓存行大小和关联性。然后,您可以使用可访问的内存位置来探查您感兴趣的集合中的活动。

源代码:

#include <stdio.h>
#include <stdint.h>

inline void
clflush(volatile void *p)
{
    asm volatile ("clflush (%0)" :: "r"(p));
}

inline uint64_t
rdtsc()
{
    unsigned long a, d;
    asm volatile ("rdtsc" : "=a" (a), "=d" (d));
    return a | ((uint64_t)d << 32);
}

volatile int i;

inline void
test()
{
    uint64_t start, end;
    volatile int j;

    start = rdtsc();
    j = i;
    end = rdtsc();
    printf("took %lu ticks\n", end - start);
}

int
main(int ac, char **av)
{
    test();
    test();
    printf("flush: ");
    clflush(&i);
    test();
    test();
    return 0;
}


 类似资料:
  • 问题内容: 如果地理位置下降,我需要JavaScript显示手动输入。 我尝试过的 两者均未描述用户以前是否拒绝访问地理位置。 问题答案: 和两个接受时出现错误时被调用的第二回调。错误回调为错误对象提供了一个参数。对于拒绝的权限,将为(数值)。 例: 编辑:正如@Ian Devlin指出的那样,Firefox(本文发布时为4.0.1)似乎不支持此行为。它将按预期在Chrome和 可能 Safari

  • 问题内容: 我的服务器上有一个文件夹,我有许多符号链接指向该文件夹。此后,我创建了一个新文件夹,并且想要更改所有这些符号链接以指向新文件夹。我曾考虑过用新链接的符号链接替换原始文件夹,但是如果我继续这种做法,它看起来很快就会变得非常混乱。 我一直在做的是手动更改符号链接以指向新文件夹,但是我可能错过了一些。 有没有一种方法可以检查是否有指向特定文件夹的符号链接? 问题答案: 我会使用find命令。

  • 问题内容: 我有一个.csv文件,如下所示: 我必须从文件中删除重复的电子邮件(整行)(即,上面示例中包含的行之一)。如何仅在字段1(用逗号分隔)上使用?根据,没有列选项。 我尝试了一些东西,但是没有用。 问题答案: 为了独特 所以逗号是定界符 对于关键字段1 测试结果:

  • 问题内容: 我的JavaScript会定期进行活动。当用户不查看站点时(即窗口或选项卡没有焦点),最好不要运行。 有没有办法使用JavaScript做到这一点? 我的参考点:如果您使用的窗口未激活,则Gmail聊天会播放声音。 问题答案: 自从最初编写此答案以来,新的规范已达到推荐状态。现在,页面可见性API使我们能够更准确地检测页面何时向用户隐藏。 当前的浏览器支持: hrome 13+ Int

  • 问题内容: 如果输入大小太小,则库会自动序列化 流中地图的执行,但是这种自动化不会并且也不会考虑地图操作的繁重程度。有没有办法 强制parallelStream()实际并行化CPU重映射? 问题答案: 似乎存在根本的误解。链接的“问答”讨论了由于OP没有 看到预期的加速,流显然不能并行工作。结论是,有没有好处在 并行处理工作负载是否太小,不,有一个自动回退到顺序执行。 实际上是相反的。如果您请求并

  • 简而言之:有没有一种方法可以在gcc或CLANG中不推荐命名空间? 长: 现在我想知道是否有更好的方法来做类似的事情,比如将名称空间util的使用标记为不推荐使用。 我们使用GCC4.7.3作为生产编译器,但是针对clang进行构建和测试,以尝试捕捉gcc的细节;因此,在这些编译器上工作的东西会有所帮助。