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

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

  1. VIRT(虚拟内存)RES(常驻内存)和SHR(共享内存)

    VIRT: 1.进程“需要的”虚拟内存大小,包括进程使用的库.代码.数据,以及malloc.new分配的堆空间和分配的栈空间等: 2.假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长1 ...

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

    全局内存版 #include <stdio.h> #include <assert.h> #include "cuda.h" #include " ...

  3. JNI创建共享内存导致JVM terminated的问题解决(segfault,shared memory,内存越界,内存泄漏,共享内存)

    此问题研究了将近一个月,最终发现由于JNI不支持C中创建共享内存而导致虚拟机无法识别这块共享内存,造成内存冲突,最终虚拟机崩溃. 注意:JNI的C部分所使用的内存也是由JVM创建并管理的,所以C创建了 ...

  4. linux mmap 内存映射【转】

    转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...

  5. ZT 匿名内存映射

    mmap函数使用 分类: Linux/Unix C/C++ 2008-01-22 17:03 6089人阅读 评论(1) 收藏 举报 unix编程null网络 UNIX网络编程第二卷进程间通信对mma ...

  6. linux mmap 内存映射

    mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...

  7. mmap映射文件至内存( 实现 共享内存 与 文件的另类访问 )

    Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...

  8. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  9. 共享内存与存储映射(mmap)

    [前言]对这两个理解还是不够深刻,写一篇博客来记录一下. 首先关于共享内存的链接:共享内存.里面包含了创建共享内存区域的函数,以及两个进程怎么挂载共享内存通信,分离.释放共享内存. 共享内存的好处就是 ...

随机推荐

  1. jquery api 常见 事件操作

    change.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html ...

  2. [转载]在rhel 6 x86_64 上安装oracle 11g xe

    原文地址:在rhel 6 x86_64 上安装oracle 11g xe作者:pccom Oracle 11g xe for linux目前只有x86_64 版本,没有i386, i686 版本,如果 ...

  3. VMWare安装Linux系统之CentOS-6.6操作方法。

    1.使用VMWare创建新的虚拟主机 2.使用VMWare安装Linux,点击“开启虚拟主机” 3.进入Linux安装界面,选择第一项"Install or upgrade an exist ...

  4. c#基础之异常处理及自定义异常 从SQLServer转储数据到MySQL

    c#基础之异常处理及自定义异常 一.什么是c#中的异常? 异常是程序运行中发生的错误,异常处理是程序的一部分.c#中的异常类主要是直接或者间接的派生于 System.Exception类 ,也就是说S ...

  5. regular expression 练习

    练习有一个文件,文件名为output_1981.10.21.txt .下面使用Python: 读取文件名中的日期时间信息,并找出这一天是周几.将文件改名为output_YYYY-MM-DD-W.txt ...

  6. PLSQL_统计信息系列01_统计信息的概念和重要性

    2014-12-18 Created By BaoXinjian

  7. malloc的内存分配原理

    0 堆内存的在计算机内存中的形式 根据<The C Programming language>推测得到堆内存,图中的Heap区域即为堆内存块(Heap区域的数目不代表计算机堆内存的真实数目 ...

  8. oracle启动、关闭

    windows上启动关闭 http://www.cnblogs.com/victor_chou/archive/2009/07/09/1519594.html

  9. SpringSecurityFilter 链

    1. HttpSessionContextIntegrationFilter 位于过滤器顶端,第一个起作用的过滤器. 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个Sec ...

  10. ubuntu14.4开启ftp服务

    1 更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码" ...