APP下载

Linux程式间通讯实现原理(2)内存对映深入分析

消息来源:baojiabao.com 作者: 发布时间:2024-05-14

报价宝综合消息Linux程式间通讯实现原理(2)内存对映深入分析

还记得我之前的《Linux程序间通讯实现原理(1)》这篇文章吗?,今天我们继续来讲Linux程序间通讯实现原理系列。先简单的回顾下。

简单回顾

应用程序在执行起来之后(程序),是相互独立的,都有自己的程序地址空间。但是往往在一些业务上需要程序间的通讯,来完成系统的某个完整的功能。我们来看下程序间通讯能干那些事情?如下:

资料传输。一个程序需要传送资料到另一个程序,这种需求肯定是存在的。共享资料。如果有多个程序想要访问资料,一个程序修改了内容,另一个程序能够立即看到内容变化。资源保护:上面的的操作中存在竞争情况,核心需要提供锁和同步机制。通知:一个程序需要向另一个程序传送讯息,通知发生了某个事件。控制:有些程序需要控制另一个程序的执行。典型的例子就是gdb,可参考之前文章【gdb到底是怎么实现的?】程序间的通讯方式一般可以分为八种,如下:

我们今天就来深入剖析下内存对映的实现原理。

内存对映

我记得在我之前的文章中讲过一次内存对映的实现原理,不知道各位还记不记的。今天为什么还要讲呢?主要是上一次讲的还不够深入。先给个图各位回忆下:

这幅图只是讲解了大致的原理,接下来我们就仔细的研究下,到底是怎么实现的?

内存对映实现原理深入剖析

首先是建立虚拟对映区域,分为下面几个步骤

在当前的虚拟地址空间中,寻找一段满足要求大小的虚拟地址为此虚拟地址分配一个虚拟内存区域(vm_area_struct结构,如图)初始化该虚拟内存区域插入该虚拟内存区域到程序的虚拟地址区域连结串列(也是树)中

然后是实现地址的对映关系(即:程序虚拟地址空间---->>>档案磁盘地址),分为下面几个步骤:

依次通过待对映的档案指标,档案描述符&档案结构体,最终呼叫核心中的mmap()核心空间中的mmap通过虚拟档案系统inode模组 定位到档案磁盘实体地址通过remap_pfn_range()建立页表,实现了档案地址和虚拟地址区域的对映关系。到这里仅仅是建立了虚拟空间和对映地址,没有任何档案资料的拷贝。真正的拷贝时刻是到了程序发生了读写操作。

最后是程序访问对映空间,实现档案内容到实体内存的资料拷贝,如下步骤:

程序的读写操作,访问虚拟地址空间这一段对映地址若程序通过写操作改变了其内容,一定时间后系统会自动回写脏页到对应的磁盘地址,即完成了写入档案的操作。(注意:修改时,脏页面不会立即更新,而是在之后的msync()来强制同步。

总结

使用者空间和核心空间的高效互动;通过对映的区域直接互动的方式资料拷贝次数减少;对档案的读取操作跨过了页快取,减少了资料的拷贝次数档案读取的效率高,用内存的读写方式操作IO读写方式可实现高效的大规模资料传输,借助硬盘空间协助大资料操作时,采用mmap可提高效率

应用场景

在Linux系统中,根据内存对映的原理,它的应用场景如下:

实现内存共享:如跨程序通讯提高资料读写效率;如档案读写操作。

2019-11-02 17:56:00

相关文章