Binder跨进程通信

本文为作者学习笔记,如有误,请各位大佬指点

什么是binder?

中文即 粘合剂,意思为粘合了两个不同的进程。

  • 从机制、模型角度来说:

    • binder是一种Android 实现跨进程通信(IPC)的方式,即Binder机制模型
    • 作用是实现跨进程通信。
  • 从模型的结构、组成来说:

    • 是一种虚拟的物理设备驱动,即binder驱动
    • 作用是连接service进程、client进程、service manager进程
  • 从Android代码的实现角度来说:

    • 是一个类,实现了IBinder接口,即Binder类

    • 作用是将binder机制模型以代码的形式实现

基础知识

进程空间划分

  • 一个进程空间分为 用户空间 & 内核空间(Kernel),即把进程内 用户 & 内核 隔离开来,所有进程共用1个内核空间
  1. 进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间
  2. 进程间,内核空间的数据可共享,所以内核空间 = 可共享空间
  • 进程内 用户空间 & 内核空间 进行交互 需通过 系统调用,主要通过函数:
  1. copy_from_user():将用户空间的数据拷贝到内核空间

  2. copy_to_user():将内核空间的数据拷贝到用户空间

在这里插入图片描述

进程隔离 & 跨进程通信( IPC )

  • 进程隔离
    为了保证 安全性 & 独立性,一个进程不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的
  • 跨进程通信( IPC )
    即进程间需进行数据交互、通信
传统的跨进程通信的基本原理
  • 流程
    • 发送进程通过系统调用copy_from_user(),将需要发送的数据拷贝到内核空间中的缓存区
    • 内核服务程序唤醒接收进程的接收线程,通过系统调用copy_to_user()将数据发送到接收进程的用户空间
  • 缺点
    • 效率低,因为要做两次数据拷贝
    • 接收数据的缓存需要接收方提供,它不知道需要多大的缓存,
      • 可以开辟尽量大的空间,但是浪费空间。
      • 可以先调用API接收消息头获得消息体大小,再开辟适当的空间接收消息头,但浪费时间。

在这里插入图片描述

a. 而*Binder的作用则是:连接 两个进程,实现了mmap()系统调用,主要负责 创建数据接收的缓存空间 & 管理数据接收缓存
b. 注:传统的跨进程通信需拷贝数据2次,但
Binder*机制只需1次,主要是使用到了内存映射

Binder 跨进程通信机制 模型

模型原理

Binder跨进程通信机制模型基于 Client - Server 模式

  1. 注册服务(此时,service manager进程就可以拥有service进程的信息)

    1. service进程向binder驱动发起服务注册请求
    2. binder驱动将注册请求转发给service manager进程
    3. service manager进程添加该service进程
    Server进程 创建 一个 Binder 对象
    1Binder 实体是 Server进程 在 Binder 驱动中的存在形式
    2、该对象保存 ServerServiceManager 的信息(保存在内核空间中)
    3Binder 驱动通过 内核空间的Binder 实体 找到用户空间的Server对象
    
  2. 获取服务(client进程就与service进程建立连接)

    1. client向binder发起获取服务的请求,传递要获取的服务名称
    2. binder将请求转发给service manager
    3. service manager查找到client需要的service对应的服务信息
    4. 通过binder将服务信息返回给client进程

    在这里插入图片描述

  3. 使用服务

    1. binder为跨进程通信做准备,实现内存映射(调用mmap()函数)

      在这里插入图片描述

    2. client将参数数据发送到service进程

      在这里插入图片描述

    3. service根据client要求调用目标方法

      在这里插入图片描述

    4. service将目标方法的结果返回给client

      在这里插入图片描述

在这里插入图片描述

Binder驱动的作用&原理

定义:是一种虚拟设备驱动

作用:连接service进程、client进程、service manager进程的桥梁

具体实现原理:内存映射(即内部调用了mmap()函数)

实际用途:创建数据接收的缓存空间、地址映射

Binder跨进程通信的核心原理
  • 流程
    • Binder驱动创建一块 接收缓存区
    • 实现地址映射关系:根据需要映射的接收进程信息,实现内核缓存区接收进程用户空间地址 同时映射到一个共享接收缓存区。
    • 发送进程通过系统调用copy_from_user()发送数据到虚拟内存区
    • 由于内存缓冲区、接收进程的用户空间存在映射关系,所以相当于也发送到了接收进程的用户空间地址。
  • 优点
    • 传输效率高:数据拷贝只有一次、用户空间和内核空间可以直接通过共享对象直接交互
    • 为接收进程分配了不确定大小的接收缓存区

在这里插入图片描述

优点

对比 LinuxAndroid基于Linux)上的其他进程通信方式(管道、消息队列、共享内存、
信号量、Socket),Binder 机制的优点有:

在这里插入图片描述

Binder的优点:

  1. 高性能:能够快速地进行进程间通信
  2. 支持多种数据类型:Binder能够支持多种不同类型的数据传输,包括基本数据类型、复杂对象和文件描述符等。
  3. 低延迟:Binder的通信延迟相对较低,能够满足实时性要求较高的应用场景。

Binder的缺点:

  1. 复杂性:Binder的实现相对复杂,需要深入了解Android系统和底层通信机制。
  2. 仅限于Android:Binder是Android系统特有的进程间通信机制,无法直接在其他操作系统或平台上使用。

Socket的优点:

  1. 跨平台性:Socket是一种通用的网络编程接口,可以跨平台使用,适用于各种操作系统和设备。
  2. 灵活性:Socket可以用于不同类型的网络通信,包括TCP、UDP等,具有较高的灵活性和通用性。
  3. 开放性:Socket的标准接口和协议开放,可以自由选择实现方式和扩展功能。

Socket的缺点:

  1. 需要处理网络细节:使用Socket需要处理网络通信的细节,包括连接管理、数据传输、错误处理等,相对复杂。
  2. 需要网络支持:Socket需要基于网络连接进行通信,无法在没有网络支持的环境下使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值