Binder是Android平台上一种跨进程交互技术。
在Android应用层次上,基本上已经没有了进程的概念。
但实现层上它还是需要构建在进程之上。Binder通信采用C/S架构,从组件视角来说,包含Client,Server,ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。无论是注册服务还是获取服务的过程都需要ServiceManager,它是整个Binder通信机制的大管家。Client,Server,ServiceManager之间都是通过Binder驱动进行交互的。Binder驱动位于内核空间。Client,Server,ServiceManager位于用户空间。Binder驱动和ServiceManager可以看做事Android平台的基础架构,而Client和Server是Android的应用层。
Binder通信一次拷贝原理,使用mmap内存映射方式实现。虚拟进程地址空间和虚拟内核地址空间都映射到同一块物理内存空间。当Client端与Server端发送数据时,Client先从自己的进程空间把IPC通信数据copy_from_user拷贝到内核空间,而Server端与内核共享数据,不需要再拷贝数据,而是通过内存地址空间偏移量,即可获取内存地址。整个过程只发送一次拷贝。
linux系统除了使用mmap能实现0拷贝,sendfile也可以实现0拷贝,并且比mmap效率还高。
网友评论