编程学习网 > PHP技术 > php高级 > Binder:IPC进程通信探秘
2020
05-16

Binder:IPC进程通信探秘



进程和线程是开发中极其重要的模块。
除了使用进程、线程来独立完成任务,我们也需要对他们通信的机制进行学习。





操作系统层次看进程

进程的通信方式:

管道

消息队列

共享内存

信号量

Socket



操作系统

操作系统有内核空间、用户进程空间。
所有的用户层的进程都是在用户态,操作系统是位于内核态。

结构

内核态权限高,对于一些接口设备进行管理,用户态也可以通过系统调用(获取权限提升)来访问内核提供的服务。

层次

提升权限的方法,内核空间功能触及核心

系统调用相当于是桥接用户空间和内核空间

进程在操作系统中角色

内核对进程进行管理和调度执行。

进程控制,每个进程都有的头部

组织结构,通过 pid 对进程进行调度执行和控制

资源分配

操作系统内核将一些资源分配给进程,进程又将任务拆分交给线程,不同进程和操作系统空间的关系可以对照不同线程和进程的关系。
需要我们解决  同步  异步  以及进行通信。

管道

通过在内核空间开辟一块共享的缓冲区来进行数据的写入和读取
「一切皆是文件是Linux哲学。」也可以理解管道为一个特殊的文件,通过管道我们可以实现将A进程写入的数据在B进程读取。
理解为特殊的文件,有点类似于复制粘贴的过程。
在Linux中我们获取到文件描述符后就可以打开对应的文件。

文件

消息队列

类似于管道,消息队列是一段发送数据块,另外的进程来接受数据块来进行通信。进行通信时候需要不断IO操作,在不同进程中进行拷贝粘贴。这是很浪费资源的。也是很耗时的。

共享内存

比起消息队列,共享内存的方式,是不同的进程映射到同一块内核中的内存,称之为共享内存。
但是共享内存不会对共享的资源进行访问控制。于是我们有了信号量。

信号量

和线程中的信号量是一个意思,解决的都是对于临界资源的访问控制问题,通过有限的信号量来进行访问控制。
信号量是通过PV操作来控制,P操作就是信号量的请求,V操作是对信号量的释放。


进入正题...


Binder(android中的特色进程通信机制)

原理

Binder在操作系统层面是通过共享内存的方式来进行通信的。具体来说是通过「内存映射」

Binder

理解Binder:操作系统将内存资源分配给独立的进程,每个进程之间的内存空间是独立的不可以相互访问,内核空间可以对进程进行不对称的访问。
Binder中进程都拿出一块内存来交给内核作为共享的内存,然后将这部分共享的内存来连接到进程。这样不同进程间连接到同一块内存。
映射同一块内存后就可以对内存进行一致性的访问,将需要共享的内容对象(Binder对象)放在映射的内存空间中。
常用场景:需要传输的Binder对象在B进程返回,在A端的serviceConnected中获取B的Binder实例,就可以在A端进行调用和通信。
Android中很多的机制都是通过Binder来进行的。
一些Framework层次的服务向client请求进行响应通信都是基于Binder。因为内核和用户应用就是跨进程的。

可传输的Binder对象放在映射的共享内存中,服务端提供客户端使用。

Activity等组件的启动就是在Binder机制和Handler机制的综合运用。

「ActivityThread通过ApplicationThread和AMS进行进程间通讯,AMS以进程间通信的方式完成ActivityThread的请求后会回调ApplicationThread中的Binder方法,然后ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到ActivityThread中去执行,即切换到主线程中去执行,这个过程就是。主线程的消息循环模型」


扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取