美文网首页
Binder:IPC进程通信探秘

Binder:IPC进程通信探秘

作者: 壹零二肆 | 来源:发表于2020-04-15 22:02 被阅读0次

    推荐:https://mp.weixin.qq.com/s/4YX8LepbSpzJuWZ3JPuXTg

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


    操作系统层次看进程

    进程的通信方式:

    管道

    消息队列

    共享内存

    信号量

    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中去执行,即切换到主线程中去执行,这个过程就是。主线程的消息循环模型
    分享 点滴 积累

    相关文章

      网友评论

          本文标题:Binder:IPC进程通信探秘

          本文链接:https://www.haomeiwen.com/subject/ewshvhtx.html