- 浏览: 174281 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (186)
- [网站分类]4.其他技术区 (93)
- [网站分类]6.转载区(Java技术文章转载, 请注明原文出处) (4)
- [网站分类]3.非技术区 (7)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (28)
- HTML&CSS (0)
- 感悟生活 (4)
- c#(.net) (1)
- [网站分类]2.Java新手区 (32)
- [网站分类]5.提问区(Java方面的技术提问) (1)
- java (6)
- web前端 (7)
- php (0)
- C++ (1)
- python (0)
- 互联网应用 (0)
最新评论
-
lliiqiang:
请求单线程资源只能等待结果.
Applet 与JS通信 -
feng2qin:
期待你的精彩回到。QQ:864479410
Applet 与JS通信 -
feng2qin:
我想问一句;哥们儿,applet程序中调用js,你真的成功了嘛 ...
Applet 与JS通信 -
lyaixsp:
...
ExtJS 入门学习之 window与panel篇 -
longzijian:
不知道 java-he 现在找到数组的这种特性 的原因在那里
和网友关于javascript数组的讨论
转自:http://www.zxbc.cn/html/20080524/51094.html
与虚拟内存一样,内存映射文件可以用来保留一个地址空间的区域,一旦该文件被映射,就可以访问它,就像整个文件已经加载内存一样。
内存映射文件可以用于3个不同的目的:
1. 系统使用内存映射文件,以便加载和执行exe 和dll文件,这可以大大节省页文件空间和应用程序启动运行所需的时间。
2.可以使用内存映射文件来访问磁盘上的数据文件,这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。
3.可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据,Windows确实提供了其他一些方法,以便在进程之间进行数据通信,但是这些方法都是使用内存映射文件来实现的,这使得内存映射文件成为单个计算机上多个进程互相进行同行的最有效的方法。
一.内存映射文件的函数包括<?XML:NAMESPACE PREFIX = O /?>
CreateFileMapping , OpenFileMapping, MapViewOfFile, UnmapViewOfFile 和 FlushViewOfFile 。
用法如下:
1 . HANDLE CreateFileMapping(
HANDLE hFile, // 一个文件句柄
LPSECURITY_ATTRIBUTE lpAttributes, // 定义内存映射文件对象是否可以被承
DWORD flProtect, // 该内存映射文件的保护类型
DWORD dwMaximumSizeHigh,// 内存映射文件的长度
DWORD dwMaximumSizeLow, //
LPCTSTR lpName // 内存映射文件的名字
)
hFile 指定要映射的文件的句柄,如果这是一个已经打开的文件的句柄( CreateFile 函数的返回值),那么将建立这个文件的内存映射文件,如果这个参数为 -1 ,则建立共享内存。
lpAttribute 安全属性,一般设为 NULL
flProtect 指定映射文件的保护类型,它的取值可以是 PAGE_READONLY (内存页面只读) 或 PAGE_READWRITE (内存页面可读写)。
dwMaximumSizeHigh
和
dwMaximumSizeLow
参数组合指定了一个
64
位的内存映射文件的长度。一种简单的方法是将这两个参数全部设置为
0
,那么内存映射文件的大小将与磁盘文件大小一致。
2 . HANDLE OpenFileMapping(
DWORD dwDesiredAccess, // 指定保护类型
BOOL bIsInheritHandle, // 返回的句柄是否可以被继承
LPCSTR lpName // 创建对象时使用的名字
)
如果创建的是共享内存,其他进程不能再使用 CreateFileMapping 函数去创建同名的内存映射文件对象,而要使用 OpenFileMapping 函数打开已创建好的对象。
dwDesiredAcess 指定保护类型有 FILE_MAP_WRITE 或 FILE_MAP_READ
3 . LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // 前两个函数返回的内存映射文件的句柄
DWORD dwDesiredAcess, // 保护类型 FILE_MAP_READ ,FILE_MAP_WRITE
DWORD dwFileOffsetHight, // 从文件的那个地址开始映射
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap // 要映射的字节数,为 0 则映射整个文件
)
4 . BOOL UnmapViewOfFile( LPCVOID lpBaseAddress )
当不再使用内存映射文件时,可以通过 UmmapViewOfFile 函数撤销映射并使用 CloseHandle 函数关闭内存映射文件的句柄。
5 . BOOL FlushViewOfFile(
LPCVOID lpBaseAddress, // 开始的地址
SIZE_T dwNumberOfBytesToFlush // 数据块的大小
)
如果修改了映射视图中的内存,系统会在试图撤销映射或文件映射对象被删除时自动将数据写到磁盘上,但程序也可以根据需要将视图中的数据立即写到磁盘上。
二.使用步骤
1. 使用 CreateFileMapping 创建一个内存映射文件内核对象,告诉操作系统内存映射文件需要的物理内存大小,这个步骤决定了内存映射文件的用途――究竟是为磁盘上的文件建立内存映射还是为多个进程共享数据建立共享内存。或者使用 OpenFileMapping 打开映射文件内核对象。
2. 映射文件映射对象的全部或一部分到进程的地址空间,可以认为该操作是为文件中的内容分配线型地址空间,并将线型地址和文件内容对应起来,完成该操作的函数是 MapViewOfFile 。
三.使用内存映射文件读文件的具体过程可以这样:
(1) 调用 CreateFile 函数打开想要映射的文件,得到文件句柄 hFile 。
(2) 调用 CreateFileMapping 函数,并传入文件句柄 hFile ,为该文件创建一个内存映射内核对象,得到内存映射文件的句柄 hMap 。
(3) 调用 MapViewOfFile 函数映射整个文件或一部分到进程的虚拟地址空间。该函数返回文件映射到内存后的起始地址。使用指向这个地址的指针就可以读取文件的内容了。
(4) 调用 UnmapViewOfFile 函数来解除文件映射。
(5) 调用 CloseHandle 函数关闭文件对象,必须传入内存映射文件句柄 hMap
(6) 调用 CloseHandle 函数关闭文件对象,必须传入文件句柄 hFile 。
四.进程间共享内存:
共享内存主要是通过映射机制实现的。 Windows 下进程的地址空间是相互隔离的,但在物理上却是重叠的。所谓的重叠是指同一块内存区域可能被多个进程同时使用。当调用 CreateFileMapping 创建命名的内存映射文件对象时, Windows 即在物理内存中申请了一块指定大小的内存区域,返回文件映射对象的新句柄 hMap 。为了能够访问这块区域必须调 MapViewOfiFile 函数,促使 Windows 将此内存空间映射到进程的地址空间中。当在其他进程中访问这块区域时,则必须使用 OpenFileMapping 函数来取得对象句柄 hMap ,并调用 MapViewOfFile 函数得到此内存空间的一个映射。这样一来,系统就把同一块内存区域映射到了不同进程的地址空间中,从而达到共享内存的目的。
一段实例代码:
HANDLE hMapFile = NULL;
FILEMAP* pFileMap = NULL;
g_hFileMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
sizeof(FILEMAP),
g_FileMapFlag);
if (g_hFileMap && ERROR_ALREADY_EXISTS == ::GetLastError())
{
pFileMap = (FILEMAP*)::MapViewOfFile(g_hFileMap, FILE_MAP_READ, 0, 0, 0);
if (pFileMap)
{
ATLASSERT(::IsWindow(pFileMap->hForegroundWnd));
::PostMessage(pFileMap->hForegroundWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
::SetForegroundWindow(pFileMap->hForegroundWnd);
bRet = FALSE;
}
::UnmapViewOfFile(pFileMap);
}
发表评论
-
图象缓冲
2007-02-07 09:45 768图象缓冲的应用双缓冲绘图:<!--<br>& ... -
检验邮箱
2007-02-08 09:46 798<!--<br><br> ... -
批处理命令总结
2007-02-08 16:52 711批处理命令总结:@ 符号后 的命 ... -
学习UML笔记
2007-02-27 17:30 771学习 UML 笔记 前言 为了自己能快速将 UML ... -
blog加上一个同页面浏览者聊天室代码
2007-05-23 10:17 730都是用的别人提供的服务。哈哈。<script type= ... -
常见网页技巧
2007-06-10 16:32 5721.鼠标移动上去,图片变亮,移开又变成灰色。改变的是透明度。 ... -
javascript 数组排序
2007-07-01 03:16 732javascript 数组排序发现一个我原来不知道的事情: ... -
javascript 在客户端绘制图表系列三——xy坐标曲线图
2007-07-01 04:31 1344系列1、2中介绍过的内容在这里不会赘述。原理同面1、2基本一样 ... -
搭建php的运行环境
2007-07-31 18:50 904配置 php 环境 ... -
从网页导出excel
2007-08-09 21:36 743<?xml:namespace ... -
简单日期下拉框
2007-08-09 22:13 854项目中用到一个级联、动态下拉选择日期框。我以前也收集 ... -
php学习笔记1
2007-08-22 22:36 822前面总结过 ... -
php学习笔记2
2007-08-23 23:33 733主要内容:总结了第四章,主要关于字符串处理。参考书籍 ... -
分享一个表格排序程序
2007-08-23 23:46 667应广大网友要求特此分享一个表格排序的程序。有问题,欢迎留言(虽 ... -
AJAX愉快之旅——prototype.js篇
2007-08-24 09:53 611AJAX ... -
Javascript 事件转移
2007-09-19 08:52 748我遇到的Javascript 现 ... -
网页打印脚本
2007-09-19 08:55 1588<html><head><sty ... -
记录访问者IP
2007-09-19 10:46 855<?php //文件名字 $filename = &q ... -
JAVASCRIPT COOKIE初级指南
2007-12-23 23:43 6761、设置COOKIE数据: 最 ... -
PHP读取4种配置文件(php,ini,yaml,xml)
2007-12-23 23:49 869<?php/*** 读取4中配置的表信息,现支持php. ...
相关推荐
在Delphi XE中,内存映射文件是一种高效的数据共享机制,它允许多个进程之间共享数据,而无需通过网络或磁盘I/O进行通信。这种技术尤其适用于需要快速交互的进程间通信(IPC)。以下是对标题和描述中涉及的知识点的...
### 内存映射文件详解 #### 一、概述 内存映射文件是一种高级的数据管理技术,被广泛应用于操作系统及应用程序的设计中。本篇内容基于一份关于“内存映射文件”的学习资料,深入探讨了这一主题的核心概念及其应用...
### vc 内存映射文件知识点详解 #### 一、内存映射文件概念与应用场景 内存映射文件(Memory-Mapped File)是一种特殊的技术手段,主要用于实现文件与内存之间的高效交互。这种技术允许应用程序像访问内存一样直接...
内存映射文件是一种高效处理大文件的技术,尤其适用于需要处理大量数据的应用场景。在Windows操作系统中,内存映射文件利用虚拟内存机制,将磁盘上的文件直接映射到进程的地址空间,允许程序以访问内存的方式操作...
内存映射文件是Windows操作系统提供的一种高效访问大文件的技术,它允许程序将文件直接映射到进程的虚拟地址空间中,使得对文件的操作就像是在操作内存一样。这种技术在处理大文件,特别是需要频繁读取的数据时,比...
Visual C++ .NET 提供了一种高效的方法来解决这个问题,那就是利用内存映射文件(Memory-Mapped Files)。本文将深入探讨如何在Visual C++ .NET环境下使用内存映射文件设计一个能够处理超大文件数据的编辑器。 首先...
利用内存映射文件技术实现进程间通信,自pudn程序员联合开发网下载
内存映射文件(Memory-Mapped File)是C#编程中一种高效的数据访问技术,它允许程序将文件直接映射到进程的虚拟地址空间,从而能够像访问内存一样访问文件内容。这种方式在处理大文件时特别有用,因为它避免了频繁的...
### VC++中使用内存映射文件处理大文件 在计算机编程领域,特别是在处理大量数据时,内存映射技术成为了一种高效的数据访问手段。本文将详细介绍如何在VC++(Visual C++)环境下利用内存映射文件(memory-mapped ...
### 基于内存映射文件技术的海量影像数据快速读取方法 #### 摘要与背景 随着信息技术和传感器技术的迅速发展,遥感图像的数据量呈现几何级数的增长趋势。传统的文件读取方法(如通过文件指针读取文件)仅能正确...
### 基于内存映射文件技术的海量影像数据快速读取方法 #### 摘要与背景 随着信息技术和传感器技术的迅速发展,遥感图像的数据量正在以惊人的速度增长,从早期的几兆到现今动辄数百兆乃至数十GB的规模。这种巨大的...
内存映射文件(Memory-Mapped File)是一种在操作系统层面实现的高效文件处理技术,它允许程序将文件直接映射到进程的虚拟地址空间中,使得文件数据可以像访问内存一样被读写。这种方式大大简化了大文件处理的过程,...
在本实例中,我们将深入探讨如何使用C++和STL库来读取STL文件,特别关注两种不同的读取方法:普通文件解析和内存映射文件解析,并比较它们的性能差异。 首先,我们来看STL文件的基本结构。每个STL文件由多个三角...
### 使用内存映射文件加快文件操作速度 在计算机科学领域,提高文件操作效率一直是系统优化的重要环节之一。本文将深入探讨如何通过使用内存映射文件(Memory-Mapped Files)来加速文件读写过程,特别是在使用VB...
内存映射文件(Memory-Mapped File)是一种在操作系统层面上高效读写大文件的技术,它允许应用程序将文件的内容直接映射到进程的虚拟地址空间中,使得数据的读写如同操作内存一样快速。这种方式在处理大数据量时尤其...
需要注意的是,由于内存映射文件可能跨越多个页,所以部分写操作可能导致整个页被刷新到磁盘,这可能会有性能影响。 5. 关闭映射:完成操作后,使用`unmap`方法释放内存映射,然后关闭文件。这会确保所有未同步的...
在这个例子中:我们为内存映射文件定义文件路径 ( filePath) 和大小 ( )。fileSize在本例中,我们正在处理一个 100 MB 的文件。我们使用创建或打开内存映射文件MemoryMappedFile.CreateFromFile。如果该文件不存在,...
内存映射文件(Memory-Mapped File)是一种在操作系统层面实现高效大数据处理的技术,它允许将文件的内容直接映射到进程的虚拟内存空间中,使得应用程序可以像操作普通内存一样读写文件,从而实现快速的数据存取。...