首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-03-13 
请问如何在运行时增加内存映射文件的大小,只能先释放然后再重新创建吗?这个内存映射文件用于共享内存。如果

请问如何在运行时增加内存映射文件的大小,只能先释放然后再重新创建吗?
这个内存映射文件用于共享内存。
如果这个内存映射文件总是要增加大小,请问哪种增加内存映射文件大小的方法开销最小。

另外请问,打开一个内存映射文件,这个文件里的数据是立刻全部读入内存吗,还是用到哪部分数据,再进行读写。
因为我的这个内存映射文件比较大,程序又有响应时间要求。有什么办法减少硬盘的读写操作的时间开销。

[解决办法]
不懂,绑定
[解决办法]
之前学操作系统原理时提到是用的时候才载入内存

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

mark一下
[解决办法]
不太明白你想表述什么东西。
平时用文件映射的时候没有动态增加过大小。
两个不同进程在用文件映射共享内存的时候,不需要重新加载吧?第二个进程只不过把文件映射的那部分内存加载到自己的虚拟内存空间而已,没有进行实际的内存复制。
至于你最后说的硬盘读写操作的开销,不是很理解,文件映射跟硬盘文件有什么关系吗?
你的这种问题一定要用文件映射吗?管道或者socket不行吗?或者直接用硬盘文件,能够很好的解决你描述的不断增长空间的问题,但是要牺牲一些效率。
[解决办法]
内存映射文件概述

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

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

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

  需要说明的是,在系统的正常的分页操作过程中,内存映射文件并非一成不变的,它将被定期更新。如果系统要使用的页面目前正被某个内存映射文件所占用,系统将释放此页面,如果页面数据尚未保存,系统将在释放页面之前自动完成页面数据到磁盘的写入。

[解决办法]
它不是直接读入文件,而是建立磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域映射关联
[解决办法]
内存映射文件是将内存和文件关联起来,一开始不需要读入文件的数据,当需要时才读取。如果你要增加大小,系统会把内存映射中的部分写回磁盘,就是换页。
其实内存映射文件比普通文件读写快是直接操作系统的缓存,不需要将文件从系统缓存中拷贝到用户进程的缓存中。
[解决办法]
增加的应该不会对以前的造成冲突。这个增加大小是在原来的后面增加的吧。
[解决办法]
友情帮顶!

热点排行