

下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2008 年 08 月 06 日 星期三 15:121. 用途和基本操作用于不同进程之间的内存共享操作 , 可以将一个物理文件映射到内存当 中然后直接利用分配到的或者打开的命名共享内存的地址空间实现资源共享访 问2. 相关流程1) 新建命名共享内存首先利用 CreateFile 或者 CreateFileForMapping 获得一个用于映射的 物理文件句柄 , 然后利用该文件句柄结合 CreateFileMapping 得到一个命名的 共享内存映射文件句柄2) 打开命名共享内存如果需要共享已经存在的命名共享内存映射文件 , 使用 OpenFileMapping 函数3) 获得地址空间指针进行
2、内存映射文件的读写和一般的文件读写不同 , 是直接面对你申请的 地址空间,为此需要使用 MapViewOfFile 得到相关的地址 LPVOID 类型的指针.如果需要进行文件写入 , 可以通过类型转换直接对于内存地址进行赋 值, 比如 :memcpy( lpAddress, lpBuf, .)这里自然需要防止内存溢出的情况如果是读取操作 , 呵呵将参数顺序调整一下就可以了4) 将内存复制到所映射的物理文件上面FlushM apViewOfFile 函数可以将内存里面的内容 DUM 到物理磁盘上面5) 卸载内存映射文件地址指针UnmapViewOffFile 函数就是卸载6) 关闭内存映射文件太
3、简单了 , CloseHandle 搞定2. 相关背景其实内存映射技术本身没有什么难度 , 关键在于共享内存映射的使用上 面, 特别是进行不同进程之间的同步 , 尤其是如果该内存映射是跨机器的情况 下, 你需要考虑不同的异常情况 .详解 ( 付林林 ) 与虚拟内存一样,内存映射文件用来保留一个地址空间,并提交物理存储 器。早期的内存映射文件并不是提交物理内存供调用者使用,而是提交永久存储器上的文件数据。当然操作系统会为永久存储器保留一个读缓冲区,这样读 取文件数据就快多了。内存映射文件的特点使它很适合于加载EXE 或 DLL 文件。这样可以节省内存又减少了加载所需时间。还可以使用它来映射大容量
4、的 文件,这样就不必在读取文件数据前设置很大的缓冲区。另外内存映射文件常 用于进程间通信,也是进程间通信的主要手段,其它进程之间通信机制都是基 于内存映射文件来实现。为了更快的在进程之间通信,现在的内存映射文件也 可以提交物理内存,这样内存映射文件既可以提交物理内存又可以提交文件。Win dows CE.NET 同样支持无名和有名的内存映射文件。我建议在开发软件的过程中,如果需要读写大容量的文件,或者需要在不同进程内的线程之间通 信,最好采用内存映射文件,而且最好在全局地址空间内(0 x4200 0000 到0 x7FFF FFFF)分配。这会使我们事半功倍。1 映射数据文件第一步:调用 Cr
5、eateFileForMapping 函数。在 Windows CE.NET 中推荐使 用这个函数替代 CreateFile 函数。 CreateFileForMapping 函数由内核执行并 创建文件,它也可以打开由 CreateFile 函数创建的文件。其参数同 CreateFile 相似。参数 1 指定文件路径,注意文件路径的格式是没有盘符的, 参数 2 指定访问方式(读或写),参数 3 指定共享模式,参数 4 指定安全属性 (必须设置为 NULL,参数 5 指定是创建还是打开文件,参数 6 指定文件属 性,参数 7 忽略。具体参数细节参见 WindowsCE.NET 帮助。函数返回创建
6、或者 打开的文件的句柄。第二步:调用 CreateFileMapping 函数。这个函数创建一个无名的或者有 名的内存映射文件对象。参数 1 为文件句柄。这个值由 CreateFileForMapping 函数返回。参数 2 为安全属性(必须设置为 NULL,参数 3 指定要映射的文件 的保护属性(只读或者读写),参数 4 和参数 5 共同用于指定要映射的文件的 大小。文件的容量过大将导致 32 位整数也不能表示,所以这里用 64 位变量表 示,其中参数 4 为高 32 位数,参数 5 为低 32 位数。最后一个参数指定内存映 射文件的名称。这里可以设置为NULL 表示不需要名字。第三步:调用
7、 MapViewOfFile 函数。这个函数用于保留一段足够的地址空 间,并且将永久存储器上的文件数据映射到这个地址空间。映射后这段地址空 间又叫做文件视图,映射范围可以是全部文件,也可以是部分文件。这里需要 注意的是如果文件很大,那这个函数将在全局地址空间内分配地址空间。参数 1 指定内存映射文件对象的句柄,这个值由 CreateFileMapping 函数返回。参 数 2 和 CreateFileMapping 函数中参数 3 很相似,都是用于限定访问权限。参 数 3 和参数 4 共同用于指定映射区域的开始位置。其中参数3 为高 32 位数,参数 4 为低 32 位数。参数 5 指定映射区
8、域的大小。需要注意的是参数 3 和参数 4 指定的 64 位数开始位置可以不是 64KB 的倍数。而其它 Windows 操作系统就必 须限制以 64KB 为单位。另外还要注意的是帮助文档中说不能保证一个文件的映 射视图是连续的,并建议为了防止访问非法,应该加入结构化异常处理机制。 这个可能性我认为很小,一般对于大于 2MB 的虚拟地址空间的申请,内核都会 在全局地址空间中分配。全局地址空间( 0 x4200 0000 到 0 x7FFF FFFF)近 1GB 的空间应该足够用了。毕竟Win dows CE 下的文件都很小。不过在代码中加入结 构化异常处理也不是坏事。我们应该养成凡是读写文件数
9、据时都加入结构化异 常处理的习惯。第四步:进行读 / 写操作。 MapViewOfFile 函数如果成功执行,那么返回映 射视图的首地址。这时就可以把视图当成是一个缓冲区,开始读或写操作了。第五步:执行结束工作。先调用 UnmapViewOfFile 函数撤销文件映射视 图。参数只有一个,指定视图首地址。然后调用 CloseHandle 函数关闭内存映 射文件对象,参数为句柄。最后再次调用 CloseHandle 函数,关闭打开的文件 的句柄。2 进程之间通信进程之间有时需要通信。系统提供的进程之间的通信机制比如COM 剪贴板等,在底层实现上都是利用内存映射文件技术。其实进程之间通信的思路很
10、简单,在这里我顺便讲一下。在其它 Win dows 操作系统中,每个进程独自占有 4GB 的地址空间,高 2GB 是内核的地址空间,而低 2GB 是进程的地址空间。一 个进程所能访问的所有低 2GB 地址都是自己的地址空间,当访问内核地址空间 时就会受到内核的限制。这样一个进程当然无法访问其它进程了。为解决进程 间通信的问题,内存映射文件技术被利用作为解决方案。原来内存映射文件只 映射类似磁盘一类的存储器上的文件。而为了更快速地在进程之间通信,内存 映射文件还可以提交物理内存。实现方法是通过访问同一个内存映射文件对象 (映射到物理内存),两个进程或多个进程就能够访问到同一块物理内存,这 样一个
11、进程写到物理内存的数据,其它进程就能够看到了。而Win dows CE 虽然每个进程只占有 32MB 的地址空间,而且所有进程全部处于 4GB 的地址空间中, 但是彼此还是不能够随意访问的。在 Win dows CE 下除了使用内存映射文件技术 外,还有一种方法也很适合使用,就是利用对象存储。对象存储本身使用 RAM 文件系统,用普通的操作文件的 API 就可以创建、 读取存在于对象存储区域内 的文件。Windows目录就存在于对象存储区域内。我们可以利用在 Windows 目录下创建文件来实现进程间通信。这种方法既实现简单,只需调用几个文件 API 函数,又可以减少通信时间,因为Window
12、s 目录存在于物理内存中,数据 I/O 当然很快了。利用对象存储来实现进程之间的通信是我自己想出来的, MSD 或其它文档并没有这方面的说明。需要注意的就是对象存储区域的大小。 另外从实现的代码量上看也不如内存映射文件技术。下面讲解如何利用内存映射文件实现进程之间的通信。假设进程A 和进程B 需要通信,那么进程 A 需要先创建一个内存映射文件(之前不必调用CreateFileForMapping 函数来创建文件,因为不需要创建文件)。这个内存映 射文件可以是在永久存储器中,也可以是在内存中。为了减小通信时间,最好 提交物理内存。进程 A 在调用 CreateFileMapping 函数时,参数 1 指定为 INVALID_HANDLE_VALU这表示这个内存映射文件对象将要把物理内存提交到 地址空间中。最后一个参数一定要指定一个名字。进程B 也同样调用CreateFileMapping 函数,而且参数相同。内核会根据名字来判断是否已经存 在一个内存映射文件对象,如果创建了就返回原来的对象的句柄。接下去就不 用细说了。参照 5.1 去执行就可以了。要注意的是进程 B 调用 CreateFileMapping 函数后要按如下代码检验函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数据中心的网络构架试题及答案
- 单位员工健康管理制度
- 工地楼层保护管理制度
- 公司会务组织管理制度
- 软件测试的整体质量管理策略试题及答案
- 公司车辆出入管理制度
- 公司商标印制管理制度
- 厨师值班日常管理制度
- 大班教学课堂管理制度
- 基于网络的数据库应用设计试题及答案
- 彩色简约鱼骨图PPT图表模板
- 光引发剂的性能与应用
- PID控制经典PPT
- 图像处理和分析(上册)课后习题答案(章毓晋)
- 油田注入水细菌分析方法+绝迹稀释法
- 韵能cfd风环境模拟stream scstream答疑软件常见q a汇总
- 医师处方权申请
- 简易充电器课程设计
- 部编版语文三年级下册课外阅读
- 门诊疾病诊断证明书模板
- 国家自然科学基金项目依托单位承诺函
评论
0/150
提交评论