在centos7上创建一个1GB的大文件,读入全部数据到内存中并记录所花时间,然后进行第二次读入并记录时间。(20%) 要求:用/proc/meminfo查看内存中页缓存使用的变化,并解释两次读入速度差异的原因,使用C语言进行测试
时间: 2024-02-22 18:58:44 浏览: 173
查看centos7内存硬盘的使用情况
好的,以下是使用C语言编写的程序,可以在CentOS 7上创建一个1GB的大文件,并读取文件中的所有数据并记录所花费的时间。程序中使用了`mmap()`函数将文件映射到内存中,而不是使用`fread()`函数一次性读取整个文件。
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#define GB (1024 * 1024 * 1024)
int main()
{
// Create a 1GB file
const char* file_name = "large_file.bin";
int fd = open(file_name, O_RDWR | O_CREAT, 0666);
lseek(fd, GB - 1, SEEK_SET);
write(fd, "", 1);
close(fd);
// Read the file into memory and record time
struct timeval start, end;
gettimeofday(&start, NULL);
fd = open(file_name, O_RDONLY);
char* buffer = (char*) mmap(NULL, GB, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd);
gettimeofday(&end, NULL);
long elapsed_time = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec - start.tv_usec) / 1000;
printf("Time taken to read file into memory: %ld milliseconds\n", elapsed_time);
// Read the file again and record time
gettimeofday(&start, NULL);
munmap(buffer, GB);
fd = open(file_name, O_RDONLY);
buffer = (char*) mmap(NULL, GB, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd);
gettimeofday(&end, NULL);
elapsed_time = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec - start.tv_usec) / 1000;
printf("Time taken to read file from memory: %ld milliseconds\n", elapsed_time);
// Free memory
munmap(buffer, GB);
// Display page cache usage
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
printf("Maximum resident set size: %ld KB\n", usage.ru_maxrss);
return 0;
}
```
在运行程序之前,你可以使用`watch -n 1 cat /proc/meminfo`命令来监视内存中页缓存使用情况。该命令每秒钟更新一次,可以用于观察程序运行时内存的变化。
在程序第一次运行时,它会将文件读入内存。在这个过程中,内核会将文件的内容存储在页缓存中。第二次运行程序时,文件已经在页缓存中,所以读取速度会更快。这种技术称为“预读取”,它可以加快文件的读取速度。
在程序运行期间,你可以观察到内存中的页缓存使用量会增加,并且在第二次运行程序时不会减少。这是因为文件的内容仍然存储在页缓存中,并且可以被访问多次,而不需要从磁盘中重新读取。
通过`getrusage()`函数,可以获取程序的最大驻留集大小(maximum resident set size),即程序在运行时所使用的最大物理内存量。在本例中,最大驻留集大小应该接近1GB,因为文件的内容被存储在页缓存中,而不是被直接加载到程序的地址空间中。
希望这个回答对你有所帮助!
阅读全文