所以我被困在这里了...我尝试使用 mmap(),但它不会将文件保存到内存中,除非我相信它们被某些东西使用?这是代码:
/* For the size of the file. */
#include <sys/stat.h>
/* This contains the mmap calls. */
#include <sys/mman.h>
/* These are for error printing. */
#include <errno.h>
#include <string.h>
#include <stdarg.h>
/* This is for open. */
#include <fcntl.h>
#include <stdio.h>
/* For exit. */
#include <stdlib.h>
/* For the final part of the example. */
#include <ctype.h>
/* "check" checks "test" and prints an error and exits if it is
true. */
static void
check (int test, const char * message, ...)
{
if (test) {
va_list args;
va_start (args, message);
vfprintf (stderr, message, args);
va_end (args);
fprintf (stderr, "\n");
exit (EXIT_FAILURE);
}
}
int main ()
{
/* The file descriptor. */
int fd;
/* Information about the file. */
struct stat s;
int status;
size_t size;
/* The file name to open. */
const char * file_name = "MentalClarity.png";
/* The memory-mapped thing itself. */
const char * mapped[200000];
int i;
int j;
/* Open the file for reading. */
fd = open ("me.c", O_RDONLY);
check (fd < 0, "open %s failed: %s", file_name, strerror (errno));
/* Get the size of the file. */
status = fstat (fd, & s);
check (status < 0, "stat %s failed: %s", file_name, strerror (errno));
size = s.st_size;
/* Memory-map the file. */
for(j=1;j<=200000;j++){
mapped[j] = mmap (NULL, size, PROT_READ, 0, fd, 0);
check (mapped == MAP_FAILED, "mmap %s failed: %s",
file_name, strerror (errno));
}
int value=0;
while(value!=1){
printf("Enter 1 to exit");
scanf("%d",&value);
}
return 0;
}
我只是想用一个图像文件填充我的交换空间,这是否可能?提前谢谢您。
答案1
Ubuntu 避免使用交换,除非它需要内存。您可以继续分配和填充内存,直到需要将其调出。您不需要命中每个字节,只需命中每个页面中的至少一个字节。您可以使用循环,在其中分配一页内存并在循环中写入它以填充内存。
使用mmap
将文件映射到应用程序的虚拟内存映像中。任何针对 mmapped 内存的分页活动都将使用该文件而不是交换。
/tmp
如果您使用tmpfs
其文件系统,您可以通过写入大文件来执行相同操作。
现代操作系统允许你过度使用虚拟内存。这样就可以使用远远超出可用内存的空间内存结构。