原创转载请注明出处:http://agilestyle.iteye.com/blog/2360214
MappedByteBuffer
MappedByteBuffer是java nio引入的文件内存映射方案,读写性能极高。NIO最主要的就是实现了对异步操作的支持。其中一种通过把一个套接字通道(SocketChannel)注册到一个选择器(Selector)中,不时调用后者的选择(select)方法就能返回满足的选择键(SelectionKey),键中包含了SOCKET事件信息。这就是select模型。
SocketChannel的读写是通过一个类叫ByteBuffer(java.nio.ByteBuffer)来操作的.这个类本身的设计是不错的,比直接操作byte[]方便多了. ByteBuffer有两种模式:直接/间接.间接模式最典型(也只有这么一种)的就是HeapByteBuffer,即操作堆内存 (byte[]).但是内存毕竟有限,如果我要发送一个1G的文件怎么办?不可能真的去分配1G的内存;这时就必须使用"直接"模式,即 MappedByteBuffer 文件映射.
先中断一下,谈谈操作系统的内存管理.一般操作系统的内存分两部分:物理内存;虚拟内存.虚拟内存一般使用的是页面映像文件,即硬盘中的某个(某些)特殊的文件.操作系统负责页面文件内容的读写,这个过程叫"页面中断/切换". MappedByteBuffer也是类似的,你可以把整个文件(不管文件有多大)看成是一个ByteBuffer.MappedByteBuffer 只是一种特殊的 ByteBuffer ,即是ByteBuffer的子类。 MappedByteBuffer 将文件直接映射到内存(这里的内存指的是虚拟内存,并不是物理内存)。通常,可以映射整个文件,如果文件比较大的话可以分段进行映射,只要指定文件的那个部分就可以。
三种方式:
FileChannel提供了map方法来把文件影射为内存映像文件: MappedByteBuffer map(int mode,long position,long size); 可以把文件的从position开始的size大小的区域映射为内存映像文件,mode指出了 可访问该内存映像文件的方式:READ_ONLY,READ_WRITE,PRIVATE.
- READ_ONLY,(只读): 试图修改得到的缓冲区将导致抛出 ReadOnlyBufferException.(MapMode.READ_ONLY)
- READ_WRITE(读/写): 对得到的缓冲区的更改最终将传播到文件;该更改对映射到同一文件的其他程序不一定是可见的。 (MapMode.READ_WRITE)
- PRIVATE(专用): 对得到的缓冲区的更改不会传播到文件,并且该更改对映射到同一文件的其他程序也不是可见的;相反,会创建缓冲区已修改部分的专用副本。 (MapMode.PRIVATE)
三个方法:
- force()缓冲区是READ_WRITE模式下,此方法对缓冲区内容的修改强行写入文件
- load()将缓冲区的内容载入内存,并返回该缓冲区的引用
- isLoaded()如果缓冲区的内容在物理内存中,则返回真,否则返回假
三个特性:
调用信道的map()方法后,即可将文件的某一部分或全部映射到内存中,映射内存缓冲区是个直接缓冲区,继承自ByteBuffer,但相对于ByteBuffer,它有更多的优点:
- 读取快
- 写入快
- 随时随地写入
Reference
http://blog.csdn.net/guoshaogang/article/details/7231318
http://www.myexception.cn/program/902559.html
相关推荐
内存映射文件的优势在于它简化了大文件的读写操作,因为所有的I/O操作都在系统级别完成,无需程序员进行手动的缓冲区管理和同步。此外,它还提供了进程间共享数据的能力,多个进程可以映射同一个文件,实现数据的...
此外,现代操作系统采用的页缓存机制也使得内存映射文件能利用缓存的优势,进一步提升性能。 3. **共享数据**: 内存映射文件的一个重要应用是进程间通信(IPC)。不同进程可以映射同一份文件,从而实现数据的共享...
设备驱动程序常常利用内存映射技术来直接访问硬件寄存器或内存映射的设备缓冲区,从而提高I/O效率。 总的来说,Linux的内存映射机制是其高效内存管理的核心,它结合了硬件MMU的能力,为进程提供了一个安全、隔离且...
### C#内存映射教程详解 #### 一、引言 在C#中,内存映射是一种高效的数据共享机制,允许一个或多个进程通过映射同一个文件或物理内存区域到进程地址空间,从而实现进程间的数据共享。这种技术广泛应用于需要进行...
这通常意味着有一个服务端(可能是`MappingServer`程序)创建一个内存映射区,然后将字符串数据放入其中。服务端通过内存映射文件的方式,使得其他客户端进程能够直接访问这个共享的内存空间,获取或修改字符串内容...
Linux内核内存管理的核心在于内存映射,它确保了CPU能够高效、安全地访问内存。在Linux中,尤其是在较早的版本如2.6.20.6中,内存映射通常采用三级映射机制,这在CPU访问内存的过程中扮演着关键角色。内存映射不仅...
6. **性能优化**:讨论内存映射相对于传统I/O方法的性能优势,以及可能的优化策略,比如预读取和缓存策略。 7. **适用场景和限制**:解释哪些类型的摄像头应用适合使用内存映射,以及内存映射可能存在的局限性和不...
本文将深入探讨一种常见的IPC技术——文件内存映射(Memory-Mapped Files),并基于提供的`MemoryMappedFilesA.cpp`和`MemoryMappedFilesB.cpp`文件,解释如何通过这种方式实现两个独立进程之间的通信。 内存映射...
在实际应用中,内存映射文件常用于多进程协作场景,如数据库缓存、日志记录、配置文件共享等。它简化了同步机制,因为对映射区域的读写操作天然地具有原子性,减少了对额外同步原语(如互斥量或信号量)的依赖。然而...
例如,一个进程可能将内存映射文件作为共享数据区,多个进程通过同一映射文件进行数据交换;或者在内存映射文件中实现缓存机制,提高数据读取速度。这些源码可以帮助开发者深入理解内存映射文件的工作原理,并提供...
### 解析基于ARM9的Linux内存映射 #### 引言 随着嵌入式系统的不断发展,ARM9作为一种高性能、低功耗的RISC处理器,在移动设备及嵌入式领域占据了重要地位。ARM9相较于前一代产品如ARM7,不仅提高了主频和支持的...
- QSPI配置,包括时序配置、接收/发送缓存区设置等。 - 内存映射的配置,例如设置外部存储器的地址范围和属性。 - 数据读写的函数,可能包括HAL_QSPI_Read()和HAL_QSPI_Write()。 - 错误处理机制,以应对可能出现的...
内存映射文件是操作系统提供的一种高效访问大文件的技术,它允许程序将文件直接映射到进程的虚拟地址空间中,从而无需通过传统的文件I/O操作来读写文件。在C语言中,Windows API 提供了实现内存映射文件的功能。本文...
Linux下的内存映射函数mmap详解及示例代码 内存映射(Memory Mapping)是一种将文件映射到进程地址空间的机制,允许进程直接访问文件,而不需要使用传统的read和write系统调用,这种机制可以提高文件访问的效率和...
这种方式极大地提升了处理大文件的性能,因为内存映射文件通常利用操作系统级别的缓存机制,减少了对物理内存的直接压力,并且避免了频繁的磁盘读写。 内存映射文件的基础是虚拟内存。虚拟内存是一种内存管理技术,...
文件映射利用了磁盘文件的页高速缓存,而IPC共享内存则创建了一种特殊的内存对象,没有磁盘映像,但同样能实现高效的数据交换。 在编程中,根据具体需求选择使用哪种方式:如果需要进程间共享数据且数据生命周期短...
Java中的内存映射(Memory-Mapped File)是一种高效处理大文件的...因此,在实际应用中,使用内存映射需要谨慎评估系统的内存资源和并发需求,并适当配合其他优化手段,如缓存策略、异步处理等,以实现最佳的性能效果。
本实验旨在帮助你深入理解Linux环境下的内存管理机制,主要包括内存映射(mapping)和解除映射(unmapping),以及如何在内存中打开和读取文件。 一、Linux内存映射 内存映射是Linux提供的一种机制,允许将文件或...
MMIO包括诸如PCI Express内存映射配置空间、PCI设备MMIO BAR、CPU局部APIC、遗留视频缓冲区、内存映射闪存设备、TPM内存映射配置空间等。 而内存映射不包括缓存(如CPU内部缓存)和硬盘设备(如ATA硬盘、SCSI硬盘、...
### Windows 下利用文件映射实现共享内存 #### 概述 在Windows环境下,开发者可以通过文件映射机制来实现进程间的共享内存通信。这种方式类似于Linux下的共享内存操作,但使用的是Windows API提供的功能。通过文件...