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

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

一,内存映射 对于磁盘文件和进程: 将一个文件或其它对象映射到进程地址空间,实现文件在磁盘的存储地址和进程地址空间中一段虚拟地址的映射关系。...2.文件读写操作 step1: 读磁盘文件,获得文件描述符 step2: 基于文件描述符建立进程的内存映射区 step3: 利用进程进行内存映射区的读写操作 step4: 释放内存映射区,关闭文件描述符...: 内存映射共享内存的区别: 1.内存映射文件关联,共享内存不需要与文件关联,把共享内存理解为内存上的一个匿名片段。...2.内存映射可以通过fork继承给子进程,共享内存不可以。 3.文件打开的函数不同,内存映射文件由open函数打开,共享内存区对象由shm_open函数打开。...但是它们被打开后返回的文件描述符都是由mmap函数映射到进程的地址空间。 共享内存允许多个进程共享一个给定的存储区。

5.8K10

【Boost】Interprocess - 共享内存文件映射介绍

一、用法介绍       通过Interprocess,可以实现在共享内存文件映射中保存vector、map等STL对象,并且可以使用自定义的类,官方文档介绍的也很详细了,下面是几个精简的示例...示例:基于文件映射的Map使用 #include #include <boost/interprocess/containers...0/demo]# ls -al SharedMemory -rw-r--r-- 1 root root 65536 Feb 17 18:54 SharedMemory 示例:基于共享内存的...s\n", e.what()); shared_memory_object::remove("SharedMemory"); } return 0; } 示例:基于共享内存的...二、生命周期说明 机制上和Linux系统是一致的,分为进程级(进程退出销毁)、内核级(系统重启销毁)、文件系统级(文件删除销毁),这里不再赘述,附上官方原文。

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

c# 通过内存映射实现文件共享内存

内存映射文件是利用虚拟内存文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的 memcpy等内存操作的函数。...这种方法能够很好的应用在需要频繁处理一个文件或者是一个大文件的场合,这种方式处理IO效率比普通IO效率要高 共享内存内存映射文件的一种特殊情况,内存映射的是一块内存,而非磁盘上的文件。...操作系统给出了创建访问共享内存的API,需要共享内存的进程可以通过这一组定义好的API来访问多个进程之间共有的内存,各个进程访问这一段内存就 像访问一个硬盘上的文件一样。...MemoryMappedFiles命名空间,这个命名空间的类对windows 共享内存相关API做了封装,使.Net程序员可以更方便的使用内存映射文件。 在C#中使用共享内存。...System.Text; using System.IO; //引用内存映射文件命名空间 using System.IO.MemoryMappedFiles; namespace App1 {

1.7K20

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

文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页 " ; 三、共享内存 ---- 内存映射共享内存 关系 : 文件映射 : 在进程间的 " 共享内存 " 就是使用...共享的 " 文件映射 " 实现的 ; 匿名映射 : " 匿名映射 “ 一般是 ” 私有映射 " , 一般不作为 " 共享内存 " 使用 , 如果两个进程之间 共享 匿名映射 , 只能是 父子进程之间...才可以 ; 如果修改了 进程间的 " 共享内存 " 对应的 " 文件映射 " , 修改后不会立刻更新到文件中 , 调用 msync 函数 , 强制同步写入到文件中 ; 四、进程内存段的内存映射类型

8.2K20

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

Linux下的进程间通信也可以使用mmap的内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...:共享和私有,如果是共享映射,那么在内存中对文件进行修改,磁盘中对应的文件也会被修改,相反,磁盘中的文件有了修改,内存中的文件也被修改。...如果是私有映射,那么内存中的文件是独立的,二者进行修改都不会对对方造成影响。...通过这样的内存共享映射就相当于是进程直接对磁盘中的文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间的通信。...对于第四个参数,MAP_SHARED表示共享映射,MAP_PRIVATE表示私有映射。最后一个参数偏移量表示要从文件的哪个地方开始映射,应为4096的整数倍。

7.8K30

Linux内存映射——mmap

Linux提供了mmap()函数,用来映射物理内存。...对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件共享内存区,另一次从共享内存区到输出文件。...实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。...共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 基于文件映射,在mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。...对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式。此时,不必指定具体的文件,只要设置相应的标志即可.

5.5K10

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

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

3.5K30

采用共享内存文件映射的方式保存用户数据

[采用文件映射的解决方案]    下面介绍另一种解决方案给大家,那就是使用共享内存文件映射的方式进行保存(重要不可丢失的数据,采用文件映射+DB的方式,而访问量高但是可丢的数据可以采用共享内存的方式)...更进一步,我们可以把这个数组mmap到一个文件中,这样,每次查询的时候,无论是单查还是批量查询,其实都是在查询共享内存,通过下标直接索引的方式,效率非常高,由于写操作比较少,所以刷文件的次数也很少,对磁盘...[面临的一些其它问题]    这种文件映射存储用户数据的方式,可以广泛应用于现在的互联网应用中。...这种方案的思想是,尽可能把所有用户数据粒度细化,保存在一台机器中,由于现在64位机器,最大可提供的内存到了32G,给用户进程使用的空间还是很大的,基本可以满足需求。...[总结] 这种文件映射的思想可以广泛应用于互联网,特别上SNS应用中,不仅效果好,也可以大大节省了服务器成本,更多的应用场景值得我们继续挖掘。

71720

iOS文件内存映射——MMAP

文件操作的更底层实现过程,是使用linux的read()、write()函数直接操作文件句柄(也叫文件描述符、fd)。...而mmap将磁盘上文件的地址信息与进程用的虚拟逻辑地址进行映射,建立映射的过程与普通的内存读取不同:正常的是将文件拷贝到内存,mmap只是建立映射而不会将文件加载到内存中。...App 只管往里面写数据,由 iOS 负责将内存回写到文件,不必担心 crash 导致数据丢失。 下面两个图分别显示进程读取磁盘文件的过程和使用mmap进行文件映射的过程。 ? 图1 ?...:映射类型,通常是文件共享类型; fd:文件句柄; off_toffset:被映射对象的起点偏移; 读写的例子如下: #import "ViewController.h" #import <sys/mman.h...,通常读取文件是将文件读取到内存,会占用真正的物理内存;而mmap是用进程的内存虚拟地址空间去映射实际的文件中,这个过程由操作系统处理。

1.6K20

Linux】system V 共享内存

system V system V 是一套标准,独立于文件系统之外的,专门为了通信设计出来的模块 让两个毫不相关的进程看到同一份资源 1....共享内存原理 第一阶段原理 进程A和进程B都通过自己的页表映射到物理内存中的特定区域,进而找到该进程匹配的代码和数据 为了让进程A和进程B通信,前提是两者要看到同一份资源 假设在物理内存上开辟一块空间...进程A和进程B在自己的地址空间中都有自己的共享区 想办法把物理内存中新开辟空间 通过页表 映射到 进程A和进程B的共享区中 把地址空间的起始地址返回给用户 进程A和进程B就可以通过起始的虚拟地址,对应页表访问到内存...直接写代码--编写代码进行原理介绍 ---- 打开vscode,创建文件client.cc和server.cc(后缀为cc说明是c++)的文件 创建公共路径 comm.hpp shmget函数 创建共享路径接口...perms 代表权限 bytes 代表字节数 nattch 代表 有几个进程和当前进程是关联的 用指令删除 key是在操作系统中使用的,类似于文件的inode编号 shmid 类似于文件的fd 所以删除操作

17720

Linux进程通信——共享内存

共享内存 原理与概念 两个进程的PCB创建虚拟地址空间然后映射到物理内存中,每个进程因为是独立的,所以在物理内存中的地址也不同。 那么共享内存是怎么做到的呢?...首先先在物理内存中申请一块内存。 然后讲这块内存通过页表映射分别映射到这两个进程的虚拟地址空间内,让这两个进程都能看到这块内存。...(这里也称为进程和共享内存挂接) 最后如果不想通信了: 取消进程和内存映射关系(去关联) 释放内存(释放共享内存) 理解: a.这里和原本C语言当中的maclloc函数开辟空间不同,...我们要利用接口让两个进程实现通信,首先创建两个.cc的文件,一个头文件.hpp。 因为两个进程都要创建/获取共享内存,所以获取key等等操作在头文件更方便。...shmat 第一个参数是想和哪一个共享内存关联,第二个参数是想把这个共享内存映射到地址空间的哪个地方(不常用),第三个权限是读写权限(一般设置为0)。

5.5K30

Linux共享内存及函数

共享内存的概念 共享内存是指多个进程可以把一段内存共同的内存映射到自己的进程空间中,从而实现数据的共享和传输,它是存在与内核级别的一种资源,是所有进程间通信中方式最快的一种。...对于每一个共享内存段,内核会为其维护一个shmid_ds类型的结构体: // 摘自所用ubuntu18.04电脑中的/usr/include/i386-linux-gnu/bits/shm.h struct...共享内存的附加(映射) 创建一个共享内存后,某个进程若想使用,需要将此内存区域附加(attach)到自己的进程空间(或称地址映射),需要用到shmat()函数: #include <sys/types,...key,ftok() 使用key创建/获得一个共享内存,shmget() 映射共享内存,得到虚拟地址,shmat() 使用共享内存,通过地址指针 移除映射,shmdt() 销毁共享内存,shmctl()...参考: 《精通Linux C编程》- 程国钢 《Linux C编程完全解密》- 闫敬 吴淑坤

5.9K10

高端内存映射之kmap持久内核映射--Linux内存管理(二十)

1 高端内存与内核映射 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途....它与通过固定公式与物理内存关联的直接映射页相反,虚拟固定映射地址与物理内存位置之间的关联可以自行定义,关联建立后内核总是会注意到的. ?...永久内存映射区 该区域可访问高端内存. 访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域....总之,内核的高端线性地址是为了访问内核固定映射以外的内存资源。进程在使用内存时,触发缺页异常,具体将哪些物理页映射给用户进程是内核考虑的事情. 在用户空间中没有高端内存这个概念....即内核对于低端内存, 不需要特殊的映射机制, 使用直接映射即可以访问普通内存区域, 而对于高端内存区域, 内核可以采用三种不同的机制将页框映射到高端内存 : 分别叫做永久内核映射、临时内核映射以及非连续内存分配

3.3K10

Python内存映射文件读写方式

: Zhang Phil 补充知识:Python对二进制文件内存映射,高效优雅地对内容随机访问 读写二进制文件还在使用open函数?...使用 mmap 模块实现对文件内存映射,让我们读写二进制文件像操作数组一样高效优雅。 先给出一个实用函数,用来演示如何打开一个文件并对它进行内存映射操作。...需要强调的是,对某个文件进行内存映射并不会导致将整个文件读到内存中。也就是说,文件并不会拷贝到某种内存缓冲区或数组上。相反,操作系统只是为文件内容保留一段虚拟内存而已。...如果有多个Python解释器对同一个文件做了内存映射,得到的mmap对象可以用来在解释器之间交换数据。...以上这篇Python内存映射文件读写方式就是小编分享给大家的全部内容了,希望能给大家一个参考。

2.2K20

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

4、mmap 创建内存映射 二、mmap 创建内存映射 与 普通文件操作 对比 一、mmap 创建内存映射 与 malloc 申请内存对比 ---- 1、malloc 函数原型 C 标准库 stdlib.h...大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存 ; 4、mmap 创建内存映射 mmap 可以直接向 Linux...内核申请 " 虚拟内存 " , 不需要经过 " 用户态 “ 与 ” 内核态 " 之间的转换 ; 二、mmap 创建内存映射 与 普通文件操作 对比 ---- 使用 mmap 系统调用 与 传统文件 操作...对比 : 传统的文件操作 , 首先调用 fopen 函数打开文件 , 然后调用 fread fwrite 等函数操作文件 , 这些操作 在 用户模式 下调用 , 然后需要 切换到 内核模式 下调用 Linux..., 可以使用 mmap 系统调用 创建 共享的 " 文件映射 “ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作 " ;

6K20

iOS的文件内存映射——mmap

文件操作的更底层实现过程,是使用linux的read()、write()函数直接操作文件句柄(也叫文件描述符、fd)。...而mmap将磁盘上文件的地址信息与进程用的虚拟逻辑地址进行映射,建立映射的过程与普通的内存读取不同:正常的是将文件拷贝到内存,mmap只是建立映射而不会将文件加载到内存中。...这样做的注意事项: 1、牺牲较大的虚拟内存映射区域有多大就需要虚拟内存有多大;(故而太大的文件不适合映射整个文件,32位虚拟内存最大是4GB,可以只映射部分) 2、因为映射有额外的性能消耗,所以适用于频繁读操作的场景...:映射类型,通常是文件共享类型; fd:文件句柄; off_toffset:被映射对象的起点偏移; 用官网的代码做参考,写了一个读写的例子: #import "ViewController.h"...总结 mmap就是文件内存映射,通常读取文件是将文件读取到内存,会占用真正的物理内存;而mmap是用进程的内存虚拟地址空间去映射实际的文件中,这个过程由操作系统处理。

2.6K10
领券