inux内存映射和共享内存理解和区别
可以看到内存映射中需要的一个参数是int fd(文件的标识符),可见函数是通过fd将文件内容映射到一个内存空间,
我需要创建另一个映射来得到文件内容并统计或修改,这时我创建这另一个映射用的仍是mmap函数,
它仍需要用到fd这个文件标识,那我不等于又重新打开文件读取文件里的数据
.既然这样那同对文件的直接操作有什么区别呢?
.映射到内存后通过映射的指针addr来修改内容的话是修改共享内存里的内容还是文件的内容呢?
.解决上面2个问题,我还是想确切知道共享内存有什么用???
一种回答|:
、访问共享内存的执行速度比直接访问文件的快N倍(N》),这对于要求快速输入输出的场合非常有效。
、通过addr修改的内容是修改的是共享内容中的内容。至于是否修改了文件中的内容,要看文件的类型。
对于显示设备等文件来说,修改的也是文件的内容,因为他直接写到了显存中。对于普通文件,
在close文件时,kernel会将数据更新到硬盘等存储设备中。
、共享内存主要是为了提高程序的执行速度,方便多个进程进行快速的大数据量的交换。
第二种回答:
对于是修改文件内容的内存映射:
、你的这个说法不确切。举个例子来说:对显示设备文件(显卡)进行内存的映射,并不会在内存中新分配一块内存,
而是直接将显存地址通过addr参数传给应用程序。这样应用程序通过内存映射修改文件时,
其实就是直接修改显存中的内容(也就是改变显示内容)。
、感觉你把内存映射和共享内存搞混了。内存映射是用来加快对文件/设备的访问。
(如果是大文件,而且还想提高读写速度的话,建议使用内存映射。)
共享内存是用来在多个进程间进行快速的大数据量的交换。
、fd是文件描述符。它和内存映射没有直接的关系。只有做过内存映射后,它和映射到的内存才存在对应关系。
对于不修改文件内容的内存映射
、不一定,可以在程序中指定要将文件内容映射到哪块内存。对于多个进程打开同一个文件,
不同的内存映射可以开辟多块内存区域。更新文件内容的顺序依照关闭文件的进程的顺序执行,因此,存在脏读的问题。
、:-),一定要记住,内存映射是为了加快对文件/设备的访问速度,不是用来进行数据通信的。
转载自:http://bbs.csdn.net/topics/340203684
我对内存映射的理解就是通过操作内存来实现对文件的操作,这样可以加快执行速度,因为操作内存比操作文件的速度快多了!
共享内存,顾名思义,就是预留出的内存区域,它允许一组进程对其访问。
共享内存是system vIPC中三种通信机制最快的一种,也是最简单的一种。对于进程来说,
获得共享内存后,他对内存的使用和其他的内存是一样的。由一个进程对共享内存所进行的
操作对其他进程来说都是立即可见的,因为每个进程只需要通过一个指向共享内存空间的指针就可以来读取
共享内存中的内容(说白了就好比申请了一块内存,每个需要的进程都有一个指针指向这个内存)
就可以轻松获得结果。使用共享内存要注意的问题:共享内存不能确保对内存操作的互斥性。
一个进程可以向共享内存中的给定地址写入,而同时另一个进程从相同的地址读出,这将会导致不一致的数据。
因此使用共享内存的进程必须自己保证读操作和写操作的的严格互斥。
可使用锁和原子操作解决这一问题。也可使用信号量保证互斥访问共享内存区域。
共享内存在一些情况下可以代替消息队列,而且共享内存的读/写比使用消息队列要快!
inux内存映射和共享内存理解和区别的更多相关文章
- VIRT(虚拟内存)RES(常驻内存)和SHR(共享内存)
VIRT: 1.进程“需要的”虚拟内存大小,包括进程使用的库.代码.数据,以及malloc.new分配的堆空间和分配的栈空间等: 2.假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长1 ...
- 数组逆序=全局内存版 VS 共享内存版
全局内存版 #include <stdio.h> #include <assert.h> #include "cuda.h" #include " ...
- JNI创建共享内存导致JVM terminated的问题解决(segfault,shared memory,内存越界,内存泄漏,共享内存)
此问题研究了将近一个月,最终发现由于JNI不支持C中创建共享内存而导致虚拟机无法识别这块共享内存,造成内存冲突,最终虚拟机崩溃. 注意:JNI的C部分所使用的内存也是由JVM创建并管理的,所以C创建了 ...
- linux mmap 内存映射【转】
转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...
- ZT 匿名内存映射
mmap函数使用 分类: Linux/Unix C/C++ 2008-01-22 17:03 6089人阅读 评论(1) 收藏 举报 unix编程null网络 UNIX网络编程第二卷进程间通信对mma ...
- linux mmap 内存映射
mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...
- mmap映射文件至内存( 实现 共享内存 与 文件的另类访问 )
Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
- 共享内存与存储映射(mmap)
[前言]对这两个理解还是不够深刻,写一篇博客来记录一下. 首先关于共享内存的链接:共享内存.里面包含了创建共享内存区域的函数,以及两个进程怎么挂载共享内存通信,分离.释放共享内存. 共享内存的好处就是 ...
随机推荐
- 提高PHP编码的一些技巧
1.不要使用相对路径 例如 require_once('../../lib/some_class.php'); 该方法有很多缺点: 1)它首先查找指定的php包含路径, 然后查找当前目录 2)如果该脚 ...
- PHP-多域名单点登陆方案
1.只是二级域名不同(比如a.xx.com, b.xx.com) 利用cookie, 设置domain为".xx.com"即可 2.多个本域名都不相同(比如www.a.com, w ...
- AJAX 跨域 CORS 解决方案
本篇文章由:http://xinpure.com/solutions-for-cross-domain-ajax-cors/ 两种跨域方法 在 Javascript 中跨域访问是比较常见的事情 就像现 ...
- HDUOJ--------1003 Max Sum
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- HDUOJ----Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- CodeForces 550A Two Substrings(模拟)
[题目链接]click here~~ [题目大意]: You are given string s. Your task is to determine if the given string s ...
- laravel5的Bcrypt加密方式对系统保存密码
laravel5文档介绍 //对 A 密码使用Bcrypt 加密 $password = Hash::make('mima'); //你也可直接使用 bcrypt 的 function $passwo ...
- OpenGl学习glMatrixMode()函数理解
glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项 ...
- TensorFlow人脸识别
TensorFlow框架做实时人脸识别小项目(一)https://blog.csdn.net/Goerge_L/article/details/80208297 TensorFlow框架做实时人脸识别 ...
- 基于乐观锁的配置server与XServer的交互
XServer与配置server,配置server保存有XServer的配置文件里的信息. 怎样在项目启动时.让XServer从配置server中获取到自己的配置信息,并达到通信资源的节省与控制. 通 ...