Android之通过Binder机制实现IPC和linux的传统IPC的对比分析

一、 Android的Binder机制实现IPC

这里bind机制实现实现IPC模型这里不具体分析,简单理解就是clint-server模型

涉及到4个模块client、server、serverManager、bind底层驱动。

serverManager的作用是将字符形式的Binder(Server创建了Binder实体)名字转化成Client中对该Binder的引用,然后client通过serverManager请求获取server端bind的代理对象,然后进行相关需要操作。

二、 bind机制的优点

1)安全性:

Android会把每个应用进程设置单独的uid,进行标识,故进程的UID是鉴别进程身份的重要标志,安全性高

2)传输效率:

bind机制采用了内存映射,数据拷贝次数只需要一次,效率得到提高

IPC

数据拷贝次数 

共享内存

0

Binder

1

Socket/管道/消息队列

传统linux的IPC,Socket和管道和消息队列用了2个数据拷贝,用户空间 –> 内核缓存区 –> 用户空间,需要2次数据拷贝

发送方进程通过copy_from_user()函数将数据拷贝 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信 

 如果这里不太理解 内存映射的话 可以学习这几篇博客如下:

 从内存映射mmap说开去

 内存映射文件原理探索

 还可以学习下 linux核心编程 书籍,下载地址:https://download.csdn.net/download/bin432/10907802

3) 稳定性:

Binder是基于C/S架构的,这个架构通常采用两层结构,稳定性是没有问题的。共享内存没有分层,难以控制,并发同步访问临界资源时,可能还会产生死锁。从稳定性的角度讲,Binder是优于共享内存的

4)面相对象优势:

Linux是基于C语言,C语言是面向过程的,Android应用层和Java Framework是基于Java语言,Java语言是面向对象的。Binder本身符合面向对象的思想。

三、 Android很多地方用到了bind机制

  • 系统中的各个进程是如何通信的?
  • Android系统启动过程
  • AMS、PMS的原理
  • 四大组件的原理,比如Activity是如何启动的?
  • 插件化原理
  • 系统服务的Client端和Server端是如何通信的?(比如MediaPlayer和MeidaPlayerService) 

    不是所有Android进程间通信都是用bind机制,Zygote进程与AMS通信使用的是Socket,Kill Process采用的是信号 

四、Android和linux常见的IPC机制具体有哪些

1)Android IPC:

Android系统除了支持套接字,还支持序列化、Messenger、AIDL、Bundle、文件共享、ContentProvider、Binder、广播。

ContentProvider为存储和获取数据了提供统一的接口,ContentProvider底层实现也是Binder

2)linux IPC:

管道(pipe)、信号(sinal)、信号量(semophore)、消息队列(Message)、共享内存(Share Memory)、套接字(Socket)

       

    

发布了1043 篇原创文章 · 获赞 630 · 访问量 286万+

猜你喜欢

转载自blog.csdn.net/u011068702/article/details/103359763