为什么在将文件映射到内存的程序中没有主要页面错误?

问题描述 投票:2回答:2

我正在尝试演示Linux中的分页。我编写了一个小程序,该程序使用mmap()将文件映射到虚拟内存,等待输入,访问分配的内存,然后再次等待输入。

在将文件映射到内存并访问此内存后,我检查过程中的次要和主要故障。

我期望看到一个大故障,但是我只看到一个小故障。直到程序结束,主要故障的数量仍为0。这很奇怪,因为内核必须执行I / O才能将文件的内容带到内存中。

任何人都可以解释吗?

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdio.h>

int main (int argc, char *argv[]) {

  char *mblk;
  int fd, fsize, n;
  struct stat fs;

  fd = open ( argv[1], O_RDONLY );
  if ( fd == -1 ) {
    printf ( "Failed to open %s\n", argv[1] );
    return (-1);
  }

  fstat ( fd, &fs );
  fsize = fs.st_size;
  mblk = mmap ( NULL, fsize, PROT_READ, MAP_PRIVATE, fd, 0 );
  close ( fd );
  printf ( "\n %s is maped to virtual memory at %llx\n", argv[1], (unsigned long long) mblk );
  printf ( " Press Enter to continue\n");
  getchar ();
  n = (unsigned) *mblk;
  printf ( "%d\n", n);
  printf ( " %llx accessed\n", (unsigned long long) mblk );
  printf ( " Press any Enter exit\n");
  getchar ();
}
memory-management linux-kernel
2个回答
0
投票

您看到较小的pf,因为数据已经在页面缓存中。

尝试以下操作(console1):

 $ ./main ./myfile 

 ./myfile is maped to virtual memory at 7f23f3cd6000
 Press Enter to continue

此后丢弃缓存(控制台2)

$ echo 3 > /proc/sys/vm/drop_caches

按Enter,&&查看统计信息(控制台1)

 98
 7f23f3cd6000 accessed
 Press any Enter exit

 $ ps -eo min_flt,maj_flt,cmd | grep main
 77      1 ./main ./myfile

0
投票

谢谢,但是页面如何进入页面缓存?重新启动后,我已经尝试立即运行该程序。如果程序中的open将页面加载到内存中,则在访问该页面之前,我应该至少看到1个主要错误。

© www.soinside.com 2019 - 2024. All rights reserved.