Binder机制原理学习笔记(1)_了解IPC通信及Binder

什么是进程间通信?

进程间通信(IPC,Inter-Process Communication)指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(进程是分配资源最小的单位,而线程是调度的最小单位,线程共用进程资源)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。

Linux中进程通信方式有哪些?

一、信号
信号是Linux进程间异步通信的唯一机制,用于通知进程一个特定的事件并强迫进程执行对应的处理程序,如用户在键盘上按crtl+c,内核会给当前控制台上正在运行的进程发送一个SIGINT的信号,进程收到该信号执行默认处理程序,即终止进程。在代码中信号是一组预定义的无符号整数,用两个字节来保存,所以最多是64个,执行kill -l命令会列出Linux支持的所有的信号。

二、管道
管道是进程之间通信使用的一个单向数据流,部分Unix系统实现了双向数据流即全双工的管道。管道被看做是一个打开的文件,但是文件系统中没有对应的映像,执行pipe()系统调用创建一个新的管道时会返回两个文件描述符,其中一个用于往管道写入数据,一个往管道读取数据,进程只能使用其中的一个文件描述符,注意Linux中不需要关闭另一个没有使用的文件描述符。因为管道的读写基于文件描述符而文件描述符可以在进程创建时传递给子进程,所以管道可以被同一个祖先的多个进程同时使用,使用时需要借助文件加锁机制进行同步。因为管道在文件系统中没有对应的映像,所以一个与创建管道的进程没有任何关系的进程无法获取该管道的文件描述符,即无法打开已经存在的管道。

管道在内核中是一个由16个管道缓冲区组成的环形缓冲区,每个管道缓冲区是一个单独的页框,写进程不断的往缓冲区写入数据,如果当前所在的管道缓冲区剩余空间不足则利用写入下一个管道缓冲区,已经写入待读出的数据称为管道大小;读进程不断的从缓冲区中读取数据,由内核记录下一个待读取的字节所在的管道缓冲区和页框中的偏移量。从管道读取数据时,如果管道的缓冲区为空或者没有包含所请求的字节数时可能阻塞读进程,也可以不阻塞,有多少字节数读取多少,依据创建管道时的配置选项而定,读取过程中如果缓冲区数据已空则会释放对应页框。往管道写入数据时,如果写入字节数小于管道缓冲区大小时需要原子的执行,且不能与其他进程对同一缓冲区的写入操作交叉执行;如果管道没有对应的读进程,写入管道时内核会给该进程发送SIGPIPE信号并终止写入;写入时若管道缓冲区未分配页框会从伙伴系统申请页框。

Linux中执行shell命令时,可以通过"|" ,">" 或者 “<” 利用管道,如执行ls | more命令,就是shell进程创建了一个管道和分别执行ls和more命令的两个子进程,并将返回的两个文件描述符传给子进程,执行ls命令的子进程往管道写入数据,执行more命令的子进程从管道读取数据,如下图所示
Binder机制原理学习笔记(1)_了解IPC通信及Binder_第1张图片
为了解决管道复用的缺陷,Unix系统引入了命名管道,又称FIFO文件。FIFO文件同样通过内核缓冲区在进程间传递数据,同一个进程对同一个FIFO文件只能读或者写,与管道的区别是,FIFO文件有对应的磁盘索引节点,可以在系统的文件目录树中查看,因此命名管道可以被任何进程访问。以数据库服务器上的服务进程和客户端进程通信为例,数据库启动时创建一个FIFO文件,由客户端负责将请求写入该FIFO文件;客户端启动时创建一个专属的FIFO文件,客户端发出请求时告诉服务端该文件的名称,服务端从自己的FIFO文件读取请求后将处理结果写入到客户端对应的FIFO文件中,客户端读取自己的FIFO文件内容并把结果展示在控制台上,示例中服务端和客户端的FIFO文件都是可读可写的。

原文:https://blog.csdn.net/qq_31865983/article/details/89469048

三、Socket套接字
套接字(Socket)是由Berkeley在BSD系统中引入的一种基于网络连接的IPC,是对网络接口(硬件)和网络协议(软件)的抽象。它既解决了无名管道只能在相关进程间单向通信的问题,又解决了网络上不同主机之间无法通信的问题。
原文:https://blog.csdn.net/qq_31865983/article/details/89469048

四、共享内存

  1. 什么是共享内存?
    共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。
    共享内存原理就是两个进程地址通过页表映射到同一片物理地址以便于通信,你可以给一个区域里面写入数据,理所当然你就可以从中拿取数据,这也就构成了进程间的双向通信.。
  2. 优势
    因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。
  3. 缺陷
    共享内存没有任何的同步与互斥机制,所以要使用信号量来实现对共享内存的存取的同步。由于多个进程可以读写共享内存,也导致了数据的不安全性。

原文:https://www.cnblogs.com/wuyepeng/p/9748889.html

Android中进程通信——Binder

Binder承担了绝大部分Android进程通信的职责,可以看做是Android的血管系统,负责不同服务模块进程间的通信。在应用开发中在Server和AIDL中会涉及到Binder跨进程通信。Android系统为什么会设计Binder进行IPC通信呢?因为Android系统中的通信大量使用了跨进程,所以需要高效安全的通信方式,而Linux中常用的进程通信不满足Android的要求:

Binder 共享内存 管道 socket
性能 拷贝一次 拷贝0次 拷贝两次 拷贝两次
特点 基于C/S架构,易用性高 控制复杂,易用性差 基于C/S架构,易用性差 易用性差
安全性 binder机制从协议本身就支持通信双方进行身份校验,为每个APP分配UID 依赖上层协议,访问接入点开放,不安全性 依赖上层协议,访问接入点开放,不安全性 依赖上层协议,访问接入点开放,不安全性

学习:
https://www.bilibili.com/video/BV17Q4y1P7vH
https://blog.csdn.net/happylishang/article/details/62234127
https://www.jianshu.com/p/0d316645d480

你可能感兴趣的:(Android,了解IPC通信及Binder)