内存映射连续存储大文件
Ⅰ 为什么要内存映射
内存映射(mmap)是一种内存映射文件的方法,即将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和应用程序进程虚拟地址空间中一段虚拟地址的一一映射关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写藏页面到对应的文件磁盘上。应用程序处理映射部分如同访问主存。(1)线程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域。
先在用户空间调用库函数mmap,并在进程当前进程的虚拟地址空间中,寻找一段空闲的满足要求的连续虚拟地址作为内存虚拟映射区域,对此区域初始化并插入进程的虚拟地址区域链表或树中。
(2)系统在内核空间调用内核函数mmap,实现文件物理地址和进程虚拟地址之间的一一映射关系。
(3)进程发起堆这片映射空间的访问
进程读写操作访问虚拟地址,查询页表,发现这一段地址并不在内存的物理页面上,因为虽然建立了映射关系,但是还没有将文件从磁盘移到内存中。由此发生缺页中断,内核请求从磁盘调入页面。调页过程先在交换缓存空间(swap cache)中查找,若没有则通过nopage函数把缺失页从磁盘调入内存。之后进程会对其做读写操作,若写操作改变了页面内容,一段时间后系统会自动回写脏页面到磁盘中。(修改过的脏页面不会立即更新到文件中,可以调用msync来强制同步,写入文件)
Ⅱ 内存映射文件是怎么回事
内存映射文件,一种将磁盘文件与内存空间建立映射的技术,使进程的虚拟地址空间与磁盘文件的部分或全部内容形成关联。创建映射后,进程可以直接访问映射区域内的数据,无需执行文件I/O操作或进行缓冲处理。
这种技术就像是整个被映射的文件已加载到内存中,特别适合管理大文件,提升处理效率。内存映射文件技术在处理大文件或频繁文件读写时,能显着提高程序运行速度。
通过内存映射,磁盘上的文件所在空间被虚拟化为内存区域,程序访问时采用内存访问方式,省去了传统I/O操作的步骤。真正执行读写时,会将虚拟内存内容换页到物理内存中。
简单来说,内存映射文件利用虚拟内存技术加速处理过程,提供了一种高效访问和操作大文件的方法,提升了程序性能。