网上科普有关“面试必备:Binder进程通信原理”话题很是火热,小编也是针对面试必备:Binder进程通信原理寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。
先简单概括性地说说Linux现有的所有进程间IPC方式:
管道(Pipe): 在创建时分配一个page大小的内存,缓存区大小比较有限;
消息队列(Message): 信息复制两次,额外的CPU消耗;不适合频繁或信息量大的通信;
共享内存(Share Memory): 无须复制,共享缓冲区直接附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决。
套接字(Socket): 作为更通用的接口,传输效率低,主要用于不同机器或跨网络的通信。
信号量(Semaphore): 常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。
信号(Signal): 不适用于信息交换,更适用于进程中断控制,比如非法内存访问、杀死某个进程等。
从4个角度来展开对Binder的分析
(1)从性能的角度
数据拷贝次数: Binder数据拷贝只需要一次,而管道、消息队列、套接字都需要2次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder性能仅次于共享内存。
(2)从稳定性的角度
Binder是基于C/S架构的,架构清晰明朗,Server端和Client端相对独立,稳定性较好;而共享内存实现方式复杂,没有Client端与Server端之别,需要充分考虑到访问临界资源的并发同步问题,否则可能会出现死锁等问题;从稳定性角度看,Binder架构优越于共享内存。
(3)从安全的角度
传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而Android作为一个开放的开源体系,手机安全显得额外重要,传统Linux IPC五任何保护措施,完全由上层协议来确保。
Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。前面提到C/S架构, Android系统中对外只暴露Client端,Client端将任务发送给Server端,Server端会根据权限控制策略,判断UID/PID是否满足访问权限,目前权限控制很多时候是通过弹出权限询问对话框,让用户选择是否运行。
传统IPC只能由用户在数据包里填入UID/PID;另外,可靠的身份标记只有由IPC机制本身在内核中添加。其次传统IPC访问接入点是开发的,无法建立私有通道。从安全角度,Binder的安全性更高。
(4)从语言层面的角度
大家都知道Linux是基于C语言(面向过程的语言),而Android是基于Java语言(面向对象的语句)。Binder恰恰符合面向对象思想,将进程间通信转化为对某个Binder对象的引用,调用该对象的方法。而其独特之处在于Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程,而它的引用却遍布于系统的各个进程之中。Binder模糊了进程边界,淡化了进程间通信过程,让整个系统仿佛运行于同一个面向对象的程序之中。
Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SM)以及Binder驱动。其中Server,Client,SM运行于用户空间,驱动运行于内核空间。
ServiceManager与实名Binder
Client获得实名Binder的引用
Server向SM注册了Binder实体及其名字后,Client就可以通过名字获得该Binder的引用了。
匿名Binder
并不是所有Binder都需要注册给SM广而告之的。Server端可以通过已经建立的Binder连接将创建的Binder实体传给Client,当然这条已经建立的Binder连接必须是通过实名Binder实现。由于这个Binder没有向SM注册名字,所以是个匿名Binder。Client将会收到这个匿名Binder的引用,通过这个引用向位于Server中的实体发送请求。匿名Binder为通信双方建立一条私密通道,只要Server没有把匿名Binder发给别的进程,别的进程就无法通过穷举或猜测等任何方式获得该Binder的引用,向该Binder发送请求。
传统IPC方式中,数据是怎样从发送端到达接收端的呢? 通常的做法是: 发送方 将准备好的数据存放在缓存区中,通过系统API调用进入 内核 中。 内核服务程序 在内核空间分配内存,将数据从 发送方 缓存区复制到内核缓存区中。 接收方 读数据是也要提供一块缓存区, 内核 将数据从内核缓存区拷贝到 接收方 提供的缓存区中并唤醒接收线程,完成一次数据发送。这种存储-转发机制有两个缺陷:首先是效率低下,需要做两次拷贝(用户空间->内核空间->用户空间)。Linux使用copy_from_user()和copy_to_user()实现这两个跨空间拷贝。其次是接收数据的缓存要由接收方提供,可接收方不知道到底要多大的缓存才够用。只能开辟尽量打的空间或先调用API接收消息头获得消息体大小,再开辟适当的空间接收消息体。两种做法都有不足,不是浪费空间就是浪费时间。
Binder采用一种全新策略:由Binder驱动负责管理数据接收缓存。 Binder驱动通过实现mmap()来创建数据接收的缓存空间。
这样Binder的接收方就有了一片大小为MAP_SIZE的接收缓存区。mmap()的返回值是内存映射在用户空间的地址,不过这段空间是由驱动管理,用户不必直接访问(映射类型为PROT_READ,只读映射)。
参考文献
Android Binder机制原理(史上最强理解,没有之一)
两个进程在进行互斥操作中的P操作和V操作的物理意义是什么?
生产者是能利用简单的无机物合成有机物的自养生物或绿色植物。能够通过光合作用把太阳能转化为化学能,或通过化能合成作用,把无机物转化为有机物不仅供给自身的发育生长,也为其他生物提供物质和能量,在生态系统中居于最重要地位。
自养型生物在生态系统中都是生产者,是生态系统的主要成分,注意的是,除了绿色植物外,能进行化能合成作用的细菌(硝化细菌等)也都是生产者。
消费者
科学定义:食物链的中的一个环节
从生物上讲,消费者也是自然界中的一个生物群落,异养型生物,包括食草动物和食肉动物,称为消费者。顾名思义,这些消费者不能直接利用太阳能来生产食物,只能直接或间接地以绿色植物为食获得能量,根据不同的取食地位,又可以分为直接依赖植物的枝、叶、果实、种子和凋落物为生的一级消费者,如蝗虫、野兔、鹿、牛、马、羊等食草动物;以草食动物为食的肉食动物为二级消费者,如黄鼠狼、狐狸、青蛙等;肉食动物之间存在着弱肉强食的关系,其中的强者成为三级和四级消费者。这些高级的消费者是生物群落中最凶猛的肉食动物,如狮、虎、鹰和水域中的鲨鱼等。有些动物既食植物又食动物,称为杂食动物,如某些鸟类和鱼类等。消费者在生态系统的物质和能量转化过程中处于中间环节。
食物链反映的是生产者与消费者之间的吃与被吃这种关系,即捕食与被捕食的关系.食物链和食物网中的各生物由于食物关系而形成相互联系,它们相互依赖、相互制约.如食物链或食物网中任何一种生物的数量发生变化,都会影响其他生物的生存.因为其中某成分的变化,往往会引起其他成分发生相应的变化,甚至引起整个生态系统的变化,另外生物与生物之间的关系还有合作,即生物之间相互利用、互惠互利的关系;竞争是生物之间为某种利益相互争夺等关系
进程同步机制应遵循的原则
进程管理
l 程序顺序执行与并发执行比较
顺序执行
并发执行
程序顺序执行
间断执行,多个程序各自在“走走停停”种进行
程序具有封闭性
程序失去封闭性
独享资源
共享资源
具有可在现性 来源:http://www.clcgzw.com/cshi/202412-37.html
失去可再现性
有直接和简接的相互制约
l 多道程序设计概念及其优点
1. 多道程序设计:是在一台计算机上同时运行两个或更多个程序。
2. 多道程序设计的特点:多个程序共享系统资源、多个程序并发执行
3. 多道程序设计的优点:提高资源利用率、增加系统吞吐量
l 什么是进程,进程与程序的区别和关系
1. 进程的引入:
由于多道程序的特点,程序具有了并行、制约和动态的特征,就使得原来程序的概念已难以刻划和反映系统中的情况了。
2. 进程:程序在并发环境下的执行过程。
3. 进程与程序的主要区别:
1) 程序是永存的,进程是暂时的
2) 程序是静态的观念,进程是动态的观念
3) 进程由三部分组成
程序
数据
进程控制块(描述进程活动情况的数据结构)
4) 进程和程序不是一一对应的
一个程序可对应多个进程即多个进程可执行同一程序 一个进程可以执行一个或几个程序4. 程序与进程的类比
程 序
进 程
唱歌的曲谱或音乐乐器的乐谱
演出或演奏
剧本
演出
菜谱
烹调
5. 进程特征:动态性、并发性、调度性、异步性、结构性
l 进程的基本状态及其转换
1. 进程基本状态:
1) 运行态(Running):进程正在占用CPU;
2) 就绪态(Ready):进程具备运行条件,但尚未占用CPU;
3) 阻塞态(Blocked):进程由于等待某一事件不能享用CPU。
2. 进程状态转换:
l 进程是由哪些部分组成, 进程控制块的作用
1. 进程的组成:由程序、数据集合和PCB三部分组成。
2. 进程控制块的作用:进程控制块是进程组成中最关键的部分。
1) 每个进程有唯一的PCB。
2) 操作系统根据PCB对进程实施控制和管理。
3) 进程的动态、并发等特征是利用PCB表现出来的。
4) PCB是进程存在的唯一标志。
l PCB组织方式
线性队列、链接表、索引表
l UNIX进程管理命令:
l UNIX进程管理命令:
1. ps--显示进程状态
功能:检查系统中当前存在的进程状态。
例如
$ ps 显示与控制中断相关进程的基本信息
2. sleep--使进程睡眠
功能:使进程暂停执行一段时间,其参数单位是秒。
例如
$ sleep 60 将等待60秒后,才重新回到$提示符
3. &--后台命令符
功能:命令行末尾加上&字符,此命令进程将在后台执行。
例如
$ ls –l/usr& 创建一个显示目录命令进程,它在后台执行,即没有前台进程运行时它才得以运行
4. wait--等待后台进程结束
功能:等待后台进程结束。
例如
$ wait 2080 等待PID为2080的后台进程终止
5. kill--终止进程
功能:终止一个进程执行。
例如 (在超级用户方式下)
# kill 678 停止PID为678的进程运行
6. nice--设置优先级
功能:是以不同的优先级执行一条命令
例如
普通用户只能降低优先级:
$ nice –n 10 cc f1.c 执行cc f1.c命令时的nice值为30(即20+10)
超级用户(root)可以提高进程的优先级(即:增量值可取不小于-20的负数)
# nice -n -10 vi abc 执行vi abc (编辑命令)的nice值为10(即20-10)
l 进程的同步与互斥
1. 同步:是进程间共同完成一项任务时直接发生相互作用的关系。
2. 互斥:排它性访问即竞争同一个物理资源而相互制约。
l 什么是临界资源、临界区?
1. 临界资源:一次仅允许一个进程使用的资源。
2. 临界区:在每个进程中访问临界资源的那段程序。
3. 互斥进入临界区的准则:
1) 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
2) 任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
3) 进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
4) 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。
l 信号量
1. 信号量定义:
信号量(信号灯)=<信号量的值,指向PCB的指针>
2. 信号量的物理意义:
大于0:表示当前资源可用数量
1) 信号量的值 来源:http://www.clcgzw.com/cshi/202502-152.html
小于0:其绝对值表示等待使用该资源的进程个数
2) 信号量初值为非负的整数变量,代表资源数。
3) 信号量值可变,但仅能由P、V操作来改变。
l P,V操作原语
1. P操作原语P(S) : 来源:http://www.clcgzw.com/cshi/202412-2.html
1) P操作一次,S值减1,即S=S-1(请求分配一资源);
2) 如果S≥0,则该进程继续执行;
如果S<0表示无资源,则该进程的状态置为阻塞态,把相应的PCB连入该信号量队列的末尾,并放弃处理机,进行等待(直至另一个进程执行V(S)操作)。
2. V操作原语(荷兰语的等待)V(S) :
1) V操作一次,S值加1,即S=S+1(释放一单位量资源);
2) 如果S>0,表示有资源,则该进程继续执行; 来源:http://www.clcgzw.com/zhishi/202412-106.html
如果S≤0,则释放信号量队列上的第一个PCB所对应的进程(阻塞态改为就绪态),执行V操作的进程继续执行。
l 进程间简单同步与互斥的实现
1. 用P,V原语实现互斥的一般模型:
设互斥信号量mutex初值为1
2. 用P、V原语操作实现简单同步的例子
供者和用者对缓冲区的使用关系如下图:
S1缓冲区是否空(0表示不空,1表示空),初值S1=0;
S2缓冲区是否满(0表示不满,1表示满),初值S2=0;
3. 生产者---消费者问题(OS典型例子)
mutex互斥信号量,初值为1;full满缓冲区数,初值为0;empty空缓冲区数,初值为N;
4. 应用举例
[例1] 设系统中只有一台打印机,有三个用户的程序在执行过程中都要使用打印机输出计算结果。设每个用户程序对应一个进程。问:这三个进程间有什么样的制约关系?使用P、V操作写出这些进程使用打印机的算法。
[解]
由于打印机是一种临界资源,故三个进程只能互斥使用这台打印机。设三个进程分别为PA、PB和PC,互斥信号量mutex初值为1,执行过程如下:
[例2] 判断下面的同步问题的算法是否正确?若有错,请指出错误原因并予以改正。
1) 设A、B两进程共用一个缓冲区Q,A向Q写入信息,B则从Q读出信息,算法框图如图所示。
注:信号量S的初值为0
[解] 该算法不正确来源:http://www.clcgzw.com/xwzx/202412-104.html。因为A、B两个进程共用一个缓冲区Q,如果A先运行,且信息数量足够多,则缓冲区Q中的信息就会发生后面的冲掉前面的,造成信息丢失,B就不能从Q中读出完整的信息。改正如下: 来源:http://www.clcgzw.com/zhishi/202412-28.html
A、B两进程同步使用缓冲区Q,应设定两个信号量:
empty 表示缓冲区Q为空,初值为1;full表示缓冲区Q已满,初值为0
算法框图如下:
2) 设A、B为两个并发进程,它们共享一临界资源。其运行临界区的算法框图如图所示。
[解] 该算法不正确。因为A、B两个进程并发执行,且共享一临界资源,故A、B应互斥地使用该临界资源,即在某一时刻只允许一个进程进入该临界资源,无时序关系。
改正算法:A、B二进程应互斥进入临界区,设定一信号量mutex,初值为1。
[例2] 设有一台计算机,有两个I/O通道,分别接一台卡片输入机和一台打印机。卡片机把一叠卡片逐一输入到缓冲区B1中,加工处理后再搬到缓冲区B2中,并在打印机上印出,问:
1) 系统要设几个进程来完成这个任务?各自的工作是什么?
2) 这些进程间有什么样的相互制约关系? 来源:http://www.clcgzw.com/cshi/202502-173.html
3) 用P、V操作写出这些进程的同步算法。
[解]
1) 系统可设三个进程来完成该任务:Read进程负责从卡片输入机上读入卡片信息,输入到缓冲区B1中;Get进程负责从缓冲区B1中取出信息,进行加工处理,之后将结果送到缓冲区B2中;Print进程负责从缓冲区B2中取出信息,并在打印机上打印输出。
2) 操作过程:
Read进程受Get进程的影响,B1缓冲区中放满信息后Read进程要等待get进程将其中信息全部取走后才能读入信息; Get进程受Read进程和Print进程的约束:B1缓冲区中信息放满后,Get进程才可从中取走信息,且B2缓冲区信息被取空后Get进程才能将加工结果送入其中; Print进程受Get进程的约束,B2缓冲区中信息放满后Print进程方可取出信息进行打印输出。3) 信号量的含义及初值:
B1full——缓冲区B1满,初值为0 B1empty——缓冲区B1空,初值为0 B2full——缓冲区B2满,初值为0 B2empty——缓冲区B2空,初值为04) 操作框图如下:
l 进程简单通信
分类
低级通信机构
高级通信机构 来源:http://www.clcgzw.com/cshi/202412-22.html
特点
传递信息量非常有限
通信的效率低
方便高效地交换大量信息
应用
互斥和同步机构 来源:http://www.clcgzw.com/cshi/202412-62.html
共享存储器
消息传递
管道文件
进程同步机制应遵循的原则如下:
1、互斥原则:在任何时刻,只有一个进程可以执行。这意味着任何两个进程不能同时占用临界资源,必须互相等待对方释放资源。来源:http://www.clcgzw.com/cshi/202412-59.html
2、同步原则:进程之间应按照一定的顺序执行,这个顺序是由它们的依赖关系确定的来源:http://www.clcgzw.com/cshi/202502-160.html。一些进程需要等待其他进程到达某个状态后才能继续执行,这被称为同步。
3、通信原则:进程之间需要建立通信机制,以便彼此了解对方的状态和需求。例如,一个进程可以发送信号给另一个进程,通知它可以进行某项操作。
4、调度原则:操作系统应该根据某种策略来调度进程的执行顺序。常见的调度策略有先来先服务、短作业优先、优先级调度等。死锁预防原则:死锁是进程同步中常见的问题,应该采取措施预防死锁的发生。来源:http://www.clcgzw.com/cshi/202502-154.html
5、错误处理原则:当出现错误时,操作系统应该能够检测并处理错误,以保证进程同步的正确性和可靠性。例如,避免循环等待资源、预先分配资源、检测并解除死锁等。
进程同步机制的应用如下:
1、程同步机制广泛应用于许多实际场景中,以确保并发进程能够按照预定的顺序和规则执行。例如,在生产者消费者问题中,生产者和消费者两个进程需要共享同一个缓冲区进行数据的交换。为了保证数据的正确性和一致性,需要使用进程同步机制来协调它们的执行顺序。来源:http://www.clcgzw.com/bkjj/202412-65.html
2、另外,在分布式系统中,多个节点需要互相协作完成任务,进程同步机制也是不可或缺的。通过使用锁、信号量、消息传递等同步机制,可以确保分布式系统中的各个节点能够按照统一的节奏和步调执行任务,从而实现整个系统的协同工作。
3、同时,进程同步机制也被广泛应用于数据库管理系统、网络通信系统、实时控制系统等领域。在这些系统中,进程同步机制的作用是确保并发操作的正确性和可靠性,防止出现数据不一致、丢失或冲突等问题。
关于“面试必备:Binder进程通信原理”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!