1.进程间通讯的原因

目前操作系统都使用虚拟存储技术,管理内存。

假设是32位机器,0-3G是用户空间,3-4G是系统使用。虚拟内存和逻辑内存都按4K分页。这样虚拟内存和逻辑内存就存在对应关系。

一个进程只能操作自己的内存,无法直接访问其他的进程的物理页。

系统进程可以访问所有的物理应用空间。

进程通讯的本质是数据段交互。

2.进程间通讯的方式

操作系统提供一种共享内存的方式来进行通讯。

可以把2个进程的一块虚拟内存,映射为同一个物理地址,这样数据就可以交互,但是不同进程需要自己控制读写,管理起来很麻烦。

还有一种方式就是,共享同一块kernel内存,这样,通过这块kernel可以交互数据,于是我们把kernel当作数据交互的媒介。

3.用户和内核空间的通讯

  1.系统调用:系统调用是内核提供给应用程序的接口。应用对底层硬件的操作大部分都是通过系统来完成的。

  2.netlink,使用socket API就可以进行。

  3.Procfs:是比较老的一种交互方式。

  4.Sysctl:是一种用户应用来设置和获得运行时的内核配置参数的一种有效方式。

4.Android 进程间通信---binder

  Why Binder?

  常见的Linux的进程间通信机制。

  1. 管道:在创建时分配一个page大小的内存,缓存区大小比较有限;
  2. 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
  3. 共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
  4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;
  5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  6. 信号: 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

  Android内核也是基于Linux的,难道那么多的linux社区优秀工程师没有想到binder这样一个优秀的系统吗?事实并非如此。

  五个方面阐述android 使用binder机制原因。

  1.数据拷贝:binder机制只要一次copy,其他机制需要2次copy,只有共享内存不需要copy内存。

  2.稳定性:binder使用经典的C/S架构,client 和Server端相对独立,稳定性好。而共享内存实现方式复杂,同步方式系统不支持,需要自己开发。

  3.安全性:linux的IPC机制,是无法指导UID/PID的。从而无法鉴别身份。Android为每个app分配UID。binder基于C/S架构,当client端连接server端的时候,server端回check权限,在android手机上,就会弹出权限确认的框。

  4.语言层面:linux是基于C语言的,而andriod是基于面向对象的。binder恰恰是面向对象的,将进程间通信,转化为对另一个进程对象的引用。其独特之处,就是binder对象作为一个可以跨进程引用的对象,它的实体位于一个进程中,而它的引用遍布于各个进程中,大家使用同一个进度对象,就像面向对象的类一样,可以供各个系统使用。binder弱化了进程间通信概念,使得调用就像同一个进程一样。这就把进程间的通信演化为面向对象类的调用,所以binder是为android量身定制的。

  5.公司战略考虑。 linux是GPL协议,Google巧妙的把这个协议围在内核层,使得用户层,手机厂商使用Apache-2.0协议,保护了厂商的利益。

  

  一般来说,添加一个IPC机制,需要修改kernel代码,需要liunx分配新的系统编号。所以一般采用虚拟设备的方式,以驱动模块的方式,完成需要在内核完成的功能。

  一般设计可以建立一个伪设备来作为应用与内核之间进行数据交换的渠道。最常用的做法是使用伪字符设备,然后通过icotl,mmap,open,read,write,close这些标准的系统调用和这个设备交互。

  IPC(inter-process communication)概述:

  所有的IPC本质上都是类似的,就是把client端的数据,通过内核空间,传递到另外一个进程Server端。

  

  Binder IPC原理:

  Binder回多一个ServiceManager(c++层)来管理所有的server端。所以server端都需要注册到smgr,而client端就需要从smgr获取server端的IBinder对象。

  

  图中的Client,Server,ServiceManager都是通过binder机制进行通信的,所有也就有Client端 & Server端。

  注册服务:Server 进程要先进行 注册到Smgr,该过程,Server是客户端,Smgr是服务端。(注册的是什么?)

  获取服务:Client 进程要获取Server,需要获取相应的service。(获取的是什么?)该过程:Client端是客户端,Smgr是服务端。

  使用服务:Client端得到与Server的信息,建立与Server的通路。这样Client就可以和Server进行通信。

  C/S模式:

  BpBinder:  BpBinder,transact,发送事物信息。

  BbBinder:  BbBinder,onTransact,接收事物信息。

参考文献:

http://gityuan.com/2015/10/31/binder-prepare/          

Android binder机制---概述的更多相关文章

  1. Android广播机制概述

    1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...

  2. 【转】Android - Binder机制

    以下几篇文章是分析binder机制里讲得还算清楚的 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通servic ...

  3. Android Binder机制彻底梳理二

    根据AIDL了解整体调用流程[重点分析AIDL流程]: 在上一次https://www.cnblogs.com/webor2006/p/11741743.html中我们已经对Android Binde ...

  4. 浅谈android binder机制

    binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...

  5. Android Binder机制简单了解

    Binder -- 一种进程间通信(IPC)机制, 基于OpenBinder来实现 毫无疑问, 老罗的文章是不得不看的 Android进程间通信(IPC)机制Binder简要介绍和学习计划 浅谈Ser ...

  6. android binder机制之——(创建binder服务)

      Binder机制编程 前面的几篇文章具体介绍了android中binder机制的方方面面,相信你对binder机制已经有了较深刻的理解.俗话说得好"学以致用",以下我们就通过在 ...

  7. Android Binder机制详解:手写IPC通信

    想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...

  8. android binder机制详解

    摘要 Binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析Binder机制,有两点原因:1是目前网上已经有2篇很好的文章了,2 ...

  9. ANDROID BINDER机制浅析

    Binder是Android上一种IPC机制,重要且较难理解.由于Linux上标准IPC在灵活和可靠性存在一定不足,Google基于OpenBinder的设计和构想实现了Binder. 本文只简单介绍 ...

随机推荐

  1. #Laravel 笔记# 多语言化 App::setLocale() 持久化。

    App::getLocale();获取当前语言 App::setLocale();设置语言配置文件 语言配置文件config/app.php locale 是默认语言,fallback_locale为 ...

  2. java加减的二进制实现

    Java中整数基本类型有byte,short,int,long,大小分别为1.2.4.8个字节,一个字节大小为8位,也就是8个二进制码(0/1)组成. 计算机中二进制码分为原码,反码,补码.在计算机中 ...

  3. STM32使用cube生成的程序后在keil5编译后首次SWD可以下载再次下载不行的解决办法。

    使用cube配置导出工程在keil5编译后首次SWD下载可以再次下载不行的解决办法. 1原因: cube使用的是HAL库,初始化语句里面禁用了调试功能. 在stm32f1xx_hal_msp.c中 _ ...

  4. 【AngularJS】学习资料

    1. http://www.cnblogs.com/lcllao/tag/AngularJs/ http://www.ituring.com.cn/article/13474 http://www.a ...

  5. [PS相关]DAS,NAS,SAN三种存储技术比较

    随着数据量一直在快速增长,存储技术也在快速的更新以满足需求和推动创新.当存储被提到的时候,它不仅仅局限于存储容量,还有其他的需求比如数据保护,数据备份,数据访问速度等等. NAS-网络存储设备(Net ...

  6. CVTE后台开发实习生岗位面试经验(2017.3)

    3月份我在看准网发布过这篇面经,现在转过来.原文链接:http://www.kanzhun.com/gsmsh10433357.html 投递岗位是web后台实习生 做完笔试后一天对方即发来面试通知 ...

  7. ue4 C++ 导入图片

    void SDrawHouseTypeTools::OnButtonClickLoadImage() {        // 当前如果是在硬装模块,则可进行导入户型操作        FHardEdM ...

  8. swift3.0 UITableView侧滑支持多选项

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableVie ...

  9. recycleView 使用指南1

    最近看了很多 recycleView 的使用文章,一直晕乎乎的,完全不知道套路是啥.很多人都是直接上代码,但是却没有详细说明代码的使用,于是打算自己写写,理理思路.顺便帮助那些正在学习 android ...

  10. [BZOJ 1058][ZJOI 2007]报表统计 平衡树+线段树

    考试的时候看见这道题,感觉自己能AC掉,然后就冲着正解去了.然后想了想数据结构,应该是平衡树.然而蒟蒻的我忘了平衡树怎么打了..然后就根据自己的记忆和理解打了出来.然后我简单的以为相邻的用个链表就能解 ...