概述
Linux的mm内存子系统的核心功能就要要管理各种类型的page,确保能高效分配和释放,让物理内存得以最大化使用。初识内存系统往往关注的是page的申请和管理流程,容易忽略page的释放回收流程,其实理解mm中的内存回收和释放也是最核心的机制。
Linux内核为了支持各种场景的内存使用场景,将page分成多种类型,怎么识别什么系统调用或者代码场景产生的是什么类型的page也是非常重要的,不过本文重点不是来讲解这个话题,而是只针对mmap共享文件场景讲述,看看这种file-back的page的生命周期是怎么样的。之所以讲解mmap共享文件场景,是因为网络上基本都是讲解匿名页生命周期的,但是还没由发现一篇完整讲述文件页生命周期的文章,而文件页的生命周期也是非常重要和复杂的。
所谓生命周期,就是页面从产生到回收的整个代码流程。我们知道,Linux内核page页面回收相关最重要的一个变量时_refcount,关于该点可以参考我前面的文章:page _refcount和_mapcount字段_nginux的博客-CSDN博客
本周将详细描述mmap写共享文件的page从诞生到回收的整个流程。
示例代码
#include<sys/mman.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<error.h>
char *g_addr = NULL;
char* mm_anon_priv() {
return NULL;
}
char* mm_file_shared() {
int fd = 0;
int i = 0;
int tmp;
char *addr = NULL;
struct stat sb;
if((fd = open("/sdcard/1.txt", O_RDWR | O_CREAT)) < 0){
perror("open") ;
}
if((fstat(fd, &sb)) == -1 ){
perror("fstat") ;
}
if((g_addr = mmap(NULL, 4096 * 10,