inux内存映射和共享内存理解和区别

可以看到内存映射中需要的一个参数是int fd(文件的标识符),可见函数是通过fd将文件内容映射到一个内存空间,
我需要创建另一个映射来得到文件内容并统计或修改,这时我创建这另一个映射用的仍是mmap函数,
它仍需要用到fd这个文件标识,那我不等于又重新打开文件读取文件里的数据
1.既然这样那同对文件的直接操作有什么区别呢?
2.映射到内存后通过映射的指针addr来修改内容的话是修改共享内存里的内容还是文件的内容呢?
3.解决上面2个问题,我还是想确切知道共享内存有什么用???
一种回答|:
1、访问共享内存的执行速度比直接访问文件的快N倍(N》10),这对于要求快速输入输出的场合非常有效。
2、通过addr修改的内容是修改的是共享内容中的内容。至于是否修改了文件中的内容,要看文件的类型。
   对于显示设备等文件来说,修改的也是文件的内容,因为他直接写到了显存中。对于普通文件,
   在close文件时,kernel会将数据更新到硬盘等存储设备中。
3、共享内存主要是为了提高程序的执行速度,方便多个进程进行快速的大数据量的交换。
第二种回答:
对于是修改文件内容的内存映射:
1、你的这个说法不确切。举个例子来说:对显示设备文件(显卡)进行内存的映射,并不会在内存中新分配一块内存,
   而是直接将显存地址通过addr参数传给应用程序。这样应用程序通过内存映射修改文件时,
   其实就是直接修改显存中的内容(也就是改变显示内容)。
2、感觉你把内存映射和共享内存搞混了。内存映射是用来加快对文件/设备的访问。
 (如果是大文件,而且还想提高读写速度的话,建议使用内存映射。)
  共享内存是用来在多个进程间进行快速的大数据量的交换。
3、fd是文件描述符。它和内存映射没有直接的关系。只有做过内存映射后,它和映射到的内存才存在对应关系。
对于不修改文件内容的内存映射
1、不一定,可以在程序中指定要将文件内容映射到哪块内存。对于多个进程打开同一个文件,
   不同的内存映射可以开辟多块内存区域。更新文件内容的顺序依照关闭文件的进程的顺序执行,因此,存在脏读的问题。
2、:-),一定要记住,内存映射是为了加快对文件/设备的访问速度,不是用来进行数据通信的。
转载自:http://bbs.csdn.net/topics/340203684
我对内存映射的理解就是通过操作内存来实现对文件的操作,这样可以加快执行速度,因为操作内存比操作文件的速度快多了!
共享内存,顾名思义,就是预留出的内存区域,它允许一组进程对其访问。
共享内存是system vIPC中三种通信机制最快的一种,也是最简单的一种。对于进程来说,
获得共享内存后,他对内存的使用和其他的内存是一样的。由一个进程对共享内存所进行的
操作对其他进程来说都是立即可见的,因为每个进程只需要通过一个指向共享内存空间的指针就可以来读取
共享内存中的内容(说白了就好比申请了一块内存,每个需要的进程都有一个指针指向这个内存)
就可以轻松获得结果。使用共享内存要注意的问题:共享内存不能确保对内存操作的互斥性。
一个进程可以向共享内存中的给定地址写入,而同时另一个进程从相同的地址读出,这将会导致不一致的数据。
因此使用共享内存的进程必须自己保证读操作和写操作的的严格互斥。
可使用锁和原子操作解决这一问题。也可使用信号量保证互斥访问共享内存区域。
共享内存在一些情况下可以代替消息队列,而且共享内存的读/写比使用消息队列要快!
时间: 2024-10-14 06:22:30

inux内存映射和共享内存理解和区别的相关文章

共享内存和操作共享内存几个函数的用法

简介:共享内存是进程间通信中最简单的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改. 在创建共享内存和操作共享内存的时候被下面这些函数的参数弄糊涂了, 遂写下各个函数的说明. 所需头文件 #include<sys/ipc.h> #include<sys/shm.h> 函数 (1)shmget(key_t key,int size,int

数组逆序=全局内存版 VS 共享内存版

全局内存版 1 #include <stdio.h> 2 #include <assert.h> 3 #include "cuda.h" 4 #include "cuda_runtime.h" 5 #include "device_launch_parameters.h" 6 //检查CUDA运行时是否有错误 7 void checkCUDAError(const char* msg); 8 // Part3: 在全局内存

linux mmap 内存映射【转】

转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc mmap共享内存进程通信 总结 http://www.perfgeeks.com/?p=723 mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间),如此

C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它. 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行操作.物理存储是文件管理,而内存

Linux IPC实践(8) --共享内存/内存映射

概述 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图). 共享内存 VS. 其他IPC形式 用管道/消息队列传递数据 用共享内存传递数据 共享内存生成之后,传递数据并不需要再走Linux内核,共享内存允许两个或多个进程共享一个给定的存储区域,数据并不需要在多个进程之间进行复制,因此,共享内存的传输速度更快! mmap内存映射 将文件/设备空间映射到共享内存区 #incl

利用共享内存映射实现程序只能启动一次的限制

//============================================================================= // // 描述: 程序单次运行检测单元 // 作者: sgao // 日期: 2015-09-25 // 备注: 程序创建的句柄都会在进程结束后自动释放,所以这里没有做关闭句柄操作 // //=========================================================================

C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped

节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它. 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行操作.物理存储是文件管理,而内存映射文件是操作系统级内存管理. 优势:     1.访问磁盘文件上的数据不需执行I/O操作和缓存

进程间通信(IPC)之————共享内存

一. 共享内存 在系统中,两个不同的进程都会维护自己的一块地址空间,这个地址空间一般是虚拟地址,会通过mmu和页表映射到对应的物理内存中,因为不同的进程会有不同的内存空间,因此两个进程之间是无法看见彼此的数据的,而共享内存就是使两个进程看到同一块地址空间,以此来实现不同进程间的数据交互. 值得提出的是,共享内存是进程间通信方式中最高效的一种,因为是直接通过访问内存来交换数据的,省去了消息队列中数据的复制和信号量中进行P.V操作所占用的时间. 二. 共享内存中的函数 共享内存的创建与销毁 创建:

菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t[转]

菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Nov 14th, 2014 1.共享内存 共享内存是Linux下提供的最基本的进程通信方法,它通过mmap或者shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者shmdt系统调用释放这块内存,使用共享内存的好处是多个进程使用同一块内存