请问如何在运行时增加内存映射文件的大小,只能先释放然后再重新创建吗?

xiaoyamail 2010-04-28 06:49:02
这个内存映射文件用于共享内存。
如果这个内存映射文件总是要增加大小,请问哪种增加内存映射文件大小的方法开销最小。

另外请问,打开一个内存映射文件,这个文件里的数据是立刻全部读入内存吗,还是用到哪部分数据,再进行读写。
因为我的这个内存映射文件比较大,程序又有响应时间要求。有什么办法减少硬盘的读写操作的时间开销。
...全文
567 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyamail 2010-04-29
  • 打赏
  • 举报
回复
谢谢,后面的问题明白了。但是前面的问题依然不明白。

请问,内存映射文件用于进程间共享内存时,是不是很难改变这个内存映射文件的大小?
我搜了一下别人的提问,可还是不明白。
假设A,B两个进程,共享内存文件c
A和B都为c分配了内存地址空间,A通过某种方法增加了c的大小,是不是对B造成了隐患,c增加的这部分内存地址空间,会不会和B原先的地址空间冲突。

不好意思,描述的不清。简单的讲,就是内存映射文件用于共享内存时,当某个进程发现已经用完了分配的地址空间时,如何增加这个地址空间。
cattycat 2010-04-29
  • 打赏
  • 举报
回复
内存映射文件是将内存和文件关联起来,一开始不需要读入文件的数据,当需要时才读取。如果你要增加大小,系统会把内存映射中的部分写回磁盘,就是换页。
其实内存映射文件比普通文件读写快是直接操作系统的缓存,不需要将文件从系统缓存中拷贝到用户进程的缓存中。
jixingzhong 2010-04-29
  • 打赏
  • 举报
回复
它不是直接读入文件,而是建立磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域映射关联
jixingzhong 2010-04-29
  • 打赏
  • 举报
回复
内存映射文件概述

  内存文件映射也是Windows的一种内存管理方法,提供了一个统一的内存管理特征,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问。通过文件映射这种使磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域建立映射关联的能力,可以直接对被映射的文件进行访问,而不必执行文件I/O操作也无需对文件内容进行缓冲处理。内存文件映射的这种特性是非常适合于用来管理大尺寸文件的。

  在使用内存映射文件进行I/O处理时,系统对数据的传输按页面来进行。至于内部的所有内存页面则是由虚拟内存管理器来负责管理,由其来决定内存页面何时被分页到磁盘,哪些页面应该被释放以便为其它进程提供空闲空间,以及每个进程可以拥有超出实际分配物理内存之外的多少个页面空间等等。由于虚拟内存管理器是以一种统一的方式来处理所有磁盘I/O的(以页面为单位对内存数据进行读写),因此这种优化使其有能力以足够快的速度来处理内存操作。

  使用内存映射文件时所进行的任何实际I/O交互都是在内存中进行并以标准的内存地址形式来访问。磁盘的周期性分页也是由操作系统在后台隐蔽实现的,对应用程序而言是完全透明的。内存映射文件的这种特性在进行大文件的磁盘事务操作时将获得很高的效益。

  需要说明的是,在系统的正常的分页操作过程中,内存映射文件并非一成不变的,它将被定期更新。如果系统要使用的页面目前正被某个内存映射文件所占用,系统将释放此页面,如果页面数据尚未保存,系统将在释放页面之前自动完成页面数据到磁盘的写入。
liujiaji 2010-04-29
  • 打赏
  • 举报
回复
友情帮顶!
xiaoyamail 2010-04-29
  • 打赏
  • 举报
回复
第二,必须告诉系统,数据文件有多少字节要映射到地址空间。这与设定要保留多大的地址空间区域的情况是相同的。可以使用d w N u m b e r O f B y t e s To M a p参数来设定这个值。如果设定的值是0,那么系统将设法把从文件中的指定位移开始到整个文件的结尾的视图映射到地址空间。
------------------------------------------------------------
对,是在后面增加。
如果只有一个进程使用这个映射文件,似乎好解决,再以新的大小重新创建一遍就可以了。
请问,如果多个进程共享这个映射文件,是需要通知所有进程,重新以新的大小再打开一遍这个映射文件吗。
因为,我的程序对时间相应要求高。这么做,原先已经读入内存的数据,岂不是仅仅为了新增加的数据,要全部重新读取一遍吗?
大家都是创建一个足够大的映射文件来解决这个问题吗,遇到这类问题还有其他解决方案吗?
realsupk 2010-04-29
  • 打赏
  • 举报
回复
不太明白你想表述什么东西。
平时用文件映射的时候没有动态增加过大小。
两个不同进程在用文件映射共享内存的时候,不需要重新加载吧?第二个进程只不过把文件映射的那部分内存加载到自己的虚拟内存空间而已,没有进行实际的内存复制。
至于你最后说的硬盘读写操作的开销,不是很理解,文件映射跟硬盘文件有什么关系吗?
你的这种问题一定要用文件映射吗?管道或者socket不行吗?或者直接用硬盘文件,能够很好的解决你描述的不断增长空间的问题,但是要牺牲一些效率。
cattycat 2010-04-29
  • 打赏
  • 举报
回复
增加的应该不会对以前的造成冲突。这个增加大小是在原来的后面增加的吧。
kingstarer 2010-04-28
  • 打赏
  • 举报
回复
之前学操作系统原理时提到是用的时候才载入内存

不过不知道这个原则适不适用于共享内存

mark一下
zhu_nn 2010-04-28
  • 打赏
  • 举报
回复
不懂,绑定

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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