Linux进程间通信的方式:

管道(Pipe)
信号(Signal)
消息队列(Message)
共享内存(Share Memory)
套接字(Socket)
中断
Binder

Binder 介绍:

Binder 通信机制是在OpenBinder的基础上实现的,采用CS通信方式。
OpenBinder是一种进程间通信机制,它最初是由Be公司开发的,后来由Palm公司接手开发和维护,最后Google公司对其进行改造,并应用在Android系统中
1、系统服务是用过getSystemService获取的服务,应用程序服务是通过继承Service,程序员自己创建的
2、Android的SDK中提供了aidl工具,该工具可以讲aidl文件转换为一个java类文件;例如我们定义一个IServer.aidl文件,aidl工具会自动生成一个IServer.java的java接口类(包含Stub,Proxy等内部类)。
3、前台进程通过bindService绑定后台服务进程时,onServiceConnected(ComponentName name, IBinder service)传回IBinder对象,并且可以通过IServer.Stub.asInterface(service)获取IServer的内部类Proxy的对象,其实现了IServer接口
4、前台进程实际上市通过Proxy实现的IServer接口方法,将方法名、参数传递给后台服务进程。
5、我们还需要继承Service,创建自己的后台服务进程,并且在其中实现IServer接口类,提供IServer的具体服务。并实现Service的onBind方法。 优点:
1、安全,传统的IPC(套接字、管道、消息队列)的安全机制依赖上层协议;例如:
a、Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。
b、传统IPC的接收方无法获得对方进程可靠的UID/PID(用户ID/进程ID),从而无法鉴别对方身份。   
c、使用传统IPC只能由用户在数据包里填入UID/PID,但这样不可靠,容易被恶意程序利用,故可靠的身份标记只有由IPC机制本身在内核中添加。
d、其次传统IPC访问接入点是开放的,无法建立私有通道。比如命名管道的名称,system V的键值,socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。
2、性能高:传统的IPC(套接字、管道、消息队列)需要拷贝两次内存、Binder只需要拷贝一次内存、共享内存不需要拷贝内存。

信号:

、信号在最早的Unix系统中引入,用于在用户态进程间通信;内核也用信号通知进程系统所发生的事件。
2、信号是很短的消息。
3、信号可以发送到一个进程活着一组进程。
4、信号通常是由前缀SIG的宏标识的数字 使用信号的目的:
1、让进程知道已经发生了一个特定的事件
2、强迫进程执行它自己代码中的信号处理程序。(例如:子进程终止时发送给父进程的信号SIGCHLD)

消息队列:

、分为System V IPC 消息队列和POSIX 消息队列
2、基于文件的应用接口(mqueue的特殊文件系统,一个队列对应一个索引节点)
3、完全支持消息优先级
4、完全支持消息到达的异步通知,通过信号或者线程创建实现
5、用于阻塞发送与接收操作的超时机制。
6、小块数据

管道:

、所有Linux系统都愿意提供的一种进程间通信机制
2、是进程之间的单向数据流;从一个进程写入的所有数据,由内核定向到另一个进程读取;例如(ls | more === ls >temp ; more < temp)前者使用管道,后者使用临时文件
3、被看作打开文件,在文件系统中没有相应的映像。
4、半双工的;PS:Unix系统支持全双工的管道
5、父进程的管道可以通过fork给子进程使用
6、缺点是,除非是同一个父进程创建的管道,否则两个进程无法共享同一个管道。即:无法打开一个已经存在的管道。
7、为了解决上述6中的问题,采用了命名管道

FIFO:

、先进先出,先写入文件的字节总是被最先读出;
2、使用特殊的文件类型,在文件系统中不拥有磁盘块,打开的FIFO总是与内核缓冲区关联(存放多个进程之间交换的数据)。
3、Linux2.6 中 FIFO和管道基本相同,使用相同的数据结构(pipe_inode_info)
区别:
1、FIFO索引节点出现在系统目录树上,而不是pipefs特殊文件系统
2、FIFO是一种双向通信管道;即可以以读、些模式打开一个FIFO,而管道时单向的

共享内存:

套接字:

、android zygote 创建App进程,就是通过监听本地Socket,接收服务进程的命令来实现的
2、使用特殊的文件
3、双向通信
4、不依赖父进程,只要知道套接字名称,就可以使用

中断:

、是一个事件,对应CPU芯片内外部硬件电路产生的电信号。
2、分为同步中断(指令执行结束,CPU控制单元产生并且发出的中断)、异步中断(其他硬件设备按照CPU时钟信号随机产生)
3、分为上半步(接收中断)、下半步(处理中断,比较费时);

android Binder的优点的更多相关文章

  1. Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  2. 图文详解 Android Binder跨进程通信机制 原理

    图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...

  3. [转]Android Binder设计与实现 - 设计篇

    摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...

  4. (转)Android Binder设计与实现 – 设计篇

    原文地址(貌似已打不开):Android Binder设计与实现 – 设计篇 ------------------------------------------------------------- ...

  5. 图解Android - Binder 和 Service

    在 Zygote启动过程 一文中我们说道,Zygote一生中最重要的一件事就是生下了 System Server 这个大儿子,System Server 担负着提供系统 Service的重任,在深入了 ...

  6. Android Binder设计与实现 - 设计篇

    要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具 ...

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

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

  8. Android Binder IPC详解-Android学习之旅(96)

    linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...

  9. ANDROID BINDER机制浅析

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

随机推荐

  1. How to get the value of a form element : check box and radio button

    Getting a radio element and it’s checked value Radio buttons in a form can be grouped together using ...

  2. Web工程中各类地址的写法

    1)总体原则 在java web开发中,只要是url地址,那么最好以“/”开头,也就是绝对路径的方式.那么这个“/”到底代表什么呢? 如果“/”是给服务器用的,则代表当前web工程:如果是给浏览器用的 ...

  3. Servlet学习(二):ServletConfig获取参数;ServletContext应用:请求转发,参数获取,资源读取;类装载器读取文件

    转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件 ...

  4. 【TP3.2+onethink1.0】2个Ueditor 回显数据,第2个会把第1个覆盖

    1.最近在使用onethink1.0 框架进行二次开发,在编辑页面,生成2个ueditor 在数据回显的时候,发现第2个ueditor的数据会覆盖第1个ueditor,咋办? 2.原因: 3.解决方法 ...

  5. 利用jquery修改href的部分字符

    试了好久 就一句代码即可. $(document).ready(function(){ $('a').each(function(){ this.href = this.href.replace('y ...

  6. Alamofire使用报错Extra argument 'method' in call解决办法

    使用Alamofire的时候,在用这句的时候报错了: Extra argument 'method' in call Alamofire.request("", method: H ...

  7. java struts2入门学习---中文验证、对错误消息的分离、结果(result)类型细节配置

    一.需求 利用struts2实现中文验证并对错误消息的抽离. 详细需求:用户登录-->不填写用户名-->页面跳转到用户登录页面,提示用户名必填(以英文和中文两种方式提示)-->填写英 ...

  8. Cobbler自动部署主机系统

    Cobbler自动部署主机系统 简介: Cobbler由python语言开发,是对PXE和 Kickstart以及DHCP的封装.融合很多特性,提供了CLI和Web的管理形式.更加方便的实行网络安装. ...

  9. 【转】细说UI线程和Windows消息队列

    在Windows应用程序中,窗体是由一种称为“UI线程(User Interface Thread)”的特殊类型的线程创建的. 首先,UI线程是一种“线程”,所以它具有一个线程应该具有的所有特征,比如 ...

  10. kubernetes删除pod失败

    一.概述 k8s中删除pod失败,可能是该pod有rc,rs上层控制,而且很有可能,所以删除上层对应的rc,rs,deployment即可: 删除的方法: 1.直接删除rc,rs,deployment ...