MMAP
MMAP
MMAP 是内存映射,相比于传统的 IPC 通信机制有很大效率上的提升:一次拷贝即可,数据使用方可以通过映射的内存空间拿到拷贝的数据。接下来就进行讲解:
虚拟进程地址空间(vm_area_struct)和虚拟内核地址空间(vm_struct)都映射到同一块物理内存空间。当 Client 端与 Server 端发送数据时,Client(作为数据发送端)先从自己的进程空间把 IPC 通信数据 copy_from_user 拷贝到内核空间,而 Server 端(作为数据接收端)与内核共享数据,不再需要拷贝数据,而是通过内存地址空间的偏移量,即可获悉内存地址,整个过程只发生一次内存拷贝。一般地做法,需要 Client 端进程空间拷贝到内核空间,再由内核空间拷贝到 Server 进程空间,会发生两次拷贝。
对于进程和内核虚拟地址映射到同一个物理内存的操作是发生在数据接收端,而数据发送端还是需要将用户态的数据复制到内核态。到此,为何不直接让发送端和接收端直接映射到同一个物理空间,那样就连一次复制的操作都不需要了,0 次复制操作那就与 Linux 标准内核的共享内存的 IPC 机制没有区别了,对于共享内存虽然效率高,但是对于多进程的同步问题比较复杂,而管道/消息队列等 IPC 需要复制 2 两次,效率较低。如下是大致流程图:
借鉴文章:
==https://blog.csdn.net/universus/article/details/6211589==
==关于 mmap:https://www.cnblogs.com/huxiao-tee/p/4660352.html==
评论