Loading AI tools
来自维基百科,自由的百科全书
内存映射文件(Memory-mapped file),或称“文件映射”、“映射文件”,是一段虚拟内存逐字节对应于一个文件或类文件的资源,使得应用程序处理映射部分如同访问主内存。
“Memory-mapped file”的各地常用名称 | |
---|---|
中国大陆 | 内存映射文件 |
台湾 | 记忆体对映档案 |
主要用处是增加I/O性能,特别是用于大文件。对于小文件,内存映射文件会导致碎片空间浪费,[1]因为内存映射总是要对齐页边界,最少耗费4 KiB。故一个5 KiB的文件将会映射占用8 KiB内存,浪费了3 KiB内存。访问内存映射文件比直接文件读写要快几个数量级。
内存映射文件可以只加载一部分内容到用户的逻辑内存空间。这对非常大的文件特别有用。
使用内存映射文件可以避免颠簸:把相当大的文件直接加载到内存时,由于可用内存不足,使得一边读取文件内存,同时把部分已经加载的文件从内存写入硬盘虚存文件中。
有两类内存映射文件:
Persisted文件与硬盘文件相关联,当关闭内存映射时,数据被写入对应的硬盘文件中。适合于很大的文件。[3]
Non-persisted文件并不关联于硬盘文件。当关闭内存映射文件,所有数据被抛弃。适用于创建进程间通信的共享内存。[3]
对于Windows操作系统,不需要调用CreateFile。调用CreateFileMapping时,将INVALID_HANDLE_VALUE作为hFile参数传入,指示创建的文件映射对象不是磁盘上的文件,而是页交换文件。所需分配的存储器大小由CreateFileMapping的dwMaximumSizeHigh和dwMaxinumSizeLow参数决定。
内存映射文件需要在进程的占用一块很大的连续逻辑地址空间。对于Intel的IA-32的4 GiB逻辑地址空间,可用的连续地址空间远远小于2---3 GiB。
相关联的文件的I/O错误(如可拔出驱动器或光驱被弹出,磁盘满时写操作等)的内存映射文件会向应用程序报告SIGSEGV/SIGBUS信号(POSIX环境)或EXECUTE_IN_PAGE_ERROR结构化异常(Windows环境)。通常的内存操作是无需考虑这些异常的。
有内存管理单元(MMU)才支持内存映射文件。
最常见用途是绝大多数操作系统(包括Microsoft Windows与Unix-like系统)用于加载进程。[4]
另一个用途是多个进程的共享内存。
第三个用途是对大文件的读写。
一些可移植的库实现:
Ruby语言的gem(库)Mmap.
Perl的Sys::Mmap[11]或File::Map.[12]
Microsoft .NET的P/Invoke,或者Managed access(参见 Memory-Mapped Files (页面存档备份,存于互联网档案馆)). 或第三方库API.[13]
PHP的库函数file_get_contents()( revision log (页面存档备份,存于互联网档案馆)).
R语言的一个库bigmemory (页面存档备份,存于互联网档案馆)使用了Boost库的实现.
J语言至少自从2005年开始支持内存映射文件。它包括了对盒装的阵列数据和单一数据类型文件的支持。支持可以从'data/jmf'
加载。J的Jdb和JD数据库引擎使用内存映射文件用于列存储。
POSIX函数mmap()[14],创建一个内存映射文件,需要提供文件描述符、开始位置的文件指针、映射长度等参数[15]。 or OpenVMS
Windows API提供了一组函数以实现内存映射文件[16]。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.