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

Python - mmap 共享内存

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

1.7K30

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

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

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

3、mmap内存映射、共享

mmap内存映射(内存、用户缓冲区共享一块映射数据) 直接将磁盘文件数基于DMA引擎拷贝据映射到内核缓冲区,同时用户缓冲区是跟内核缓冲区共享一块映射数据, 建立映射后,不需要从内核缓冲区拷贝到用户缓冲区...mmap:产生4次用户上下文切换,3次拷贝。...mmap() 系统调用函数会直接把内核缓冲区里的数据映射到用户空间,这样,操作系统内核与用户空间共享缓冲区,就不需要再进行任何的数据拷贝操作。...buf = mmap(file, len);write(sockfd, buf, len);注释: mmap file ,write socket 隐含了read file and copy file...接着,应用进程跟操作系统内核「共享」这个缓冲区;2、第二次拷贝:应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中,这一切都发生在内核态,由 CPU 来搬运数据

11500

Linux内存映射——mmap

Linux提供了mmap()函数,用来映射物理内存。...对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。...实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。...共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 基于文件的映射,在mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。...二 系统调用mmap()用于共享内存的两种方式 (1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name

5.5K10

linux网络编程之共享内存简介和mmap 函数

一、共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。...用管道或者消息队列传递数据: 用共享内存传递数据: 即使用共享内存传递数据比用消息队列和管道来说,减少了进入内核的次数,提高了效率。...二、mmap 函数 #include 功能:将文件或者设备空间映射到共享内存区。...表示映射的这一段不可访问 flag参数有很多种取值,这里只讲两种,其它取值可查看mmap(2) MAP_SHARED 多个进程对同一个文件的映射是共享的,一个进程对映射的内存做了修改,另一个进程也会看到这种变化...内存的映射是以页面为单位的,一般为4k,所以才有第2条的说法,其实这才是真正体现共享内存可以进程间通信的所在。

1.8K10

Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )

文章目录 一、进程一描述 二、进程二描述 三、mmap 进程共享内存展示 一、进程一描述 ---- 在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射...| munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 , 在该进程中 , 创建并打开文件 , 为该文件设置大小 , 使用 mmap 创建 " 文件映射 " , 并通过直接访问内存的方式...; 二、进程二描述 ---- 进程二 的源码 , 与上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 进程一..., 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间 // fd : 文件描述符 , 被映射的文件 //..., 编译出的可执行文件为 mmap_demo_02 ; 三、mmap 进程共享内存展示 ---- 先执行 进程一 mmap_demo_01 可执行程序 , 进程一 中通过 mmap 文件映射向文件中写出数据后

3.5K30

Linux申请大页内存(mmap)

---- 1.为什么要使用大页内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级页表和分页进行管理,操作系统每个页默认大小为4KB。...当多个内存密集型应用访问内存时,会造成过多的TLB未命中,因此在特定情况下会需要减少未命中次数,一个可行的办法就是增大每个页的尺寸。...---- 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.4K110

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)使用特殊文件提供匿名内存映射...而mmap()返回的地址,却由父子进程共同维护。 对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式。此时,不必指定具体的文件,只要设置相应的标志即可....结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

4.3K90

linux内存映射mmap原理分析

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

4.3K41

Linux内存管理之mmap详解

作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 基于文件的映射,在mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。...系统调用mmap()用于共享内存的两种方式 (1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name, flag...而mmap()返回的地址,却由父子进程共同维护。 对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式。此时,不必指定具体的文件,只要设置相应的标志即可....结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立页表: (1) 使用remap_pfn_range一次建立所有页表

2.5K40

UNIX(进程间通信):12 揭秘mmap创建共享内存

二、共享内存映射 现在考虑林一种处理方法:进程A和进程B都将该页映射到自己的地址空间,当进程A第一次访问该页中的数据时,它生成一个缺页终端,内核此时读入这一页到内存并更新页表使之指向它,以后,当进程B访问同一页面而出现缺页中断时...三、mmap及其相关系统调用 mmap()系统调用使得进城之间通过映射同一个普通文件实现共享内存。...四、mmap基础用例 1 //测试文件 data.txt 后面的程序也要用到 2 aaaaaaaaa 3 bbbbbbbbb 4 cccccccccccc 5 ddddddddd 1、通过共享内存映射的方式修改文件..."); 五、使用共享内存映射实现两个进程之间的通信 两个程序映射到同一个文件到自己的地址空间,进程A先运行,每个两秒读取映射区域,看是否发生变化,进程B后运行,它修改映射区域,然后退出,此时进程A能够观察到存储映射区的变化...()返回地址的访问 linux采用的是页式管理机制。

1.5K10

Linux内存映射函数mmap与匿名内存

mmap也可以直接映射匿名内存块,无需提供文件fd,直接申请一块内存给当前进程使用,也可以选择继承给子进程。注意匿名映射不会真的创建文件,只是拿到了一块填充0的内存。...与共享内存这种传统IPC相比,mmap匿名内存更为灵活,Postgresql使用的共享内存全部是用mmap申请的,只用共享内存申请一个PGShmemHeader结构的大小。...申请在堆和栈中间的位置: 4 匿名内存块映射(Postgresql中的mmap) CreateAnonymousSegment ptr = mmap(NULL, allocsize, PROT_READ...当共享映射的其他人在共享映射上写入时,没有fork的copy-on-write机制:写的就是一份数据。 匿名映射的优点: 没有虚拟地址空间碎片,取消映射后,内存立即归还给系统。 与全局堆分开。...5 匿名内存块使用实例(Postgresql中的mmap方式实例) #include #include #include #include

2K30

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

函数之间的 桥梁 ; ③ 内核层调用 : 内核与用户层接口 的 内存管理函数 调用 " Linux 内核 " 中的 kmalloc vmalloc 函数 ; 参考 【Linux 内核 内存管理】内存管理架构...; 使用 mmap 系统调用 : 如果 应用程序 申请的内存大小 大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存...; 4、mmap 创建内存映射 mmap 可以直接向 Linux 内核申请 " 虚拟内存 " , 不需要经过 " 用户态 “ 与 ” 内核态 " 之间的转换 ; 二、mmap 创建内存映射 与 普通文件操作...用户模式 下调用 , 然后需要 切换到 内核模式 下调用 Linux 内核中相应的文件操作 , 这里 涉及到 用户模式 和 内核模式 之间的 切换 ; 使用 mmap 系统调用 , 避免了 用户模式...与 内核模式 切换的开销 , 提高了文件操作的性能 ; 此外 , 多个进程之间 , 可以使用 mmap 系统调用 创建 共享的 " 文件映射 “ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作

6.1K20

Linux】system V 共享内存

可以,其他进程也可以通信 所以在任何时刻,可能有多个共享内存在被使用 系统中一定会存在很多共享内存同时存在 操作系统要不要整体管理所有的共享内存呢?要 操作性系统如何管理多个共享内存呢?...先描述,在组织 并不是在内存中开辟空间即可,系统为了管理共享内存,构建对应的描述共享内存的结构体对象 共享内存=共享内存的内核数据结构(伪代码:struct shm)+真正开辟的内存空间 2....创建共享内存 获取共享内存 创建共享内存,调用shmget函数,通过两个选项 若共享内存不存在则创建,若存在则报错 而获取共享内存,调用shmget函数,则返回已有的共享内存 ---- 此时运行可执行程序...将自己和共享内存关联起来 输入 man shmat 指令 at代表 关联 将共享内存和目标值关联起来 返回值为 共享内存的虚拟地址的起始地址 我们不知道应该把共享内存放在虚拟空间的什么地址处...删除共享内存 创建共享内存的进程已经早就退出了,但是共享内存还存在 确认共享内存存在: ipcs ipc作为进程间通信的简写 ipc表示资源 s表示有多个资源 显出来的为ipc通信系统所支持的三种

18220

Linux进程通信——共享内存

共享内存 原理与概念 两个进程的PCB创建虚拟地址空间然后映射到物理内存中,每个进程因为是独立的,所以在物理内存中的地址也不同。 那么共享内存是怎么做到的呢?...这里共享内存也是一样的,OS要先描述再组织,才能进行管理,每次申请一块共享内存,OS还会给这块共享内存申请一个数据结构对象。...所以:共享内存 = 物理内存快 + 共享内存的相关属性 OS管理的是对这个共享内存的数据结构对象做管理的。 那么在创建共享内存的时候,如何保证共享内存在OS中是唯一的呢?答案就是key。...void* attachshm(int shmid) { void* p = shmat(shmid, nullptr, 0); if((long long)p == -1L)//因为linux...void* attachshm(int shmid) { void* p = shmat(shmid, nullptr, 0); if((long long)p == -1L)//因为linux

5.6K30

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.5K40

linux mmap

mmaplinux中提高文件读写效率的一种手段,这里简单整理一下mmap的原理和使用。 高速页缓存 在介绍文件读写之前需要先了解下页缓存的机制,有助于理解文件读写的底层实现。...在linux文件读写中,内核会将文件内容缓存到物理内存中,以页为单位进行映射。...--- mmap内存映射 mmap内存映射机制可以将文件的页缓存直接映射到用户空间进行读写,读写过程就和操作用户空间的内存一样,完美的避开了系统调用的上下文切换和数据拷贝。...若使用MAP_SHARED,则表示所有相关进程共享一份缓存(可用作共享内存),同时对缓存的更新会周期性的写入文件。 fd:打开的文件描述符,mmap函数返回后可以直接把文件关闭,不会影响内存映射。...在mmap中,无论是文件缓存还是内存映射都是以页为单位的。

2.2K30

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
领券