Linux提供了mmap()函数,用来映射物理内存。...可以通过调用msync()实现磁盘上文件内容与共享内存区的内容一致。...但是,这并不意味着用户进程在这3G的范围内可以任意使用,因为虚存空间最终得映射到某个物理存储空间(内存或磁盘空间),才真正可以使用。 那么,内核怎样管理每个进程3G的虚存空间呢?...struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表....如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新.
文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "...内存映射 “ 就是在 进程的 ” 用户虚拟地址空间 " 中 , 创建一个 映射 , " 内存映射 " 有 2 种情况 , ① 文件映射 , ② 匿名映射 ; 文件映射 : 有 文件 支持 的 内存映射..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问..., 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页 " ; 三、共享内存 ---- 内存映射 与 共享内存 关系 : 文件映射 : 在进程间的 " 共享内存 " 就是使用
1 高端内存与内核映射 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途....它与通过固定公式与物理内存关联的直接映射页相反,虚拟固定映射地址与物理内存位置之间的关联可以自行定义,关联建立后内核总是会注意到的. ?...永久内存映射区 该区域可访问高端内存. 访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域....总之,内核的高端线性地址是为了访问内核固定映射以外的内存资源。进程在使用内存时,触发缺页异常,具体将哪些物理页映射给用户进程是内核考虑的事情. 在用户空间中没有高端内存这个概念....即内核对于低端内存, 不需要特殊的映射机制, 使用直接映射即可以访问普通内存区域, 而对于高端内存区域, 内核可以采用三种不同的机制将页框映射到高端内存 : 分别叫做永久内核映射、临时内核映射以及非连续内存分配
一,内存映射 对于磁盘文件和进程: 将一个文件或其它对象映射到进程地址空间,实现文件在磁盘的存储地址和进程地址空间中一段虚拟地址的映射关系。...没有内存映射的I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射的I/O操作示意图:少了一个copy操作 内存映射的优点: 减少了拷贝次数,节省I/O操作的开支 用户空间和内核空间可以直接高效交互...进程可以直接操作磁盘文件,用内存读写代替 I/O读写 应用场景: 1.进程间通信 使用内存映射实现进程间通信的两个场景: 场景1.有亲缘关系的进程间通信(父子进程) step1: 父进程创建内存映射区...step2: 进程a通过磁盘文件创建内存映射区 step3: 进程b通过磁盘文件创建内存映射区 step4: 进程a和进程b共同修改内存映射区实现进程通信 *基于内存映射区的进程间通信,是非阻塞的。...2.文件读写操作 step1: 读磁盘文件,获得文件描述符 step2: 基于文件描述符建立进程的内存映射区 step3: 利用进程进行内存映射区的读写操作 step4: 释放内存映射区,关闭文件描述符
一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。...()实现,所以建立内存映射的效率很高。...图1.内存映射原理 既然建立内存映射没有进行实际的数据拷贝,那么进程又怎么能最终直接通过内存操作访问到硬盘上的文件呢?那就要看内存映射之后的几个相关的过程了。...这个过程与内存映射无关。...这个过程与内存映射无关。 如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如图1中过程4所示。这个过程也与内存映射无关。
文章目录 一、mmap 创建内存映射代码示例 1、fopen 打开或创建文件 2、lseek 设置文件大小 3、mmap 函数使用 4、munmap 删除内存映射 二、完整代码示例 一、mmap 创建内存映射代码示例..., 相关参数作用如下 : NULL : 映射区的开始地址 sizeof(student) * 1 : 文件映射区的长度 PROT_READ | PROT_WRITE : 内存保护的标志位 , 该内存页的内容可以...// PROT_READ | PROT_WRITE : 内存保护的标志位 , 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间..., 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间 // fd : 文件描述符 , 被映射的文件 //..., 该内存是文件映射内存 // 拷贝内存的同时 , 也会修改文件内容 memcpy((*(p_student + i)).name, &name_char, 1);
linux 监控网络IO、磁盘、CPU、内存 CPU:vmstat ,sar –u,top 磁盘IO:iostat –xd,sar –d,top 网络IO:iftop -n,ifstat,dstat –...nt,sar -n DEV 2 3 磁盘容量:df –h 内存使用:free –m,top 1.查看什么进程占用端口: netstat -antp | fgrep 2.查看进程资源:...● %MEM,进程使用内存的百分比。 ● VSZ,进程使用的虚拟内存大小,以K为单位。 ● RSS,进程占用的物理内存的总数量,以K为单位。 ● TTY,进程相关的终端名。 ...—————————————————————————————————————————————— Top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows...,包括物理内存总量、已用内存、空闲内存以及用作缓冲区的内存量 Swap一行:虚存统计信息,包括交换空间总量、已用交换区大小、空闲交换区大小以及用作缓存的交换空间大小 2、下半部分显示了各个进程的运行情况
学习系列:《APUE14.8》《CSAPP9.8.4》 1 总结 memory-mapped io可以将文件映射到内存中的buffer,当我们从buffer读写数据时,其实操作的是对应文件中的数据...mmap也可以直接映射匿名内存块,无需提供文件fd,直接申请一块内存给当前进程使用,也可以选择继承给子进程。注意匿名映射不会真的创建文件,只是拿到了一块填充0的内存。...与共享内存这种传统IPC相比,mmap匿名内存更为灵活,Postgresql使用的共享内存全部是用mmap申请的,只用共享内存申请一个PGShmemHeader结构的大小。...MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。 MAP_HUGETLB 使用内存大页。...匿名映射的优点: 没有虚拟地址空间碎片,取消映射后,内存立即归还给系统。 与全局堆分开。 可以给子进程继承使用。 匿名映射的缺点: 不能调整大小!
1 固定映射 1.1 数据结构 linux高端内存中的临时内存区为固定内存区的一部分, 对于固定内存在linux内核中有下面描述 x86 arm arm64 arch/x86/include/asm/fixmap.h...由于对应于ioremap的内存空间是有限的, 所以对于ioremap空间的使用遵照使用结束马上释放的原则....v=4.7#L55 void *kmap_atomic(struct page *page) page是一个指向高端内存页的管理结构的指针, 而早期的内核中, 增加了一个类型为enum km_type的...在很多体系结构中, 除非激活了内核抢占, 否则kunmap_atomic根本无事可做, 因为只有在下一个临时映射到来前上一个临时映射才有效....因此, 内核完全可以”忘掉”kmap_atomic映射, kunmap_atomic也无需做什么实际的事情. 下一个原子映射将自动覆盖前一个映射.
持久映射用于将高端内存域中的非持久页映射到内核中 固定映射是与物理地址空间中的固定页关联的虚拟地址空间项,但具体关联的页帧可以自由选择....它与通过固定公式与物理内存关联的直接映射页相反,虚拟固定映射地址与物理内存位置之间的关联可以自行定义,关联建立后内核总是会注意到的. ?...永久内存映射区 该区域可访问高端内存. 访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域....这种分配可以阻塞, 但不会启动磁盘I/O, 这个标志在不能引发更多的磁盘I/O时阻塞I/O代码, 这可能导致令人不愉快的递归 GFP_NOFS 这种分配在必要时可以阻塞, 但是也可能启动磁盘, 但是不会启动文件系统操作...它允许分配无法直接映射的高端内存.
前言 内存映射中,我们经常讨论的是由虚拟内存定位物理内存(也就是folio或者page),实际上在很多场景中(比如内存回收),会涉及反向的操作,也就是反向映射。...所谓反向映射,就是给定一个folio(page),将映射它的PTE(页表项)找出来。接下来我们来详细分析一下它的原理吧(本文仅分析匿名映射部分)。...我们从mmap返回,vma还没有映射任何物理页的情景说起。 第一次访问vma区间的地址,导致缺页异常。内核调用do_anonymous_page,申请一页内存,完成映射。...在新进程创建的过程中,有些情况会调用dup_mmap复制原进程的内存空间,dup_mmap会复制vma,然后调用anon_vma_fork。...再考虑COW的场景,缺页异常申请新的一页,将原页的内存复制到新页中,然后使用新页更新映射,根据前文中“需要注意的第2点”可以得出图4中的结果。
Linux下的进程间通信也可以使用mmap的内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...:共享和私有,如果是共享映射,那么在内存中对文件进行修改,磁盘中对应的文件也会被修改,相反,磁盘中的文件有了修改,内存中的文件也被修改。...如果是私有映射,那么内存中的文件是独立的,二者进行修改都不会对对方造成影响。...通过这样的内存共享映射就相当于是进程直接对磁盘中的文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间的通信。...磁盘中的文件通过mmap函数来实现映射,然后通过munmap函数取消映射。
以文件映射到内存为例,实现这样的映射后,进程虚拟地址空间中一段内存地址将与文件磁盘地址一一对应,进程就可以采用指针的方式读写这段内存,系统会自动回写脏页到对应的磁盘文件。...Linux 内核使用 vm_area_struct 结构来表示一个独立的虚拟内存区域,由于每个不同质的虚拟内存区域功能和内部机制都不同,因此一个进程使用多个 vm_area_struct 结构来分别表示不同类型的虚拟内存区域...而使用 mmap 操作文件,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映射这两步,没有任何文件拷贝操作。...而之后访问数据时发现内存中并无数据而发起的缺页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数据传入内存的用户空间中,供进程使用。...可执行程序 A、B、C 中都有一部分静态库的副本,这里面的内容是完全一样的,那么很显然,这些可执行程序放在磁盘上会浪费磁盘空间,加载到内存中运行时会浪费内存空间。
4、mmap 创建内存映射 二、mmap 创建内存映射 与 普通文件操作 对比 一、mmap 创建内存映射 与 malloc 申请内存对比 ---- 1、malloc 函数原型 C 标准库 stdlib.h...调用 " Linux 内核 " 中的 kmalloc vmalloc 函数 ; 参考 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free |...小于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 brk 系统调用 , 向 Linux 内核申请内存 ; 使用 mmap 系统调用 : 如果 应用程序 申请的内存大小...大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存 ; 4、mmap 创建内存映射 mmap 可以直接向 Linux...“ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作 " ;
文章目录 一、mmap 创建内存映射 二、munmap 删除内存映射 三、mprotect 设置虚拟内存区域访问权限 一、mmap 创建内存映射 ---- mmap 系统调用函数 , 用于 创建 " 内存映射..." ; 该 " 系统调用 " 函数工作原理如下 : 首先 , 创建 " 匿名内存映射 “ , 将 ” 物理内存页 “ 映射到 进程的 ” 用户虚拟地址空间 " 中 ; 然后 , 将 指定文件 的 指定数据区间...映射到 " 用户虚拟地址空间 " 中 ; 此时 , 可以通过 指针 访问 内存的方式 , 访问文件 ; mmap 函数原型如下 : #include void* mmap(void...对比 : 传统的文件操作 , 首先调用 fopen 函数打开文件 , 然后调用 fread fwrite 等函数操作文件 , 这些操作 在 用户模式 下调用 , 然后需要 切换到 内核模式 下调用 Linux...“ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作 " ; 二、munmap 删除内存映射 ---- munmap 系统调用 的作用是 删除内存映射 , 其函数原型如下 : #include
DPDK巨页地址管理/Linux内核内存管理/内存映射/pagemap/rdma内存/注册术语PFN: 物理地址对应的页帧号:pfn = pte_pfn(*pte)INFINIBAND_USER_MEM...内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已 经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射...,就如同将整个文件从磁盘加载到内存。...由此可以看出,使用内 存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由 系统直接管理,由于取消了将文件数据加载到内存...进程内存用量分析之内存映射篇(58): https://www.jianshu.com/p/bff46f531920Linux proc文件系统: https://www.kernel.org/doc/
最近在看代码的时候发现了Qt的内存映射,原来只知道MFC有内存映射机制,可以在读取大数据文件时节约读取的时间,原来Qt中也有相应的机制,其用法更简单,下面用一个小例子演示其用法 #include <QtCore...argv); QFile file("1.txt"); file.open(QIODevice::ReadWrite); qDebug() << QStringLiteral("内存大小
今日重点: ① 学会查看linux各种状态,包括:网络IO、磁盘、CPU、内存等; ② 学会理解命令所代表的含义,能够迅速发现集群存在的问题。...1、核心命令 linux 监控网络IO、磁盘、CPU、内存: CPU:vmstat 、sar –u、top 磁盘IO:iostat –xd、sar –d、top 网络IO:iftop -n、ifstat...、dstat –nt、sar -n DEV 2 3 磁盘容量:df –h 内存使用:free –m、top 2、常用命令 (1)内存:条数、每条大小、内存是DDR4还是DDR3、内存频率是2666MT...根据经验,再通过命令排查内存、磁盘、网络、cpu,问题无非就这几类,切不可着急忙慌乱改一通,让简单问题复杂化。 2、根据以上命令,提前设置监控预警。...监控预警能够让你及时发现系统的性能信息、比如磁盘快满了,内存超负荷了,我们可以提前作出调整。
文章目录 一、文件映射 虚拟内存区域 1、文件映射 虚拟内存区域 的 vm_ops 成员 2、文件映射 虚拟内存区域 的 vm_file 成员 3、文件映射 虚拟内存区域 图示 二、匿名映射 虚拟内存区域...一、文件映射 虚拟内存区域 ---- " 文件映射 " 的 " 虚拟内存区域 " vm_area_struct 结构体 的 数据结构表示形式如下 ; 1、文件映射 虚拟内存区域 的 vm_ops 成员...deal with this struct. */ const struct vm_operations_struct *vm_ops; 参考 【Linux 内核 内存管理】内存映射相关数据结构 ④...we map to (can be NULL). */ 参考 【Linux 内核 内存管理】内存映射相关数据结构 ⑤ ( vm_area_struct 结构体成员分析 | vm_pgoff 成员 |...vm_file 成员 | vm_private_data ) 博客 ; 3、文件映射 虚拟内存区域 图示 二、匿名映射 虚拟内存区域 ---- 在 " 匿名映射 " 虚拟内存区域 中 , 与 " 文件映射
内存映射相关说明 uchar *QFileDevice::map(qint64 offset, qint64 size, QFileDevice::MemoryMapFlags flags = NoOptions...) 从偏移量开始将文件的大小字节映射到内存中。...应该打开一个文件以使映射成功,换句话说就是映射必须打开一个文件,但在映射内存之后,该文件不需要保持打开状态。...当QFile被销毁或用这个对象打开一个新文件时,任何未被映射的映射都将被自动取消映射。 查看自己电脑的虚拟内存大小,让可申请的虚拟内存了然于胸。
领取专属 10元无门槛券
手把手带您无忧上云