zoukankan      html  css  js  c++  java
  • android Binder的优点

    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只需要拷贝一次内存、共享内存不需要拷贝内存。

     信号:

    1、信号在最早的Unix系统中引入,用于在用户态进程间通信;内核也用信号通知进程系统所发生的事件。
    2、信号是很短的消息。
    3、信号可以发送到一个进程活着一组进程。
    4、信号通常是由前缀SIG的宏标识的数字

    使用信号的目的:
    1、让进程知道已经发生了一个特定的事件
    2、强迫进程执行它自己代码中的信号处理程序。(例如:子进程终止时发送给父进程的信号SIGCHLD)

    消息队列:

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

    管道:

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

    FIFO:

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

     共享内存:

    1

    套接字:

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

    中断:

    1、是一个事件,对应CPU芯片内外部硬件电路产生的电信号。
    2、分为同步中断(指令执行结束,CPU控制单元产生并且发出的中断)、异步中断(其他硬件设备按照CPU时钟信号随机产生)
    3、分为上半步(接收中断)、下半步(处理中断,比较费时);
  • 相关阅读:
    pixysoft.framework.messageflow enterprise edition 开发实录
    软件工程革命三部曲 — 系统开发分类与重用说明
    vs2010 premium版本 使用小结 更多是问题。。
    报表引擎终于做出来了!!!
    报表引擎终于做出来了!!!!!参考了根兄的文档。
    页面驱动开发(Page Driven) —— 一种大多数人还不认同的技术
    从SOA到云计算 我个人理解
    谈谈Exception,什么时候抛出?什么时候接住? 二
    软件工程革命三部曲 —— 系统开发的业务部分重构在思考。
    Pixysoft.Framework.Reports 开发实录
  • 原文地址:https://www.cnblogs.com/lipeil/p/4895238.html
Copyright © 2011-2022 走看看