博客
关于我
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/

    你可能感兴趣的文章
    PHP:第一章——PHP中的位运算
    查看>>
    phpcms
    查看>>
    phpcms 2008 product.php pagesize参数代码注射漏洞
    查看>>
    phpcms V9 自定义添加 全局变量{DIY_PATH}方法
    查看>>
    Redis五种核心数据结构的基本使用与应用场景
    查看>>
    PHPCMS多文件上传和上传数量限制
    查看>>
    phpEnv的PHP集成环境
    查看>>
    PHPExcel一些基本设置总结
    查看>>
    PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/c...
    查看>>
    PHPMailer发送邮件
    查看>>
    phpmailer发送邮件,可以带附件
    查看>>
    phpmyadmin 安装
    查看>>
    phpmyadmin数据库建表及插入
    查看>>
    phprpc简单使用
    查看>>
    phpstorm中Xdebug的使用
    查看>>
    phpstorm中使用svn版本控制器
    查看>>
    phpstorm配置php脚本执行
    查看>>
    PhpStorm配置远程xdebug
    查看>>
    phpStudy安装教程
    查看>>
    phpunit
    查看>>