C 如何在Linux系统中体验缓存未命中和命中?

C 如何在Linux系统中体验缓存未命中和命中?,c,linux,caching,cpu,side-channel-attacks,C,Linux,Caching,Cpu,Side Channel Attacks,您好,我一直在尝试在Linux中体验缓存未命中和命中。 为此,我用C编写了一个程序,其中我测量了执行指令printf()的CPU周期时间。第一部分测量未命中所需的时间,第二部分测量命中所需的时间。以下是给定的程序: #include <stdint.h> #include <stdio.h> #include <string.h> #include <sched.h> #include <sys/types.h> #include &

您好,我一直在尝试在Linux中体验缓存未命中和命中。 为此,我用C编写了一个程序,其中我测量了执行指令printf()的CPU周期时间。第一部分测量未命中所需的时间,第二部分测量命中所需的时间。以下是给定的程序:

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <sched.h>
#include <sys/types.h> 
#include <unistd.h> 
#include <signal.h>

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

int main(int argc, char** argv)
{
    size_t time = rdtsc();
    printf("Hey ");
    size_t delta1 = rdtsc() - time;
    printf("delta: %zu\n", delta1);

    size_t time2 = rdtsc();
    printf("Hey ");
    size_t delta2 = rdtsc() - time2;
    printf("delta: %zu\n", delta2);
    sleep(100);
} 
但现在我有了这样的东西:

Terminal 1:
miss
hit
Terminal 2:
miss 
hit

我的理解不对吗?或者我的程序错了?

你认为应该在这里缓存什么?我认为函数printf()会被缓存,这样终端2就不必像终端1一样等待第一个printf()。你能打印增量吗?可能这两个终端是从两个不同的核心运行的。
Terminal 1:
miss
hit
Terminal 2:
miss 
hit