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,