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<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, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了加速 Linux 文件的,可以使用 MMAP 文件加速技巧。MMAP 是一种内存映射文件的技术,它可以将一个文件映射到进程的虚拟地址空间,从而可以通过内存来访问文件。 使用 MMAP 文件加速的步骤如下: 1. 使用 open 函数打开文件,并使用 fstat 函数获取文件大小。 2. 使用 mmap 函数将文件映射到进程的虚拟地址空间。 3. 使用 memcpy 函数将文件数据从内存复制到缓冲区或者将缓冲区的数据入到文件中。 4. 使用 munmap 函数解除映射关系,并使用 close 函数关闭文件。 需要注意的是,使用 MMAP 文件加速需要注意以下几点: 1. MMAP 文件映射只适用于较小的文件,因为它会将整个文件映射到内存中,如果文件太大,会导致内存占用过高。 2. MMAP 文件映射需要占用虚拟地址空间,如果虚拟地址空间不够,会导致映射失败。 3. MMAP 文件映射的效率受到内存访问速度的影响,对于大量随机访问的文件,可能比传统的方式效率低。 除了使用 MMAP 文件加速,还可以通过一些其他技巧来加速文件的,比如: 1. 使用缓冲区,可以减少文件系统的 I/O 操作次数,从而提高文件的效率。 2. 使用多线程或者多进程并发,可以充分利用多核 CPU 的性能,提高文件的效率。 3. 使用 DMA 技术,可以将数据直接从磁盘取到内存中,避免了 CPU 的中介操作,从而提高了文件取的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值