博客
关于我
Binder进程间通信系统第一篇-----Binder机制原理简述
阅读量:354 次
发布时间:2019-03-04

本文共 1743 字,大约阅读时间需要 5 分钟。

Binder 跨进程通信机制深入解析

前言

Android 系统采用 Binder 跨进程通信机制,而非传统的 Linux IPC 机制,这一设计选择背后有其独特的逻辑。为了更好地理解 Binder 的工作原理,我们首先需要了解 Linux 系统中传统的进程间通信机制。


Linux传统进程间通信机制

在 Linux 系统中,进程间通信(IPC)主要依赖于以下三个关键机制:

1. 进程隔离

Linux 系统通过进程隔离机制确保不同进程之间无法直接访问彼此的内存空间。每个进程都有自己的独立内存空间,进程间通信必须依赖于特定的 IPC 机制。

2. 进程空间划分

现代操作系统采用虚拟存储机制,将地址空间划分为用户空间(User Space)和内核空间(Kernel Space)。内核空间用于系统核心运行,而用户空间用于应用程序执行。用户空间与内核空间通过系统调用进行交互。

3. 系统调用

系统调用(System Call)是用户空间访问内核空间的唯一途径。通过系统调用,用户程序可以安全地访问系统资源,而内核空间则控制着所有资源的访问权限。

传统 IPC 问题

传统的 IPC 方式存在以下两个主要问题:

  • 数据拷贝次数过多:传统 IPC 通常需要将数据从用户空间拷贝到内核空间,再从内核空间拷贝到接收方用户空间,导致两次数据拷贝。
  • 接收缓存区大小不确定:接收方需要预先分配足够的内存空间,否则只能开辟较大的缓存区或动态调整大小。

  • Binder 跨进程通信原理

    Binder 是 Android 系统中实现进程间通信的核心机制。与传统 IPC 不同,Binder 不依赖于 Linux 内核本身,而是通过动态内核模块(Loadable Kernel Module,LKM)在内核空间运行。这个内核模块被称为 Binder 驱动。

    Binder 驱动的作用

    • Binder 驱动在内核空间为跨进程通信提供支持。
    • 它通过内存映射(mmap)机制实现用户空间和内核空间的高效通信。

    内存映射的优势

    内存映射机制通过 mmap 函数,将用户空间的内存区域与内核空间的一段内存区域建立映射关系。这种映射关系允许用户程序直接在用户空间对映射区域进行读写,而内核空间也能感知用户空间的修改。这种机制显著减少了数据拷贝次数,提升了通信效率。


    Binder 跨进程通信实现

    Binder 通信模型由四个主要组件组成:

  • Client 进程:使用服务的进程。
  • Server 进程:提供服务的进程。
  • ServiceManager 进程:管理 Server 进程的注册和查询。
  • Binder 驱动:在内核空间实现跨进程通信。
  • Binder 通信流程

  • 服务注册

    • Server 进程向 Binder 驱动 发起注册请求。
    • Binder 驱动将请求转发给 ServiceManager 进程。
    • ServiceManager 进程将 Server 进程添加到服务注册表。
  • 服务获取

    • Client 进程向 Binder 驱动 发起获取服务请求。
    • Binder 驱动将请求转发给 ServiceManager 进程。
    • ServiceManager 进程查找对应的 Server 进程并返回信息。
  • 跨进程通信

    • Binder 驱动为通信做准备,通过 mmap 实现内存映射。
    • Client 进程将数据发送到内核缓存区,Binder 驱动将数据直接传递到 Server 进程的用户空间。
  • 数据返回

    • Server 进程将结果写入映射区域。
    • Binder 驱动通知 Client 进程,完成通信。
  • 实现细节

    • 内核缓存区与用户空间缓存区:通过内存映射实现双向通信,减少数据拷贝。
    • 系统调用:Client 和 Server 进程通过系统调用(如 copy_from_user 和 copy_to_user)实现数据转移。
    • 线程池机制:Server 进程使用线程池处理请求,提升处理效率。

    总结

    通过以上分析可以看出,Binder 跨进程通信机制的核心创新在于内存映射技术的应用。这种机制不仅减少了数据拷贝次数,还显著提升了进程间通信的效率。与传统 IPC 相比,Binder 在 Android 系统中的应用展现了其独特的优势。

    转载地址:http://mmme.baihongyu.com/

    你可能感兴趣的文章
    PL SQLDEVELOPMENT导出数据库脚本
    查看>>
    Queue
    查看>>
    PL/SQL Developer中文版下载以及使用图解(绿色版)
    查看>>
    pl/sql developer乱码,日期格式等问题解决
    查看>>
    PL/SQL 中的if elsif 练习
    查看>>
    PL/SQL 存储函数和过程
    查看>>
    query简单入门到精通细节 - (六)Jquery效果之“淡入与淡出”
    查看>>
    PL/SQL提示“ORA-01722:无效数字,将无效数字查找出来
    查看>>
    PL/sql语法单元
    查看>>
    PL/SQL连接远程服务器数据库,出现ORA-12154: TNS: 无法解析指定的连接标识符。
    查看>>
    pl/sql锁
    查看>>
    PL2303 Windows 10 驱动项目常见问题解决方案
    查看>>
    QueryPerformanceCounter与QueryPerformanceFrequency
    查看>>
    Plaid.com的监控系统如何实现与9600多家金融机构的集成
    查看>>
    Plain Stock Prediction:基于RNN的股票价格预测工具
    查看>>
    platform_driver与file_operations两种方法开发led驱动
    查看>>
    PlatON共识方案详解:应用CBFT共识协议,提高共识效率
    查看>>
    QueryDict和模型表知识补充
    查看>>
    Querybase 使用与安装教程
    查看>>
    Playwright与Selenium的对比:谁是更适合你的自动化测试工具?
    查看>>