Linux下的进程间通信也可以使用mmap的内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...:共享和私有,如果是共享映射,那么在内存中对文件进行修改,磁盘中对应的文件也会被修改,相反,磁盘中的文件有了修改,内存中的文件也被修改。...通过这样的内存共享映射就相当于是进程直接对磁盘中的文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间的通信。...由于这只是实现两个进程间的通信,那么对于test文件来说在没有进程运行的时候没有什么作用,所以它可以设置为一个临时文件,所以可以在代码中使用unlink函数,在进程结束以后删除test文件。...如果在运行中出现Bus error (core dumped)错误,需要考虑共享文件是否有存储空间(也就是说你要mmap一个4096的文件,但实际文件没有4096那么大)。
$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创建的共享内存共享内存不会因为进程退出而丢失,会一直存在系统中,除非删除它
https://docs.vagrantup.com/v2/virtualbox/configuration.html
, 在 删除 " 虚拟内存区域 " 时调用 ; 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 函数指针针对的是 使用 " 透明巨型页 " 的文件映射...内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 ) 博客中 ,
个字段的含义分别如下: Size:表示该映射区域在虚拟内存空间中的大小。...Rss:表示该映射区域当前在物理内存中占用了多少空间 Pss:该虚拟内存区域平摊计算后使用的物理内存大小(有些内存会和其他进程共享,例如mmap进来的)。...Shared_Clean:和其他进程共享的未被改写的page的大小 Shared_Dirty: 和其他进程共享的被改写的page的大小 Private_Clean:未被改写的私有页面的大小。...Swap:表示非mmap内存(也叫anonymous memory,比如malloc动态分配出来的内存)由于物理内存不足被swap到交换空间的大小。...同时,top命令看到的内存并不准,top,命令统计的是RSS字段,其实对于MMAP来说,更准确的应该是统计PSS字段
CUDA共享内存使用示例如下:参考教材《GPU高性能编程CUDA实战》。...(); 33 34 //归约运算,将每个缓冲区中的值加和,存放到缓冲区第一个元素位置 35 int i = blockDim.x / 2; 36 while (i !...cache[cacheIndex + i]; 41 } 42 __syncthreads(); 43 i /= 2; 44 } 45 //使用第一个线程取出每个缓冲区第一个元素赋值到...54 float *a, *b, c, *partial_c; 55 float *dev_a, *dev_b, *dev_partial_c; 56 57 //分配CPU内存...sizeof(float)); 60 partial_c = (float*)malloc(blocksPerGrid * sizeof(float)); 61 62 //分配GPU内存
我们在使用Binder在进程间传递数据的时候,有时候会抛出TransactionTooLargeException这个异常,这个异常的产生是因为Binder驱动对内存的限制引起的。...答案就是匿名共享内存(Anonymous Shared Memory-Ashmem) ? 图片来源于网上 为了学习匿名共享内存的使用,我们来写一个demo。...首先写一个服务端,这个服务端中在远程调用的的时候,要做以下事情: 1.创建一个匿名共享内存 2.往这个共享内存中写一个字符数据 3.将这个匿名共享内存的文件句柄通过binder机制传递给客户端 package...对象 2.调用binder的接口获得服务端匿名共享内存的文件句柄 3.通过文件句柄,直接访问匿名共享内存中的数据,并打印出log。...2.匿名共享内存并没有大小的限制,适合跨进程传输较大的数据 3.匿名共享内存需要先通过Binder传递共享内存的文件句柄 PS:机智的小伙伴可能已经发现,我并没有使用AIDL,而是直接裸写了binder
透明的巨型页面支持是另一种使用大页为虚拟内存提供大页支持的方法, 该支持自动提升和降低页面大小和没有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
使用场景 进程创建后,用户只能操作自己进程空间的资源,无法操作其它进程的资源(共享资源除外)。...offset用以改变经共享内存段访问的文件中数据的起始偏移值。 ? 说明: mmap与Linux实现差异详见与Linux标准库的差异章节。 返回值: 成功返回:虚拟内存地址,这地址是页对齐。...length内存段的大小。返回值: 成功返回0。 失败返回-1。...参数说明: 参数描述old_address需要扩大(或缩小)的内存段的原始地址。注意old_address必须是页对齐。old_size内存段的原始大小。new_size新内存段的大小。...flags如果没有足够的空间在当前位置展开映射,则返回失败返回值: 成功返回:重新映射后的虚拟内存地址。 失败返回:((void *)-1)。
,包括brk、mmap和mremap等。...另外由于_edata上面是mmap区域,_edata与最近的mmap内存很接近,则会导致brk系统调用极容易分配失败,即使memory mmap区域还有大量可用内存。...4096byte,这样就存在4088byte的浪费;同时进程的内存分配需求存在随机性,如果不同大小的内存交替分配,当部分内存释放后,整个内存空间严重碎片化,导致最后分配大片内存时高概率会失败。...struct mm_struct是每个task的虚拟内存空间的描述符,例如用户态进(线)程栈区间,堆区间的地址和大小等;每个进程只有一个mm,即使是多个线程的进程,所有的线程都是共享同一个mm,mm_struct...例如分配2MB的内存后,自始至终没有访问过这片内存,所以这2MB的内存只是占用了虚拟地址空间,没有使用相应大小的物理内存。
文章目录 一、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 : 被映射文件的偏移量 , 从文件的哪个字节位置开始映射
Postgresql启动后申请两段内存,在启动时会判断系统支持情况,默认是使用mmap申请共享内存。...《Linux内存映射函数mmap与匿名内存块》 ipc的共享内存,只申请PGSharedMemoryCreate大小。...《Linux共享内存与子进程继承》 Postgresql的共享内存在9.2以后就是使用mmap申请的了,在少数情况下使用ipc的共享内存。...IPC的共享内存: 在当前例子中,IPC的共享内存只申请了一个PGShmemHeader的空间,没有其他空间可以使用。...在这个步骤前,直接使用ShmemAlloc申请共享内存,调整freeoffset位置 在这个步骤后,使用ShmemInitStruct申请共享内存,先在哈希表中创建一个索引条目,在使用ShmemAlloc
[ 调整上限后触发缓存回收 ] 3)尝试将内存上限调整到已使用内存以下,调整失败: ?...1 总结 1)smaps中记录了进程占用的各个内存段,每个内存段中的Rss表示私有内存+共享内存大小,其中共享内存被多个进程占用时会被重复计算; 2)smaps中的Pss会将共享内存部分按共享进程数进行均摊...RES表示私有内存+共享内存大小,单位为KB,其中共享内存被多个进程占用时会被重复计算; 5)top命令的SHR表示共享内存大小,单位为KB; 6)cgroup的memory.stat中cache表示系统...的memroy.usage_in_bytes表示内存使用量,主要包括memory.stat的cache和rss; 9)cgroup的内存限制,主要限制rss大小,当rss+cache>内存上限时会优先触发...综上所述,当我们考虑进程的内存使用量时,如果关注是否会触发oom,则主要看memory.stat的rss部分即可,但rss并不能反映共享内存的使用情况;如果要关注进程的私有内存+共享内存占用情况,则可以主要看
*使用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创建时固定下来的。
即每个进程地址空间都有一个共享存储器的映射区,当这块区域都映射到相同的真正的物理地址空间时,可以通过这块区域进行数据交换,例如共享库就是这么实现的,很多进程都会使用同一个函数如printf,也许在真正的物理地址空间中只存在一份...用管道或者消息队列传递数据: 用共享内存传递数据: 即使用共享内存传递数据比用消息队列和管道来说,减少了进入内核的次数,提高了效率。...(在32位体系统结构上通常是4K) 返回值:成功返回映射到的内存区的起始地址;失败返回-1 prot 参数取值: PROT_EXEC 表示映射的这一段可执行,例如映射共享库 PROT_READ 表示映射的这一段可读...mmap 编程注意点: 1、映射不能改变文件的大小; 2、可用于进程间通信的有效地址空间不完全受限于被映射文件的大小; 3、文件一旦被映射后,所有对映射区域的访问实际上是对内存区域的访问。...映射区域内容写回文件时,所写内容不能超过文件的大小; 对于1,3点,将mmap_write.c 中40行以后的代码中的5改成10,即映射的内存大于文件的大小,这样写入是不会出错的,因为是向内存写入,
共享内存的使用 ftok 作用:创建一个唯一的key,来标识一块共享内存。...size:申请的共享内存的大小,为4k的整数倍。因为x86系列的cpu在linux系统下面基本上,内存也都是以4kb为单位。 shmflg:权限标识。...IPC_EXCL:与IPC_CREAT一起使用,若以存在则创建失败。...---- 使用 mmap 作用:mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。...代表从文件最前方开始对应,offset必须是分页大小的整数倍。 返回值: 成功:返回指向映射区域的指针。 失败:MAP_FAILED,其值为(void *)-1,并设置errno。
在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数。...共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进程的地址空间进行读写,而posix 共享内存与system v 共享内存不同的是它是用虚拟文件系统(tmpfs)实现的,已经挂载在...功能:修改共享内存对象大小,shm_open不像shmget一样可以设置共享内存的大小,但可以使用ftruncate 设置大小。...;失败返回-1 在前面曾经介绍了mmap 函数 将文件映射到进程地址空间的作用,其实它还可以将共享内存对象映射到进程地址空间,类似shmat的作用,只是传入的文件描述符fd 是shm_open 返回的...mmap 将共享内存映射到进程地址空间,将shmid 传入fd 参数,其余跟文件映射没什么区别,od -c查看可以看到写入的东西。
如下图所示: 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用于创建一个新的共享内存区对象或打开一个已经存在的共享内存区对象。
第二个参数是映射区的大小size_t length,由于32bit的linux内核虚拟地址空间是由4KB大小的页面组织的,实际大小是4KB的整数倍。不能指定为0,否则调用失败!...第五个参数是文件描述符fd,要映射的文件对应的文件描述符fd。使用open系统调用获取文件描述符。...失败,MAP_FAILED (void)-1*。 功能: 将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。 (1)使用普通文件提供的内存映射: 适用于任何进程之间。...(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存的通信方式有许多特点和要注意的地方,可以参看UNIX网络编程第二卷...一般来说,子进程单独维护从父进程继承下来的一些变量。而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 文件映射写出的文件数据 ;
领取专属 10元无门槛券
手把手带您无忧上云