用于在页面缓存中生成缓存未命中的C代码?

时间:2016-08-15 06:07:13

标签: c linux caching page-caching

高速缓存(也称为L1,L2或L3高速缓存)是CPU附近的SRAM,有助于改善DRAM数据访问。另一方面,a page cache(或磁盘高速缓存)是源自诸如硬盘驱动器的辅助存储设备的页面的透明高速缓存。另外,linux操作系统通过使用未使用的DRAM内存来构建页面缓存。

我发现很多代码可以在SRAM上产生缓存未命中(即L1,L2或L3),我感兴趣的是在页面缓存级别生成缓存未命中的C代码(或者更好的说法页面出错?)。

我的理解是这样的代码必须处理文件系统操作,如读写。所以我设计了一个代码来从文件中读取带有O_DIRECT标志的数据,这个想法是每个读取操作都会请求访问磁盘,因此会导致页面缓存中出现缓存缺失。这是代码,其中/ tmp / data是使用dd if=/dev/zero of=/tmp/data count=4K创建的4 KB(页面大小)文件的全部:

#include <stdio.h>
#include <time.h>

#define DATA_SIZE 10000

int main(){

  char page_data[DATA_SIZE];

  clock_t begin, end;

  double time_spent;

  int lap;

  int fd;

  fd = open("/tmp/data", "O_DIRECT", "r");

  for(lap=0; lap < 10; lap++){

    begin = clock();

    read(fd, page_data, DATA_SIZE);

    end = clock();

    time_spent = (double) (end - begin); // / CLOCKS_PER_SEC;

    printf("lap %d : time spent : %f data : %s \n", lap, time_spent, page_data);

    lseek(fd, 0, SEEK_SET);

  }

  close(fd);    

  return 0;
}

这是代码的输出,其中包含perf-tool提供的附加信息

perf stat -B -e cpu-clock,task-clock,task-clock,cycles,context-swtiches,cpu-mogrations,page-faults,cache-references,cache-misses ./read_a_file

lap 0 : time spent : 1.000000 data :  
lap 1 : time spent : 1.000000 data :  
lap 2 : time spent : 1.000000 data :  
lap 3 : time spent : 0.000000 data :  
lap 4 : time spent : 0.000000 data :  
lap 5 : time spent : 0.000000 data :  
lap 6 : time spent : 1.000000 data :  
lap 7 : time spent : 0.000000 data :  
lap 8 : time spent : 0.000000 data :  
lap 9 : time spent : 1.000000 data :  

Performance counter stats for './read_a_file':

      0,282623      cpu-clock (msec)                                            
      0,282361      task-clock (msec)         #    0,024 CPUs utilized          
             0      cycles                    #    0,000 GHz                    
             3      context-switches          #    0,011 M/sec                  
             0      cpu-migrations            #    0,000 K/sec                  
            54      page-faults               #    0,191 M/sec                  
             0      cache-references          #    0,000 K/sec                  
             0      cache-misses              #    0,000 K/sec                  

   0,011596405 seconds time elapsed

问题是perf显示在代码期间没有发生缓存未命中,即使我无法解释原因,我也感到惊讶。否则会发生54次页面错误,我也觉得很奇怪,因为我的代码只要求1个文件(大小是页面大小)只有10次(不是54次)。

所以我的问题是如何设计一个更好的代码来系统地生成页面缓存(或页面错误)上的缓存缺失?

欢迎任何评论

0 个答案:

没有答案