Linux mmap读/写触发共享文件页生命周期

概述

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
#include
#include
#include
#include

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, 

你可能感兴趣的:(内存子系统,linux,服务器,操作系统基本原理,内存)