Binder 原理

news2024/11/18 7:28:03

1. Linux 和 Binder 的 IPC 通信原理

进程通信的简单模型如下所示:

进程通信简单模型

1.1 内核空间(Kernel space)和用户空间(User space)

操作系统从逻辑上将虚拟空间划分为用户空间和内核空间。Linux 操作系统将较高的 1GB 供内核使用,称为内核空间,将较低的 3GB 供各进程使用,称为用户空间。

内核空间是 Linux 内核的运行空间,用户空间是用户程序的运行空间。为了保证内核的安全,它们是隔离的,不能直接操作内核,这样,即使用户的程序崩溃了,内核也不会收到影响。内核空间的数据是可以进程间共享的,而用户空间的数据则不可以。

如上图所示,进程 A 的用户空间是不能和进程 B 的用户空间共享的。

1.2 进程隔离

进程隔离指的是一个进程不能直接操作或着访问另一个进程,也就是进程 A 不可以直接访问进程 B 的数据。

1.3 系统调用

用户空间需要访问内核空间,就需要借助系统调用来实现。系统调用时用户空间访问内核空间的唯一方式,保证了所有资源访问都是在内核的控制下进行的,避免了用户程序对系统资源的越权访问,提升了系统的安全性和稳定性。

进程 A 和进程 B 的用户空间可以通过如下系统函数和内核空间交互:

  • copy_from_user:将用户空间的数据复制到内核空间;
  • copy_to_user:将内核空间的数据复制到用户空间;
1.4 内存映射

由于应用程序不能直接操作设备硬件地址,所以操作系统提供了一种机制:内存映射(Memory Map),把设备地址映射到进程虚拟内存区。

例如,用户空间需要读取磁盘的文件,如果不采用内存映射,那么就需要在内核空间建立一个页缓存,页缓存去复制磁盘中的文件,然后用户空间复制页缓存的文件,这就需要两次复制。如果采用内存映射,映射模型如下所示:

内存映射模型

由于新建了虚拟内存区域,那么磁盘文件和虚拟内存区域就可以直接映射,少了一次复制。

在 Linux 中通过系统调用函数 mmap 来实现内存映射。将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反映到内核空间,反之亦然。内存映射能减少数据复制次数,实现用户空间和内核空间的高效互动。

1.5 Linux 的 IPC 通信原理

Linux 的 IPC 通信模型如下所示:

Linux 的 IPC 通信模型

内核程序在内核空间分配内存并开辟一块内核缓存区,发送进程通过 copy_from_user() 函数将数据复制到内核空间的缓冲区。同样,接收进程接收数据时在自己的用户空间开辟一块内核缓存区,然后内核程序调用 copy_to_user() 函数将数据从内核缓存区复制到接收进程。这样数据发送进程和数据接收进程就完成了一次数据传输,也就是一次进程间的通信。

Linux 的 IPC 通信原理有以下两个问题:

  • 一次数据传递需要经历:用户空间 —> 内核缓存区 —> 用户空间,需要两次数据复制,这样效率不高;
  • 接收数据的缓存区由数据接收进程提供,但是接收进程并不知道需要多大的空间来存放将要传递过来的数据,因此只能开辟尽可能大的内存空间或者先调用 API 接收消息头来获取消息体的大小,以免浪费了空间或者时间;
1.6 Binder 的通信原理

Binder 是基于开源的 OpenBinder 实现的,OpenBinder 最早并不是由 Google 公司开发的,而是由 Be Inc 公司开发的,接着由 Palm Inc 公司负责开发。后来 OpenBinder 的作者 Dianne Hackborn 加入 Google 公司,并负责 Android 平台的开发工作,把这项技术也带进了 Android。

Binder 是基于内存映射来实现的,内存映射通常是用在有物理介质的文件系统上,然后 Binder 没有物理介质,它使用内存映射是为了跨进程传递数据的。 Linux 的 IPC 通信模型如下所示:

Linux 的 IPC 通信模型2

Binder 通信的步骤如下所示:

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

整个过程只使用了一次复制,不会因为不知道数据的大小而浪费空间或者是假,这样效率更高。

1.7 使用 Binder 的原因

Android 是基于 Linux 内核的,Linux 提供了很多 IPC 机制,而 Android 自己设计了 Binder 来进行通信,主要原因有以下四个方面。

1.7.1 性能方面

性能方面主要影响的因素是数据复制次数,管道、消息队列、Socket 的复制次数都是两次,性能不是很好,共享内存不需要复制,性能很好,Binder 的复制次数为一次,性能仅次于内存复制。

1.7.2 稳定性方面

Binder 是基于 C/S 架构的,这个架构通常采用两层结构,在技术上已经很成熟了,稳定性也是没有问题的。共享内存没有分层,难以控制,并非同步访问临界资源时,可能还会产生死锁。从稳定性的角度讲,Binder 是优于共享内存的。

1.7.3 安全方面

Android 是一个开源的系统,并且拥有开放性的平台,市场上应用来源很广,因此安全性对 Android 平台而言极其重要。

传统的 IPC 接收方无法获得对方可靠的进程用户 ID/进程 ID(UID/PID),无法鉴别对方身份。Android 为每个安装好的 APP 分配了自己的 UID,通过进程的 UID 来鉴别进程身份。另外,Android 系统中的服务端会判断 UID/PID 是否满足访问权限,而对外只暴露客户端,加强了系统的安全性。

1.7.4 语言方面

Linux 是基于 C 语言的,C 语言是面向过程的,Android 应用层和 Java Framework 是基于 Java 语言的,Java 语言是面向对象的。Binder 本身符合面向对象的思想,因此作为 Android 的通信机制更合适。

从这四个方面来看,Linux 提供的大部分 IPC 机制无法和 Binder 相比较,而共享内存只在性能方面优于 Binder,其他方面都劣于 Binder,这些就是 Android 要使用 Binder 来进行进程间通信的原因,当然系统中并不是所有进程通信都采用了 Binder,而是根据场景选择最合适,比如 Zygote 进程与 AMS 通信使用的是 Socket,Kill Process采用的是信号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

369-HI-R-M-0-0-0-E 数字化转型如何改变DCS和SCADA

369-HI-R-M-0-0-0-E 数字化转型如何改变DCS和SCADA 高瞻远瞩的过程制造商正在投资数字化转型,而DCS和SCADA最终将成为这些努力的一部分。因此,它们与所有其他流程制造技术一起发展。DCS和SCADA系统的变化符合自动化金字塔正在进行的转变,它也…

助力工业数字化!TDengine 与恩菲 MIM+ 工业互联网平台实现兼容性互认

在云计算、物联网、5G等新兴技术快速发展的当下,制造企业想要运用新兴技术实现数字化转型,工业互联网平台的应用和打造是非常关键的转型要素。在工业互联网平台的发展中,数据处理上存在的问题一直都是令企业所头疼的,越来越多的案…

一对一交友App开发指南:从概念到上线的完整路线图

作为现代社交方式的重要组成部分,一对一交友App在满足人们社交需求方面扮演着重要角色。本文将为您呈现一对一交友App的开发指南,从概念到上线的完整路线图,帮助您构建一款成功的交友平台。 概念阶段 在一对一交友App开发的初期&#xff0c…

电子电表和智能电表有什么区别?

随着科技的不断发展,电力计量设备也在不断更新换代。电子电表和智能电表作为两种常见的电力计量设备,虽然在功能和性能上有一定的相似性,但在原理、应用场景等方面存在显著差异。接下来,小编将为大家详细解析电子电表和智能电表的…

linux地址空间

地址空间 内存空间示意图虚拟地址空间虚拟地址进程地址空间生命周期图解为什么要有地址空间呢? 小结 内存空间示意图 进程是在内存中运行的,为了便于管理,不同的数据会存储在不同的区域,因此内存就被分为几部分,如下图…

Java中访问修饰符

类和类之间的关系有如下几种: 以Hero为例自身:指的是Hero自己同包子类:ADHero这个类是Hero的子类,并且和Hero处于同一个包下不同包子类:Support这个类是Hero的子类,但是在另一个包下同包类: GiantDragon 这…

相关性分析——Pearson相关系数+热力图(附data和Python完整代码)

相关性分析:指对两个或多个具有相关性的变量元素进行分析 1.散点图和相关性热力图 2.相关系数 相关系数最早是由统计学家卡尔 皮尔逊设计的统计指标,是研究变量之间线性相关承兑的值,一般用字母 r 表示。 2.1Pearson相关系数 Pearson相关…

蓝桥杯算法竞赛系列第九章·巧解哈希题,用这3种数据类型足矣

你好,我是安然无虞。 文章目录 哈希基础概念哈希相关题目 有效的字母异位词 赎金信 字母异位词分组 两个数组的交集 快乐数 两数之和 四数相加 II 最长连续序列 查找共用字符 同构字符串 单词规律 字节跳动面试:缺失的第一个正数 哈喽哈喽,好…

vr航空博物馆综合展馆趣味VR科普体验

第十期广州科普开放日 10月28日周六上午九点半,广州卓远VR科普基地再次迎来一批前来体验的亲子家庭,陆续到达的市民朋友让整个基地都热闹了起来,他们在这里开启了一场别开生面的VR科普体验。 一期一会,趣味VR科普 10月广州科普开放…

Pinia 是什么?Redux、Vuex、Pinia 的区别?

结论先行: Pinia 是 Vue 官方团队开发的一个全新状态管理库。与 Redux、Vuex 相同,核心都是解决组件间的通信和数据的共享问题。 Pinia 和 Vuex 类似,但使用起来更加简单和直观。因为 Pinia 基于 Vue3 的 Composition 组合式 API 风格&…

【k8s】数据存储

一、数据存储的概念 pod的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。…

【Linux】 OpenSSH_9.3p2 升级到 OpenSSH_9.4p1(亲测无问题,建议收藏)

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

异常处理流程

1.什么是异常源? 引发处理器进入对应的异常模式 2.异常源和异常模式的对应关系 1.五种异常模式,七种异常源 ; 2.根据不同的异常源,引发处理器进入不同的异常模式,执行异常处理函数 3.异常源具有优先级,复…

PLC常用的几种编程语言

PLC的软件编程语言与一般计算机语言相比,具有明显的特点,它既不同于高级语言,也不同于一般的汇编语言,它既要满足易于编写又要满足易于调试的要求。 早期的PLC仅支持梯形图编程语言和指令表编程语言,现根据国际电工委员…

log4j CVE-2021-44228 RCE漏洞复现

一、漏洞特征 Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的…

推荐系统设计与实现 协同过滤推荐算法 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 推荐系统设计与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1…

高效节省IT资源,WorkPlus让企业轻松实现业务场景的快速移动化

在企业的业务移动化进程中,维护iOS、安卓、桌面端不仅需要专业的技术支持,更需要投入大量的IT人力资源。然而,选择WorkPlus作为移动化解决方案,企业可以轻松省去iOS、安卓、桌面端工程师的维护成本,只需借助H5工程师的…

搅拌站排队叫号系统 | 混凝土智慧物流管理平台

思伟软件 智慧物流管理平台 混凝土 用砼行 在线下单。工地通过砼行小程序下单,搅拌站通过砼行APP接单。 智能调度。手机打卡,自动排队。大小车自动分列,拌台生产随时看。电子小票直达司机手机。自动收到砼行APP推送的电子小票与广播发车提…

C 数据类型

C 数据类型 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。 C 中的类型可分为以下几种: 序号类型与描述1基本数据类型 它们是算术类型&#x…

数字化转型:2023零售业的新机遇,亿发零售云系统释放无限可能

零售业的数字化转型不仅能够为顾客带来卓越的购物体验,同时也能为零售企业提供丰富的数据分析、销售预测和生产管理的机会。通过这些分析,企业能够更准确地了解市场需求和消费者的购买行为,进而制定更具针对性的营销策略,从而增强…