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

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

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

2K30

Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )

在博客 【Linux 内核 内存管理】虚拟地址空间布局架构 ⑦ ( vm_area_struct 结构体成员分析 | vm_start | vm_end | vm_next | vm_prev |vm_rb...) 中 , 分析了 vm_start vm_end vm_next vm_prev vm_rb 这 5 个结构体成员作用 ; 在博客 【Linux 内核 内存管理】内存映射相关数据结构 ② ( vm_area_struct...vm_area_struct 结构体中的 vm_mm vm_page_prot vm_flags 成员作用 ; 一、vm_area_struct 结构体成员分析 ---- 1、shared 成员 在 内存映射...成员 " 虚拟内存区域 “ vm_area_struct 结构体实例 所 ” 关联 " 的 anon_vma 实例 , 会与 " 父进程 " 的 anon_vma 实例 串联起来 , 组成一个 链表...成员 anon_vma 结构体 用于 组织 " 匿名内存页 " 被 映射到的 " 用户虚拟地址空间 " , anon_vma 成员指向了 anon_vma 结构体实例 ; struct anon_vma

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

Linux: linux 匿名管道

相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务.就好像下面的命令: echo 123 | awk '{print $0+123...管道的定义 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。...EAGAIN 如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 当要写入的数据量不大于PIPE_BUF时,linux...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

33.9K41

Linux内核虚拟内存管理之匿名映射缺页异常分析

作者简介 韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。...注:本文使用linux-5.0内核源代码。文章分为以下几节内容: 1.匿名映射缺页异常的触发情况 2.0页是什么?为什么使用0页?...2.当我们应用程序使用mmap来创建匿名内存映射的时候,页同样只是分配了虚拟内存,并没有分配物理内存,第一次去访问的时候才会通过触发缺页异常来分配物理页建立和虚拟页的映射关系。...=162M与我们mmap的大小基本一致,说明了匿名页实际写的时候才会分配等量的物理内存。...五,总结 匿名映射缺页异常是我们遇到的一种很常用的一种异常,对于匿名映射,映射完成之后,只是获得了一块虚拟内存,并没有分配物理内存,当第一次访问的时候:如果是读访问,会将虚拟页映射到0页,以减少不必要的内存分配

2.8K32

匿名共享内存(Ashmem)的使用

答案就是匿名共享内存(Anonymous Shared Memory-Ashmem) ? 图片来源于网上 为了学习匿名共享内存的使用,我们来写一个demo。...首先写一个服务端,这个服务端中在远程调用的的时候,要做以下事情: 1.创建一个匿名共享内存 2.往这个共享内存中写一个字符数据 3.将这个匿名共享内存的文件句柄通过binder机制传递给客户端 package...String str = "kobewang"; byte[] contentBytes = str.getBytes(); //创建匿名共享内存...3.通过文件句柄,直接访问匿名共享内存中的数据,并打印出log。...,适合跨进程传输较大的数据 3.匿名共享内存需要先通过Binder传递共享内存的文件句柄 PS:机智的小伙伴可能已经发现,我并没有使用AIDL,而是直接裸写了binder的使用,其实裸写一次以后有助于理解

1.9K31

图解内存匿名反向映射reverse mapping

创建 在反向匿名映射中除了page struct,一共有三个相关的数据结构: vm_area_struct anon_vma anon_vma_chain 第一个数据结构我们已经见过了,是一个老朋友。...而后两者就是为了构造反向匿名映射而新生的。我们先来看看这两个新的数据结构的样子。...do_anonymous_page 首先出场的是函数do_anonymous_page,这个函数是在匿名页缺页中断时会调用的函数。...但是我想意思已经表达清楚,即在一个进程中多个vma可以共享同一个anon_vma作为匿名映射的节点。...使用 好了,到了这里我们已经拥有了一个非常强悍的武器 – 匿名反向映射。有了他我们就可以指哪打哪了。 内核也已经给我们准备好了扣动这个核武器的板机 – rmap_walk_anon

2K31

聊聊 Linux匿名管道

相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务.就好像下面的命令: echo 123 | awk '{print $0+...管道的定义 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。...值为EAGAIN 如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 当要写入的数据量不大于PIPE_BUF时,linux...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

2.6K20

Linux匿名管道及实例

匿名管道,也称管道,是Linux下最常见的进程间通信方式之一。匿名管道在系统中没有实名,它只是进程的一种资源,会随着进程的结束而被系统清除。...管道的创建与关闭 Linux中使用pipe()函数创建一个匿名管道,其函数原型为: #include int pipe(int fd[2]); 创建成功返回0,出错返回1。...pipe file descriptors are3,4 程序中使用pipe函数建立了一个匿名管道fd,之后向管道一端写入数据并从另一端读出数据,将数据输出到标准输出,在程序的最后使用close函数关闭管道的两端...参考:《精通Linux C编程》- 程国钢 附:fork()函数的使用示例,参考:https://blog.csdn.net/jason314/article/details/5640969 #include

2.3K30

操作系统原理:How Linux Works(三):Memory

Linux 内存的分类 Linux 内存的计算 Linux 进程的内存 Linux 应用内存分配 内存是计算机中与CPU进行沟通的桥梁,用于暂时存放CPU中的运算数据。...Linux 内核的内存管理机制设计得非常精妙,对于 Linux 内核的性能有很大影响。...Linux 内存的分类 用户内存的分类有两组概念比较重要:匿名内存和File-backed内存;Active 和 Inactive 。...它们的区别如下: 匿名内存:用来存储用户进程计算过程中间的数据,与物理磁盘的文件没有关系; File-backed内存:用作磁盘高速缓存,其物理内存与物理磁盘上的文件是对应的; Active : 刚被使用过的数据的内存空间...内存的计算 各类内存的计算公式如下: Shmem = 磁盘高速缓存(buffers/cached)- Filed-backed内存(file) = 匿名内存anon)- AnonPages

2K80

聊聊 Linux内存统计

Linux内存管理从物理内存管理到虚拟内存管理涉及的概念和统计项实在太多,本文从实用和系统运维的角度出发,只列举一些最实用的统计。...Active — 最近使用的内存,回收的优先级低 Inactive — 最近较少使用的内存,回收的优先级高 Active (anon) — Active 链表中的匿名页(Anonymous Pages)...部分 Inactive (anon) — Inactive 链表中的匿名页(Anonymous Pages)部分 Active (file) — Active 链表中的File-backed Pages...但是,tmpfs 背后并没有真实的磁盘文件存在,如果想要被临时释放出来,只能通过Swap的方式,所以内存页被链接到了Inactive(anon)和Active(anon)里。...所以从数值上看,Inactive(anon)项 + Active(anon)项 不等于AnonPages项,因为前者包括共享内存的部分。

5.9K40

宋宝华:论一切都是文件之匿名inode

在跨进程的情况下,Linux支持fd的跨进程socket传输,从而可以实现共享内存、dma_buf跨进程共享等。...我们在《宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)》一文中已经详细阐述过这个过程,这里我们就不再赘述了。本文的重点在于匿名inode。...03 匿名inode的内核实例 我们接下来可以随便打开个anon inode的实例来看看它是怎么工作的了。...首先userfaultd是一个系统调用: 这个代码里面比较核心的是就是,它通过: anon_inode_getfd_secure() 生成一个匿名inode,并获得一个句柄fd。...文件,哪怕最终是匿名的,都以冲天的香阵,弥漫整个Linux的世界。 04 用户使用匿名inode 到了要说再见的时刻了,用户可见的就是fd,通过fd来使用匿名inode。

49020

Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )

" 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ; 2、产生缺页异常 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问...缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存页 " 中 ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存页 “...共享的 " 文件映射 " 实现的 ; 匿名映射 : " 匿名映射 “ 一般是 ” 私有映射 " , 一般不作为 " 共享内存 " 使用 , 如果两个进程之间 共享 匿名映射 , 只能是 父子进程之间...: 私有的 " 匿名映射 " ; 堆栈 : 私有的 " 匿名映射 " ;

8.2K20

宋宝华:论一切都是文件之匿名inode

在跨进程的情况下,Linux支持fd的跨进程socket传输,从而可以实现共享内存、dma_buf跨进程共享等。...image.png 我们在《宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)》一文中已经详细阐述过这个过程,这里我们就不再赘述了。本文的重点在于匿名inode。...03 匿名inode的内核实例 我们接下来可以随便打开个anon inode的实例来看看它是怎么工作的了。...首先userfaultd是一个系统调用: image.png 这个代码里面比较核心的是就是,它通过: anon_inode_getfd_secure() 生成一个匿名inode,并获得一个句柄fd...文件,哪怕最终是匿名的,都以冲天的香阵,弥漫整个Linux的世界。 04 用户使用匿名inode 到了要说再见的时刻了,用户可见的就是fd,通过fd来使用匿名inode。

1.2K20

android匿名共享内存Ashmem(c库接口)

Ashmem Android系统的匿名共享内存Ashmem驱动程序利用了Linux的共享内存子系统导出的接口来实现。 在Android系统中,匿名共享内存也是进程间通信方式的一种。...内存回收算法机制就是当你使用Ashmem分配了一块内存,但是其中某些部分却不会被使用时,那么就可以将这块内存unpin掉。 unpin后,内核可以将它对应的物理页面回收,以作他用。...android匿名共享内存接口 源码是最好的老师,废话不多说,直接看代码。...锁定匿名共享内存块 int ashmem_pin_region(int fd, size_t offset, size_t len) { struct ashmem_pin pin = { offset...解锁匿名共享内存块 int ashmem_unpin_region(int fd, size_t offset, size_t len) { struct ashmem_pin pin = {

1.7K20

DragonOS新版地址映射管理及VMA机制设计

关于匿名页反向映射的必要性,考虑这样一种情况:我们决定要将页面A换出内存,并且,假定当前系统运行1000个进程,其中,页面A出现在了5个进程的页表之中。...为此我们才引入VMA,以支持高效的匿名页反向映射。 2.2. VMA的几个数据结构之间的关系 每个匿名页(物理内存页)对应一个anon_vma结构体。...当前VMA机制设计的缺陷 当前的设计具有一些缺陷: 数据量大时,查询慢:举个例子:当进程不断fork,产生1000个子进程,每个进程有1000个匿名页时,这个anon_vma链表将会变得非常庞大,导致每次查询都会非常慢...将来可通过引入类似Linuxanon_vma_chain的设计来解决。 anon_vma占用空间大:当前会为每个页面维护独立的anon_vma以及链表,这将会导致很大的内存空间占用。...将来可以考虑重用anon_vma,也就是合并相同的anon_vma,以减少内存空间占用。

20030

Linux 匿名页的反向映射

我们知道LINUX内存管理系统中有”反向映射“这一说,目的是为了快速去查找出一个特定的物理页在哪些进程中被映射到了什么地址,这样如果我们想把这一页换出(SWAP),或是迁移(Migrate)的时候,就能相应该更改所有相关进程的页表来达到这个目的...1、为什么要使用反向映射   物理内存的分页机制,一个PTE(Page Table Entry)对应一个物理页,但一个物理页可以由多个PTE与之相对应,当该页要被回收时,Linux2.4的做法是遍历每个进程的所有...* 最低位为1表示该页为匿名页,并且它指向anon_vma对象。...PageLocked(page)); /*判断是不是匿名页,若是的话执行try_to_unmap_anon函数,否则的话执行try_to_unmap_file函数*/ if (PageAnon...*vma; int ret = SWAP_AGAIN; anon_vma = page_lock_anon_vma(page); /* 获取该匿名页的anon_vma结构

3.6K31

Linux进程间通信【匿名管道】

命名管道 System V 标准: System V 消息队列 System V 共享内存 System V 信号量 POSIX 标准: POSIX 消息队列 POSIX 共享内存 POSIX...和 命名管道,两者绝大部分原理、特点都一致,本文主要介绍 匿名管道,同时适用于 命名管道 的知识点统一称为 管道 Linux 中一切皆文件,所以管道本质上就是一个文件 ---- 3、管道的工作原理 管道的工作原理其实很简单...父进程需要以读写的方式打开匿名管道 pipe,这样子进程在继承时,才不会发生权限丢失 创建出的匿名管道文件 pipe 虽然属于文件系统,但它是一个特殊文件,一个由 OS 提供的纯纯的内存文件,不需要将数据冲刷至磁盘中...管道 的使用和 文件 一致,迎合 Linux一切皆文件思想 4.3、管道读写规则 管道是一种 半双工、单向流 的通信方式,因此在成功创建匿名管道后,需要两个待通信的进程都能获得同一个 pipefd 数组...时,Linux 将保证写入的原子性 当要写入的数据量大于 PIPE_BUF 时,Linux 将不再保证写入的原子性 原子性:不存在中间状态,确保数据的安全性 ---- 5、管道的特点 管道 主要有以下几个特点

19220
领券