android面试题Binder相关

912 阅读6分钟

binder

binder如何进行跨进程通信的

数据发送方通过copy_from_user把数据copy到内核空间,因为内核空间里面的虚拟内存和数据接收方里面的虚拟内存存在一个物理内存的共享,我们的数据接收方就不需要通过copy_to_user去哪数据了,直接在共享的物理内存中就可以拿到

1.Android中进程和线程的关系,区别 进程:一般指一个执行单元,在PC和移动设备上指一个程序或应用。
线程:CPU调度的最小单元。线程是一种有限的系统资源。
两者关系: 一个进程可包含多个线程,即一个应用程序上可以同时执行多个任务。

主线程(UI线程):UI操作
有限个子线程:耗时操作

进程
是系统进行资源分配的独立单元
设计思想:为了允许多个程序同时在内存中运行 进程是程序的一次执行过程。若程序执行两次甚至多次,则需要两个甚至多个进程。
进程是是正在运行程序的抽象。它代表运行的CPU,也称进程是对CPU的抽象。(虚拟技术的支持,将一个CPU变幻为多个虚拟的CPU)
系统资源(如内存、文件)以进程为单位分配。
操作系统为每个进程分配了独立的地址空间\

操作系统通过“调度”把控制权交给进程。

线程
cpu调度的基本单元 设计思想: 在一个进程内也需要并行执行多个程序,实现不同的功能。
进程切换的代价、开销比较大;
在进程内创建、终止线程比创建、终止进程要快。同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。线程之间相互通信无须通过内核(同一进程内的线程共享内存和文件)

进程与线程区别
定义方面:进程是程序在某个数据集合上的一次运行活动;线程是进程中的一个执行路径。(进程可以创建多个线程)
角色方面:在支持线程机制的系统中,进程是系统资源分配的单位,线程是CPU调度的单位。
资源共享方面:进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。
开销方面。进程切换的开销较大。线程相对较小。

2.为何需要进行IPC,多进程通信可能会出现什么问题

为什么要用到多进程? 在Android系统中一个应用默认只有一个进程,每个进程都有自己独立的资源和内存空间,其它进程不能任意访问当前进程的内存和资源,系统给每个进程分配的内存会有限制。如果一个进程占用内存超过了这个内存限制,就会报OOM的问题,很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题,为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如Flash、视频播放页面,频繁绘制的页面等。Android多进程使用很简单,只需要在AndroidManifest.xml的声明四大组件的标签中增加”android:process”属性即可,process分私有进程和全局进程,以“:”号开头的属于私有进程,其他应用组件不可以和他跑在同一个进程中;不以“:”号开头的属于全局进程,其他应用可以通过ShareUID的方式和他跑在同一个进程中;

既然使用到了多进程,就不可避免地需要使用进程间通信了。

但是多进程模式出现以下问题: 1、静态成员和单例模式完全失效 2、线程同步机制完全失效 3、SharedPreferences的可靠性下降 4、Application多次创建

因此为了避免这些问题Android中有多种IPC机制,如AIDL,Messenger,Socket,ContentProvider,但是这些机制底层全部都是用了Binder机制来实现的,什么是Binder?要了解Android系统中的IPC我们首先要了解的就是Binder

3.Android中IPC方式有几种、各种方式优缺点 AIDL socket contentprovider bundle binder Binder是Android系统中的一种IPC进程间通信结构。 Binder的整个设计是C/S结构,客户端进程通过获取服务端进程的代理,并通过向这个代理接口方法中读写数据来完成进程间的数据通信。 Android之所以选择Binder,有2个方面的原因。 1是安全,每个进程都会被Android系统分配UID和PID,不像传统的在数据里加入UID,这就让那些恶意进程无法直接和其他进程通信,进程间通信的安全性得到提升。 2是高效,像Socket之类的IPC每次数据拷贝都需要2次,而Binder只要1次,在手机这种资源紧张的情况下很重要。

4.Binder Driver 如何在内核空间中做到一次拷贝的? 通过内存映射,进行关联,节省了copytouser操作

5.使用Binder进行数据传输的具体过程

首先 Binder 驱动在内核空间创建一个数据接收缓存区; 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系; 发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

**5.Binder框架中ServiceManager的作用*8

主要起到守护线程的职责

6.使用 Binder 传输数据的最大限制是多少,被占满后会导致什么问题

内核空间和数据接收空间是如何实现这个共享的物理内存的,通过mmap,共享物理内存大小是1兆-8k,发送方不能超过这个共享物理内存,同步的情况下是1兆-8k,异步的话是同步内存的一半