首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux申请内存(mmap)

---- 1.为什么要使用内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级页表和分页进行管理,操作系统每个页默认大小为4KB。...---- 2.怎样使用内存 2.1 先预留一定量的内存 #先查看系统有多少已经预留的内存 # cat /proc/meminfo |grep -i huge #预留192个页 # sysctl...memory.h> int main(int argc, char *argv[]) { char *m; size_t s = (8UL * 1024 * 1024); m = mmap...\n"); getchar(); munmap(m, s); return 0; } ---- 3.最后的话 内存的好处不仅是减少TLB未命中次数,而且内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上...,因此不会出现缺页中断,也就不会引入访问磁盘的时延,另外,内存在物理上是连续的,对于大内存访问也有一定的加速效果。

11.6K110
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内存映射——mmap

mmap系统调用 1.内存映射 所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。...Linux提供了mmap()函数,用来映射物理内存。...数据段中包括了所有静态分配的数据空间,即全局变量和所有申明为static的局部变量,这些空间是进程所必需的基本要求,这些空间是在建立一个进程的运行映像时就分配好的。...struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表....(swap area),如果在,则执行一个换入操作;如果上述两种情况都不满足,处理程序将分配新的物理页面,并把它插入到page cache中。

5.6K10

linux内存映射mmap原理分析

内存映射的过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上被放入了内存,具体到代码,就是建立并初始化了相关的数据结构(struct address_space),这个过程有系统调用mmap...图1.内存映射原理 既然建立内存映射没有进行实际的数据拷贝,那么进程又怎么能最终直接通过内存操作访问到硬盘上的文件呢?那就要看内存映射之后的几个相关的过程了。...(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬盘上将文件读取到物理内存中,如图1中过程3所示。...这个过程与内存映射无关。 如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如图1中过程4所示。这个过程也与内存映射无关。...通过对比可以看出,read消耗的时间将近是mmap的两到三倍。

4.4K41

Linux内存管理之mmap详解

作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...系统调用mmap()用于共享内存的两种方式 (1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name,...ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存的通信方式有许多特点和要注意的地方 (2)使用特殊文件提供匿名内存映射...数据段中包括了所有静态分配的数据空间,即全局变量和所有申明为static的局部变量,这些空间是进程所必需的基本要求,这些空间是在建立一个进程的运行映像时就分配好的。...结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

4.4K90

Linux内存管理之mmap详解

作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...系统调用mmap()用于共享内存的两种方式 (1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name, flag...数据段中包括了所有静态分配的数据空间,即全局变量和所有申明为static的局部变量,这些空间是进程所必需的基本要求,这些空间是在建立一个进程的运行映像时就分配好的。...结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表...(swap area),如果在,则执行一个换入操作;如果上述两种情况都不满足,处理程序将分配新的物理页面,并把它插入到page cache中。

2.6K40

Linux 内核 内存管理】内存管理系统调用 ③ ( mmap 创建内存映射原理 | 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 并分配物理内存页 | mmap 库函数与内核系统调用函数 )

文章目录 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 ) 1、分配虚拟内存页 2、物理地址与虚拟地址进行映射 3、产生缺页异常并分配物理内存页...二、mmap 库函数与 mmap 内核系统调用函数 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 ) ---- 1、分配虚拟内存页...分配 虚拟内存页 : 应用进程 调用 mmap 函数后 , 在 Linux 系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 此处调用的..." 与 " 虚拟内存地址 " 的映射关系 ; Linux 内核中的 mmap 系统调用函数 : int mmap(struct file *filp, struct vm_area_struct *vma...) 3、产生缺页异常并分配物理内存页 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问 , 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常

2.2K10

Linux 内核 内存管理】内存管理系统调用 ② ( mmap 创建内存映射 | mmap 创建内存映射 与 malloc 申请内存对比 | mmap 创建内存映射 与 普通文件操作对比 )

" , glibc 库 的 " 内存分配器 " ptmalloc , 负责调用 系统接口层 的 brk sbrk mmap munmap 等系统调用 申请内存 ; ② 系统调用 : 用户空间 的 内存管理函数...brk | mmap ) 内核层 使用 kmalloc vmalloc 函数 申请 虚拟内存 , 之后将该 虚拟内存页 划分成 内存块 , 分配给 应用进程 , 默认的 内存块 划分阈值 是 128...KB ; 使用 brk 系统调用 : 如果 应用程序 申请的内存大小 小于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 brk 系统调用 , 向 Linux 内核申请内存...; 使用 mmap 系统调用 : 如果 应用程序 申请的内存大小 大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存...; 4、mmap 创建内存映射 mmap 可以直接向 Linux 内核申请 " 虚拟内存 " , 不需要经过 " 用户态 “ 与 ” 内核态 " 之间的转换 ; 二、mmap 创建内存映射 与 普通文件操作

6.1K20

Linux内存分配策略

伙伴系统分配算法 在上一节, 我们介绍了Linux内核怎么管理系统中的物理内存....但有时候内核需要分配一些物理内存地址也连续的内存页, 所以Linux使用了 伙伴系统分配算法 来管理系统中的物理内存页....在Linux内核中, 把两个物理地址相邻的内存页当作成伙伴, 因为Linux是以页面号来管理内存页的, 所以就是说两个相邻页面号的页面是伙伴关系....所以, 使用伙伴系统算法只能分配 2order (order为0,1,2,3...)个页面. 那么order是不是无限呢? 当然不是, 在Linux内核中, order的最大值是 10....如果申请到的内存块比要申请的大小, 那么需要调用 expand() 函数来把内存块分裂成指定大小的内存块.

3.2K10

Linux 内核 内存管理】Linux 内核堆内存管理 ② ( 动态分配内存方式 | brk 系统调用 | mmap 系统调用 | brk 系统调用源码介绍 )

文章目录 一、Linux 系统 动态分配内存 方式 二、brk 系统调用 动态分配内存 一、Linux 系统 动态分配内存 方式 ---- Linux 系统中 , 提供了 2 种方式 进行 "...动态分配内存 " 操作 ; ① brk 系统调用 : 该方式本质是 设置 " 进程数据段 “ 的 结束地址 , 将该 ” 结束地址 " 向 高或低 移动 , 实现堆内存的 扩张或收缩 ; ② mmap..., 可作为 " 堆内存 " 使用 ; 二、brk 系统调用 动态分配内存 ---- " brk 系统调用 “ 可以指定 ” 堆内存 “ 在 ” 虚拟内存空间 “ 的 ” 结束地址 " ; 如果要 "...扩张 " 堆内存 , 可以将 结束地址 " 大于当前值 " , 如果要 " 收缩 " 堆内存 , 可以将 结束地址 " 小于当前值 " ; brk 系统调用 源码在 Linux 源码中的 linux-5.6.18...-5.6.18\mm\mmap.c#187

5.1K20

Linux内存共享映射(mmap和munmap)

Linux下的进程间通信也可以使用mmap内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...:共享和私有,如果是共享映射,那么在内存中对文件进行修改,磁盘中对应的文件也会被修改,相反,磁盘中的文件有了修改,内存中的文件也被修改。...通过这样的内存共享映射就相当于是进程直接对磁盘中的文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间的通信。...,这样系统会在0地址附近随机分配一块内存。...如果在运行中出现Bus error (core dumped)错误,需要考虑共享文件是否有存储空间(也就是说你要mmap一个4096的文件,但实际文件没有4096那么)。

8K30

一文读懂 Linux mmap 内存映射

MAP_STACK (since Linux 2.6.27) 将映射分配到适合进程或线程的栈空间。该标志目前是无操作的,但在 glibc 线程实现中有使用。...匿名映射不受文件支持,基本上是对内存块的请求。如果你认为这听起来与 malloc 类似,那么你是对的。事实上,大多数 malloc 的实现都会在内部使用匿名 mmap 来提供内存区域。...6.FAQ (1)mmap 映射到进程的虚拟地址是一样的吗? 在 Linux 中,mmap 函数可以用于将一个文件或者其他对象映射到进程的地址空间。...参考文献 mmap(2) - Linux manual page mmap - opengroup.org 认真分析mmap:是什么为什么怎么用- 胡潇 Linux source code (v6.0...Linux的虚拟内存详解(MMU、页表结构) When would you use mmap - Stack Overflow

98000

Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配分配内存流程 )

文章目录 一、伙伴分配分配内存流程 1、查询 n 阶页块 2、查询 n + 1 阶页块 3、查询 n + 2 阶页块 一、伙伴分配分配内存流程 ---- 伙伴分配器 以 " 阶 " 为单位 , 分配.../ 释放 物理页 ; 阶 ( Order ) : 物理页 的 数量单位 , n 阶页块 指的是 2^n 个 连续的 " 物理页 " ; 页 / 阶 概念参考 【Linux 内核 内存管理...】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) 博客 ; " 伙伴分配器 " 分配内存流程 : 假设要 分配 n 阶页块 ; 1、查询 n 阶页块 查询当前是否有 空闲的 n...阶页块 , 如果有则 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 1 阶页块 ; 2、查询 n + 1 阶页块 查询当前是否有 空闲的 n + 1 阶页块 , 如果有 , 将...n + 1 阶页块 分成 2 个 n 阶页块 , 一块插入 空闲 n 阶页块链表 ; 一块 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 2 阶页块 ; 3、查询

7K50

Python - mmap 共享内存

python的mmap库提供了共享内存的实践方案可以完成信息在内存间交互。 简介 共享内存 内存共享是两个不同的进程共享内存的意思:同一块物理内存被映射到两个进程的各自的进程地址空间。...mmap mmap是一种虚拟内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。...flags:MAP_PRIVATE:这段内存映射只有本进程可用;mmap.MAP_SHARED:将内存映射和其他进程共享,所有映射了同一文件的进程,都能够看到其中一个所做的更改; **prot:*...使用示例 写入数据进共享内存 import ctypes import mmap # 核心库 import os import struct import numpy as np # 创建内存映射文件句柄...创建内存映射文件句柄 fd = os.open('share_memory/tmp/mmaptest', os.O_RDONLY) # 建立内存缓冲区 # not win32 buf = mmap.mmap

1.7K30

Linux 内核 内存管理】mmap 系统调用源码分析 ① ( mmapmmap2 系统调用 | Linux 内核中的 mmap 系统调用源码 )

文章目录 一、mmapmmap2 系统调用 二、Linux 内核中的 mmap 系统调用源码 一、mmapmmap2 系统调用 ---- mmap 创建 " 内存映射 " 的 系统调用 有...2 种实现 , mmapmmap2 ; 2 者区别是 : mmap 偏移单位是 " 字节 " , mmap2 偏移单位是 " 页 " , 但是在 arm 64 体系架构中 , 没有实现 mmap2..., 只实现了 mmap 系统调用 ; 二、Linux 内核中的 mmap 系统调用源码 ---- arm64 架构体系中 , 使用 mmap 系统调用 创建 " 内存映射 " , 调用 mmap 系统调用函数..., 执行如下操作 : 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移不是内存页大小的整数倍 , 返回 -EINVAL 错误 ; 如果偏移是内存页大小的整数倍 , 则调用...a.fd, a.offset >> PAGE_SHIFT); } 参考路径 : linux-4.12\mm\mmap.c#1534

10.6K40

linux mmap

mmaplinux中提高文件读写效率的一种手段,这里简单整理一下mmap的原理和使用。 高速页缓存 在介绍文件读写之前需要先了解下页缓存的机制,有助于理解文件读写的底层实现。...在linux文件读写中,内核会将文件内容缓存到物理内存中,以页为单位进行映射。...当用户实际访问数据时,如果数据没有被缓存,就会触发页错误(page fault),然后由内核分配内存用作页缓存并填充数据。...可以通过MAP_POPULATE标志位来强制mmap做预读(read-ahead),提前分配好缓存,有助于减少后面访问数据时页错误导致的阻塞。...拓展知识 mmap除了可以用作普通文件的内存映射外,还可以创建匿名文件内存映射,即不依赖磁盘文件的内存映射。本质上是将初始化为0的多个内存页映射到用户空间,一般被用作大内存的动态分配

2.2K30

Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配内存 )

文章目录 一、Linux 内核 动态分配内存 系统接口函数 二、统计输出 vmalloc 分配内存 一、Linux 内核 动态分配内存 系统接口函数 ---- Linux 内核 " 动态分配内存 "...是通过 " 系统接口 " 实现的 , 下面介绍几个重要的 接口函数 ; ① 以 " 页 " 为单位分配内存 : alloc_pages , __get_free_page ; ② 以 " 字节 " 为单位分配..." 虚拟地址连续的内存块 " : vmalloc ; ③ 以 " 字节 " 为单位分配 " 物理地址连续的内存块 " : kmalloc ; 注意 该 " 物理地址连续的内存块 " 是以 Slab 为中心的...; 二、统计输出 vmalloc 分配内存 ---- 执行 grep vmalloc /proc/vmallocinfo 命令 , 可以统计输出 通过 vmalloc 函数分配的 " 虚拟地址连续的内存

5.1K30

Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

文章目录 一、do_mmap 函数执行流程 二、do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍...函数 中 , 核心处理过程就是调用 do_mmap 函数 , 这是 " 内存映射 " 创建的主要函数逻辑 ; 一、do_mmap 函数执行流程 ---- do_mmap 函数 , 主要功能是 创建 "...内存映射 " ; 首先 , 执行 get_unmapped_area 函数 , 获取未被映射的内存区域 , 根据不同的情况 , 如 " 文件映射 " 还是 " 匿名映射 " , 调用对应的 " 分配虚拟地址区间..." ; 最后 , 通过调用 mmap_region 函数 , 创建 " 虚拟内存区域 " ; addr = mmap_region(file, addr, len, vm_flags, pgoff,...uf); 二、do_mmap 函数源码 ---- 创建 " 内存映射 " 主要是 do_mmap 函数实现的 , 该函数定义在 Linux 内核源码的 linux-4.12\mm\mmap.c#1320

1.9K10
领券