mmap
是 Linux 系统中的一个系统调用,用于将文件或设备映射到进程的地址空间。它不仅可以用于文件映射,还可以用于匿名内存映射(即不对应任何文件的内存区域)。通过 mmap
分配大内存时,操作系统会将所需的内存页分配给进程,并将这些页映射到进程的虚拟地址空间。
mmap
可以显著提高性能,因为它允许操作系统进行更有效的内存管理。mmap
共享同一块内存区域。原因:当请求的内存超过了系统的可用内存或交换空间时,会发生内存不足错误。
解决方法:
# 查看内存使用情况
free -m
# 增加交换空间
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
原因:程序在使用完 mmap
分配的内存后没有正确释放,导致内存泄漏。
解决方法:
mmap
后都有对应的 munmap
调用。#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
off_t size = lseek(fd, 0, SEEK_END);
void *addr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
close(fd);
return 1;
}
// 使用 addr 进行操作
if (munmap(addr, size) == -1) {
perror("munmap");
}
close(fd);
return 0;
}
原因:访问了未映射的内存区域或越界访问。
解决方法:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
off_t size = lseek(fd, 0, SEEK_END);
void *addr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
close(fd);
return 1;
}
// 边界检查
if (offset < size) {
char *data = (char *)addr + offset;
// 使用 data 进行操作
}
if (munmap(addr, size) == -1) {
perror("munmap");
}
close(fd);
return 0;
}
通过以上方法,可以有效管理和优化使用 mmap
分配大内存的过程。
领取专属 10元无门槛券
手把手带您无忧上云