面试必备:Binder进程通信原理

面试必备:Binder进程通信原理,第1张

先简单概括性地说说Linux现有的所有进程间IPC方式:

管道(Pipe): 在创建时分配一个page大小的内存,缓存区大小比较有限;

消息队列(Message): 信息复制两次,额外的CPU消耗;不适合频繁或信息量大的通信;

共享内存(Share Memory): 无须复制,共享缓冲区直接附加到进程虚拟地址空间,速度快;但进程间的同步问题 *** 作系统无法实现,必须各进程利用同步工具解决。

套接字(Socket): 作为更通用的接口,传输效率低,主要用于不同机器或跨网络的通信。

信号量(Semaphore): 常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。

信号(Signal): 不适用于信息交换,更适用于进程中断控制,比如非法内存访问、杀死某个进程等。

从4个角度来展开对Binder的分析

(1)从性能的角度

数据拷贝次数: Binder数据拷贝只需要一次,而管道、消息队列、套接字都需要2次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder性能仅次于共享内存。

(2)从稳定性的角度

    Binder是基于C/S架构的,架构清晰明朗,Server端和Client端相对独立,稳定性较好;而共享内存实现方式复杂,没有Client端与Server端之别,需要充分考虑到访问临界资源的并发同步问题,否则可能会出现死锁等问题;从稳定性角度看,Binder架构优越于共享内存。

(3)从安全的角度

    传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而Android作为一个开放的开源体系,手机安全显得额外重要,传统Linux IPC五任何保护措施,完全由上层协议来确保。

    Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。前面提到C/S架构, Android系统中对外只暴露Client端,Client端将任务发送给Server端,Server端会根据权限控制策略,判断UID/PID是否满足访问权限,目前权限控制很多时候是通过d出权限询问对话框,让用户选择是否运行。

    传统IPC只能由用户在数据包里填入UID/PID;另外,可靠的身份标记只有由IPC机制本身在内核中添加。其次传统IPC访问接入点是开发的,无法建立私有通道。从安全角度,Binder的安全性更高。

(4)从语言层面的角度

    大家都知道Linux是基于C语言(面向过程的语言),而Android是基于Java语言(面向对象的语句)。Binder恰恰符合面向对象思想,将进程间通信转化为对某个Binder对象的引用,调用该对象的方法。而其独特之处在于Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程,而它的引用却遍布于系统的各个进程之中。Binder模糊了进程边界,淡化了进程间通信过程,让整个系统仿佛运行于同一个面向对象的程序之中。

    Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SM)以及Binder驱动。其中Server,Client,SM运行于用户空间,驱动运行于内核空间。

ServiceManager与实名Binder

Client获得实名Binder的引用

    Server向SM注册了Binder实体及其名字后,Client就可以通过名字获得该Binder的引用了。

匿名Binder

    并不是所有Binder都需要注册给SM广而告之的。Server端可以通过已经建立的Binder连接将创建的Binder实体传给Client,当然这条已经建立的Binder连接必须是通过实名Binder实现。由于这个Binder没有向SM注册名字,所以是个匿名Binder。Client将会收到这个匿名Binder的引用,通过这个引用向位于Server中的实体发送请求。匿名Binder为通信双方建立一条私密通道,只要Server没有把匿名Binder发给别的进程,别的进程就无法通过穷举或猜测等任何方式获得该Binder的引用,向该Binder发送请求。

     传统IPC方式中,数据是怎样从发送端到达接收端的呢? 通常的做法是: 发送方 将准备好的数据存放在缓存区中,通过系统API调用进入 内核 中。 内核服务程序 在内核空间分配内存,将数据从 发送方 缓存区复制到内核缓存区中。 接收方 读数据是也要提供一块缓存区, 内核 将数据从内核缓存区拷贝到 接收方 提供的缓存区中并唤醒接收线程,完成一次数据发送。这种存储-转发机制有两个缺陷:首先是效率低下,需要做两次拷贝(用户空间->内核空间->用户空间)。Linux使用copy_from_user()和copy_to_user()实现这两个跨空间拷贝。其次是接收数据的缓存要由接收方提供,可接收方不知道到底要多大的缓存才够用。只能开辟尽量打的空间或先调用API接收消息头获得消息体大小,再开辟适当的空间接收消息体。两种做法都有不足,不是浪费空间就是浪费时间。

     Binder采用一种全新策略:由Binder驱动负责管理数据接收缓存。 Binder驱动通过实现mmap()来创建数据接收的缓存空间。

    这样Binder的接收方就有了一片大小为MAP_SIZE的接收缓存区。mmap()的返回值是内存映射在用户空间的地址,不过这段空间是由驱动管理,用户不必直接访问(映射类型为PROT_READ,只读映射)。

参考文献

Android Binder机制原理(史上最强理解,没有之一)

樊昌信

链接:> 提取码:z4fn 复制这段内容后打开百度网盘手机APP, *** 作更方便哦!

若资源有问题欢迎追问~

从电工学电磁感应现象知道,在电磁场里,磁场的任何变化会产生电场,电场的任何变化也会产生磁场。交变的电磁场不仅可能存在于电荷、电流或导体的周围,而且能够脱离其产生的波源向远处传播。理论分析和实验都表明无线电波是横波,电场和磁场在空间是相互垂直的,且都垂直于传播方向。这种在空间以一定速度传播的交变电磁场,就称为电磁波。无线电技术中使用的这一段电磁波称为无线电波。

我们用无线电波和池塘中的波纹做个对比。他们都是能量从源点向四周传播,并逐渐减弱;而不同之处在于,无线电波(当辐射源是各向同性的理想点源时)是在三维空间以球面波的形式传播,传播介质主要是空气等。

1、光纤通信的原理是:在发送端首先要把传送的信息(如话音)变成电信号,然后调制到激光器发出的激光束上,使光的强度随电信号的幅度(频率)变化而变化,并通过光纤发送出去;在接收端,检测器收到光信号后把它变换成电信号,经解调后恢复原信息。

2、随着信息技术传输速度日益更新,光纤技术已得到广泛的重视和应用。在多微机电梯系统中,光纤的应用充分满足了大量的数据通信正确、可靠、高速传输和处理的要求。光纤技术在电梯上的应用,大大提高了整个控制系统的反应速度,使电梯系统的并联群控性能有了明显提高。电梯上所使用的光纤通信装置主要由光源、光电接收器和光纤组成。

以上就是关于面试必备:Binder进程通信原理全部的内容,包括:面试必备:Binder进程通信原理、求樊昌信版通信原理的视频教程,谢谢!、无线电波通信原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10111055.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存