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

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

Linux下进程间通信也可以使用mmap内存共享映射来实现,mmap作用就是把磁盘文件一部分直接映射到进程内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...:共享和私有,如果是共享映射,那么在内存中对文件进行修改,磁盘中对应文件也会被修改,相反,磁盘中文件有了修改,内存文件也被修改。...通过这样内存共享映射就相当于是进程直接对磁盘中文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间通信。...由于这只是实现两个进程间通信,那么对于test文件来说在没有进程运行时候没有什么作用,所以它可以设置为一个临时文件,所以可以在代码中使用unlink函数,在进程结束以后删除test文件。...如果在运行中出现Bus error (core dumped)错误,需要考虑共享文件是否有存储空间(也就是说你要mmap一个4096文件,但实际文件没有4096那么大)。

7.8K30

php共享内存,php共享内存使用

$shmop) {    throw new Exception('创建共享内存失败');}//(1.3).向内存写入数据$text = 'A:大家好,我是A进程,我创建内存空间啊,欢迎大家一起来耍啊...shmop_write($shmop, $text, 0)) {    throw new Exception('共享内存写入数据失败');}//(1.4).用完关闭资源(并不会清除内存数据,只关闭资源句柄...)shmop_close($shmop);//(1.5).输出共享内存系统ID,我是1948581891,php打印是int值,底层用16进制echo dechex($shm_key) . ...$shmop) {    throw new Exception('打开共享内存失败');}//(2.2).从内存读取数据$data = shmop_read($shmop, 0, 1024);file_put_contents...key 命令可以删除通过shm_key创建共享内存共享内存不会因为进程退出而丢失,会一直存在系统中,除非删除它

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

【Linux 内核 内存管理】内存映射相关数据结构 ④ ( vm_area_struct 结构体成员分析 | vm_ops 成员 | vm_operations_struct 结构体成员分析 )

, 在 删除 " 虚拟内存区域 " 时调用 ; void (*close)(struct vm_area_struct * area); 3、mremap 函数指针 mremap 函数指针 , 指向函数..., 在 使用系统调用 mremap 函数 移动 " 虚拟内存区域 " 时调用 ; int (*mremap)(struct vm_area_struct * area); 4、fault 函数指针...在 【Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存...*vmf); 5、huge_fault 函数指针 huge_fault 函数指针 , 与上面的 fault 函数指针类似 , 只是 huge_fault 函数指针针对使用 " 透明巨型页 " 文件映射...内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 ) 博客中 ,

1.7K30

2021-2-25:对于 Java MMAP,如何查看文件映射脏页,如何统计MMAP内存大小

个字段含义分别如下: Size:表示该映射区域在虚拟内存空间中大小。...Rss:表示该映射区域当前在物理内存中占用了多少空间 Pss:该虚拟内存区域平摊计算后使用物理内存大小(有些内存会和其他进程共享,例如mmap进来)。...Shared_Clean:和其他进程共享未被改写page大小 Shared_Dirty: 和其他进程共享被改写page大小 Private_Clean:未被改写私有页面的大小。...Swap:表示非mmap内存(也叫anonymous memory,比如malloc动态分配出来内存)由于物理内存不足被swap到交换空间大小。...同时,top命令看到内存并不准,top,命令统计是RSS字段,其实对于MMAP来说,更准确应该是统计PSS字段

79930

匿名共享内存(Ashmem)使用

我们在使用Binder在进程间传递数据时候,有时候会抛出TransactionTooLargeException这个异常,这个异常产生是因为Binder驱动对内存限制引起。...答案就是匿名共享内存(Anonymous Shared Memory-Ashmem) ? 图片来源于网上 为了学习匿名共享内存使用,我们来写一个demo。...首先写一个服务端,这个服务端中在远程调用时候,要做以下事情: 1.创建一个匿名共享内存 2.往这个共享内存中写一个字符数据 3.将这个匿名共享内存文件句柄通过binder机制传递给客户端 package...对象 2.调用binder接口获得服务端匿名共享内存文件句柄 3.通过文件句柄,直接访问匿名共享内存数据,并打印出log。...2.匿名共享内存并没有大小限制,适合跨进程传输较大数据 3.匿名共享内存需要先通过Binder传递共享内存文件句柄 PS:机智小伙伴可能已经发现,我并没有使用AIDL,而是直接裸写了binder

2K42

​Linux内核透明巨型页支持

透明巨型页面支持是另一种使用大页为虚拟内存提供大页支持方法, 该支持自动提升和降低页面大小和没有hugetlbfs缺点。 目前它只适用于匿名内存映射和tmpfs/shmem。...它不需要内存预留,并且尽可能地使用大页(这里唯一可能预留是kernelcore=, 以避免不可移动页面碎片化所有内存,但这样调整不是针对透明大页支持, 它是通用适用于内核中所有动态高阶分配特性...挂载用于SysV SHM, memfds,共享匿名映射(/dev/zero或MAP_ANONYMOUS) GPU驱动DRM对象,Ashmem。...compact_fail: 如果系统试图规整内存但是失败了,则compact_fail会增加(失败规整次数)。...让mremap.c透明感知hugepage例子,只需要一行代码改变: diff --git a/mm/mremap.c b/mm/mremap.c --- a/mm/mremap.c +++ b/mm

2.6K40

鸿蒙轻内核四大基础功能介绍

使用场景 进程创建后,用户只能操作自己进程空间资源,无法操作其它进程资源(共享资源除外)。...offset用以改变经共享内存段访问文件中数据起始偏移值。 ? 说明: mmap与Linux实现差异详见与Linux标准库差异章节。 返回值: 成功返回:虚拟内存地址,这地址是页对齐。...length内存大小。返回值: 成功返回0。 失败返回-1。...参数说明: 参数描述old_address需要扩大(或缩小)内存原始地址。注意old_address必须是页对齐。old_size内存原始大小。new_size新内存大小。...flags如果没有足够空间在当前位置展开映射,则返回失败返回值: 成功返回:重新映射后虚拟内存地址。 失败返回:((void *)-1)。

79742

进程内存管理初探

,包括brk、mmapmremap等。...另外由于_edata上面是mmap区域,_edata与最近mmap内存很接近,则会导致brk系统调用极容易分配失败,即使memory mmap区域还有大量可用内存。...4096byte,这样就存在4088byte浪费;同时进程内存分配需求存在随机性,如果不同大小内存交替分配,当部分内存释放后,整个内存空间严重碎片化,导致最后分配大片内存时高概率会失败。...struct mm_struct是每个task虚拟内存空间描述符,例如用户态进(线)程栈区间,堆区间地址和大小等;每个进程只有一个mm,即使是多个线程进程,所有的线程都是共享同一个mm,mm_struct...例如分配2MB内存后,自始至终没有访问过这片内存,所以这2MB内存只是占用了虚拟地址空间,没有使用相应大小物理内存

2.3K71

【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )

文章目录 一、mmap 创建内存映射代码示例 1、fopen 打开或创建文件 2、lseek 设置文件大小 3、mmap 函数使用 4、munmap 删除内存映射 二、完整代码示例 一、mmap 创建内存映射代码示例...) * 10 - 1, SEEK_SET); 3、mmap 函数使用 调用 mmap 函数 , 创建文件映射 , 相关参数作用如下 : NULL : 映射区开始地址 sizeof(student) *...1 : 文件映射区长度 PROT_READ | PROT_WRITE : 内存保护标志位 , 该内存内容可以 读取 写入 MAP_SHARED : 指定映射关系 , 指的是该映射是进程共享内存空间...读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程共享内存空间 // fd : 文件描述符 , 被映射文件 // 0 : 被映射文件偏移量...// MAP_SHARED : 指定映射关系 , 指的是该映射是进程共享内存空间 // fd : 文件描述符 , 被映射文件 // 0 : 被映射文件偏移量 , 从文件哪个字节位置开始映射

1.4K10

Postgresql源码(90)共享内存申请CreateSharedMemoryAndSemaphores

Postgresql启动后申请两段内存,在启动时会判断系统支持情况,默认是使用mmap申请共享内存。...《Linux内存映射函数mmap与匿名内存块》 ipc共享内存,只申请PGSharedMemoryCreate大小。...《Linux共享内存与子进程继承》 Postgresql共享内存在9.2以后就是使用mmap申请了,在少数情况下使用ipc共享内存。...IPC共享内存: 在当前例子中,IPC共享内存只申请了一个PGShmemHeader空间,没有其他空间可以使用。...在这个步骤前,直接使用ShmemAlloc申请共享内存调整freeoffset位置 在这个步骤后,使用ShmemInitStruct申请共享内存,先在哈希表中创建一个索引条目,在使用ShmemAlloc

67320

值得收藏查询进程占用内存情况方法汇总

[ 调整上限后触发缓存回收 ] 3)尝试将内存上限调整到已使用内存以下,调整失败: ?...1 总结 1)smaps中记录了进程占用各个内存段,每个内存段中Rss表示私有内存+共享内存大小,其中共享内存被多个进程占用时会被重复计算; 2)smaps中Pss会将共享内存部分按共享进程数进行均摊...RES表示私有内存+共享内存大小,单位为KB,其中共享内存被多个进程占用时会被重复计算; 5)top命令SHR表示共享内存大小,单位为KB; 6)cgroupmemory.stat中cache表示系统...memroy.usage_in_bytes表示内存使用量,主要包括memory.statcache和rss; 9)cgroup内存限制,主要限制rss大小,当rss+cache>内存上限时会优先触发...综上所述,当我们考虑进程内存使用量时,如果关注是否会触发oom,则主要看memory.statrss部分即可,但rss并不能反映共享内存使用情况;如果要关注进程私有内存+共享内存占用情况,则可以主要看

1.6K00

Linux内核编程--内存映射和共享内存

*使用mmap时需要注意,不是所有文件都可以进行内存映射,一个访问终端或者套接字描述符只能用read/write这类函数去访问,用mmap内存映射会报错。...但是它们被打开后返回文件描述符都是由mmap函数映射到进程地址空间。 共享内存允许多个进程共享一个给定存储区。...若失败,返回-1 2.销毁共享内存 int shm_unlink(const char *name); 3.修改共享内存大小(还可以修改文件大小) int ftruncate(int fd, off_t...length) 处理mmap时候,普通文件或共享内存区对象大小都可以通过调用ftruncate修改。...若失败,返回-1 两个版本微小差异:Posix共享内存区对象大小可在任意时刻由ftruncate函数修改,System V共享内存区对象大小是在调用shmget创建时固定下来

5.8K10

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

即每个进程地址空间都有一个共享存储器映射区,当这块区域都映射到相同真正物理地址空间时,可以通过这块区域进行数据交换,例如共享库就是这么实现,很多进程都会使用同一个函数如printf,也许在真正物理地址空间中只存在一份...用管道或者消息队列传递数据: 用共享内存传递数据: 即使用共享内存传递数据比用消息队列和管道来说,减少了进入内核次数,提高了效率。...(在32位体系统结构上通常是4K) 返回值:成功返回映射到内存起始地址;失败返回-1 prot 参数取值: PROT_EXEC 表示映射这一段可执行,例如映射共享库 PROT_READ 表示映射这一段可读...mmap 编程注意点: 1、映射不能改变文件大小; 2、可用于进程间通信有效地址空间不完全受限于被映射文件大小; 3、文件一旦被映射后,所有对映射区域访问实际上是对内存区域访问。...映射区域内容写回文件时,所写内容不能超过文件大小; 对于1,3点,将mmap_write.c 中40行以后代码中5改成10,即映射内存大于文件大小,这样写入是不会出错,因为是向内存写入,

1.8K10

【操作系统】进程间通信——共享内存

共享内存使用 ftok 作用:创建一个唯一key,来标识一块共享内存。...size:申请共享内存大小,为4k整数倍。因为x86系列cpu在linux系统下面基本上,内存也都是以4kb为单位。 shmflg:权限标识。...IPC_EXCL:与IPC_CREAT一起使用,若以存在则创建失败。...---- 使用 mmap 作用:mmap是一种内存映射文件方法,即将一个文件或者其它对象映射到进程地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址一一对映关系。...代表从文件最前方开始对应,offset必须是分页大小整数倍。 返回值: 成功:返回指向映射区域指针。 失败:MAP_FAILED,其值为(void *)-1,并设置errno。

73410

linux网络编程之POSIX 共享内存和 系列函数

在前面介绍了system v 共享内存相关知识,现在来稍微看看posix 共享内存 和系列函数。...共享内存简单来说就是一块真正物理内存区域,可以使用一些函数将这块区域映射到进程地址空间进行读写,而posix 共享内存与system v 共享内存不同是它是用虚拟文件系统(tmpfs)实现,已经挂载在...功能:修改共享内存对象大小,shm_open不像shmget一样可以设置共享内存大小,但可以使用ftruncate 设置大小。...;失败返回-1 在前面曾经介绍了mmap 函数 将文件映射到进程地址空间作用,其实它还可以将共享内存对象映射到进程地址空间,类似shmat作用,只是传入文件描述符fd 是shm_open 返回...mmap共享内存映射到进程地址空间,将shmid 传入fd 参数,其余跟文件映射没什么区别,od -c查看可以看到写入东西。

1.7K00

POSIX共享内存

如下图所示: image.png 共享内存也是一种IPC,它是目前可用IPC中最快,它是使用方式是将同一个内存区映射到共享不同进程地址空间中,这样这些进程间通信就不再需要通过内核,只需对该共享内存区域进程操作就可以了...,和其他IPC不同是,共享内存使用需要用户自己进行同步操作。...下图是共享内存区IPC通信: image.png mmap系列函数简介 mmap函数主要功能就是将文件或设备映射到调用进程地址空间中,当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件读写等操作...POSIX共享内存使用方法有以下两个步骤: 通过shm_open创建或打开一个POSIX共享内存对象 然后调用mmap将它映射到当前进程地址空间 和通过内存映射文件进行通信使用上差别在于mmap描述符参数获取方式不一样...shm_unlink(const char *name); //成功返回0,失败返回-1 shm_open用于创建一个新共享内存区对象或打开一个已经存在共享内存区对象。

2.7K10

linux系统调用函数 mmap--创建内存映射区(在虚拟地址空间上)munmap--释放内存映射区

第二个参数是映射区大小size_t length,由于32bitlinux内核虚拟地址空间是由4KB大小页面组织,实际大小是4KB整数倍。不能指定为0,否则调用失败!...第五个参数是文件描述符fd,要映射文件对应文件描述符fd。使用open系统调用获取文件描述符。...失败,MAP_FAILED (void)-1*。 功能: 将磁盘文件数据映射到内存,用户通过修改内存就能修改磁盘文件。 (1)使用普通文件提供内存映射: 适用于任何进程之间。...(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存通信方式有许多特点和要注意地方,可以参看UNIX网络编程第二卷...一般来说,子进程单独维护从父进程继承下来一些变量。而mmap()返回地址,却由父子进程共同维护。 对于具有亲缘关系进程实现共享内存最好方式应该是采用匿名内存映射方式。

1.4K20

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

文章目录 一、进程一描述 二、进程二描述 三、mmap 进程共享内存展示 一、进程一描述 ---- 在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射...| munmap 删除内存映射 ) 中 , 完成了 进程一 程序 , 在该进程中 , 创建并打开文件 , 为该文件设置大小 , 使用 mmap 创建 " 文件映射 " , 并通过直接访问内存方式...); // mmap 文件映射创建失败 if (p_student == (void*) - 1) { printf("mmap 文件映射创建失败 !")..., 编译出可执行文件为 mmap_demo_02 ; 三、mmap 进程共享内存展示 ---- 先执行 进程一 mmap_demo_01 可执行程序 , 进程一 中通过 mmap 文件映射向文件中写出数据后..., 进入休眠阶段 , 再执行进程二 mmap_demo_02 , 使用 mmap 文件映射访问 file 文件 , 此时打印出 进程一 中通过 mmap 文件映射写出文件数据 ;

3.5K30
领券