linux共享内存(share memory)与直接文件读取的区别

freshman_fantom_ywj 2010-07-19 02:13:45
前提:
linux下的共享内存编程,内存映射用的函数是mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset)

问题:
可以看到内存映射中需要的一个参数是int fd(文件的标识符),可见函数是通过fd将文件内容映射到一个内存空间,我需要创建另一个映射来得到文件内容并统计或修改,这时我创建这另一个映射用的仍是mmap函数,它仍需要用到fd这个文件标识,那我不等于又重新打开文件读取文件里的数据

1.既然这样那同对文件的直接操作有什么区别呢?

2.映射到内存后通过映射的指针addr来修改内容的话是修改共享内存里的内容还是文件的内容呢?

3.解决上面2个问题,我还是想确切知道共享内存有什么用???


不了解的请不要回贴,宁愿没有一条精辟的回复,也不愿百来条路过的留言...谢谢您的合作~~~
...全文
2135 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwunix 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 freshman_fantom_ywj 的回复:]

引用 6 楼 wwwunix 的回复:
引用 2 楼 freshman_fantom_ywj 的回复:

引用 1 楼 wwwunix 的回复:
1、访问共享内存的执行速度比直接访问文件的快N倍(N》10),这对于要求快速输入输出的场合非常有效。
2、通过addr修改的内容是修改的是共享内容中的内容。至于是否修改了文件中的内容,要看文件的类型。对于显示设备等文件来说,修改的也是文件的内……
[/Quote]
我的QQ:7280140
我的MSN:richard.yangmrs@mic.com.tw
我大多数时间用的是Linux系统(64位),目前没有好用的QQ软件。所以,我一般在MSN上。
呵呵,欢迎交流。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wwwunix 的回复:]
引用 2 楼 freshman_fantom_ywj 的回复:

引用 1 楼 wwwunix 的回复:
1、访问共享内存的执行速度比直接访问文件的快N倍(N》10),这对于要求快速输入输出的场合非常有效。
2、通过addr修改的内容是修改的是共享内容中的内容。至于是否修改了文件中的内容,要看文件的类型。对于显示设备等文件来说,修改的也是文件的内容,因为他直接写到了显存中。对于普通文件,在……
[/Quote]

有点头晕!!!

谢谢你啊 ,回答很好很强大 ~

原来我把2个概念搞混了, 什么老师啊,讲进程间通信他讲什么映射,难怪PPT上的共享内存函数shmat跟他讲的函数不一样,他还讲得那么起劲, 真无语啊....

难怪书上把mmap函数放在了文件IO那一章!

感觉好像明白了,我得去熟悉下shmat函数了!!!

大哥,怕别人知道你的QQ去,你也加我的QQ吧!!!
咋们2私聊~~~ 嘿 嘿

我的QQ:339823220
难道你忍心看我每天辛苦的发贴守贴么...
以后有问题直接找你问~ 行不???
wwwunix 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 freshman_fantom_ywj 的回复:]

引用 1 楼 wwwunix 的回复:
1、访问共享内存的执行速度比直接访问文件的快N倍(N》10),这对于要求快速输入输出的场合非常有效。
2、通过addr修改的内容是修改的是共享内容中的内容。至于是否修改了文件中的内容,要看文件的类型。对于显示设备等文件来说,修改的也是文件的内容,因为他直接写到了显存中。对于普通文件,在close文件时,kernel会将数据更新到硬盘等存储设备中。
3……
[/Quote]
对于是修改文件内容的内存映射
1、你的这个说法不确切。举个例子来说:对显示设备文件(显卡)进行内存的映射,并不会在内存中新分配一块内存,而是直接将显存地址通过addr参数传给应用程序。这样应用程序通过内存映射修改文件时,其实就是直接修改显存中的内容(也就是改变显示内容)。
2、感觉你把内存映射和共享内存搞混了。内存映射是用来加快对文件/设备的访问。共享内存是用来在多个进程间进行快速的大数据量的交换。
3、fd是文件描述符。它和内存映射没有直接的关系。只有做过内存映射后,它和映射到的内存才存在对应关系。
对于不修改文件内容的内存映射
1、不一定,可以在程序中指定要将文件内容映射到哪块内存。对于多个进程打开同一个文件,不同的内存映射可以开辟多块内存区域。更新文件内容的顺序依照关闭文件的进程的顺序执行,因此,存在脏读的问题。
2、:-),一定要记住,内存映射是为了加快对文件/设备的访问速度,不是用来进行数据通信的。
最后,再提一下,内存映射和共享内存是两个不同的概念。
内存映射用的系统调用为:
caddr_t mmap(caddr_t addr,size_t len,int prot,int flag,int filedes,off_t off);
int munmap(caddr_t addr,size_t len);
共享内存用的系统调用为:
int shmget(key_t key,int size,int flag);
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
void *shmat(int shmid,void *addr,int flag);
int shmdt(void *addr);
谭海燕 2010-07-20
  • 打赏
  • 举报
回复
如果是大文件,而且还想提高读写速度的话,建议使用内存映射。

参考
http://blog.csdn.net/wishfly/archive/2010/05/21/5613931.aspx
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 steptodream 的回复:]
我应你的要求来看了 可是编程方面的我不会 帮不上
[/Quote]


额 ,没关系 !!!



steptodream 2010-07-20
  • 打赏
  • 举报
回复
我应你的要求来看了 可是编程方面的我不会 帮不上
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwunix 的回复:]
1、访问共享内存的执行速度比直接访问文件的快N倍(N》10),这对于要求快速输入输出的场合非常有效。
2、通过addr修改的内容是修改的是共享内容中的内容。至于是否修改了文件中的内容,要看文件的类型。对于显示设备等文件来说,修改的也是文件的内容,因为他直接写到了显存中。对于普通文件,在close文件时,kernel会将数据更新到硬盘等存储设备中。
3、共享内存主要是为了提高程序的执行速度,方便……
[/Quote]

非常感谢! 清楚了,就是看文件类型来决定是否修改文件内容.

还一个问题:
对于是修改文件内容的共享内存
1.所有的进程对文件操作都是将文件内容映射到一块共享内存,然后在内存里修改,将修改后的内容返回文件吗?

2.所有的进程共享内存操作将这同个文件映射到的是同一块内存空间吗?

3.那我可以理解为fd就是看用来映射到哪一块内存空间的吗?

对于不修改文件内容的共享内存
那就是所有的进程将文件内容映射到一块内存空间然后操作输出,然后文件内容没有修改.
1.同上,映射是不是都通过fd映射到了同一块内存空间?

2.我理解为每个进程对同一文件都随机映射一块内存空间操作...那样岂不很浪费空间啊???

非常谢谢耐心看我贴热心回答我的疑惑!!! 我就是想彻底搞清楚他与直接文件操作的区别,因为他和管道一样的重要~~~
wwwunix 2010-07-19
  • 打赏
  • 举报
回复
1、访问共享内存的执行速度比直接访问文件的快N倍(N》10),这对于要求快速输入输出的场合非常有效。
2、通过addr修改的内容是修改的是共享内容中的内容。至于是否修改了文件中的内容,要看文件的类型。对于显示设备等文件来说,修改的也是文件的内容,因为他直接写到了显存中。对于普通文件,在close文件时,kernel会将数据更新到硬盘等存储设备中。
3、共享内存主要是为了提高程序的执行速度,方便多个进程进行快速的大数据量的交换。

18,773

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧