android Framework 中用到了哪些跨进程通信方式?

news/2024/4/27 5:26:02/文章来源:https://blog.csdn.net/ldxlz224/article/details/128107698

文章目录

    • Linux 有哪些跨进程的通信方式?
    • 管道
    • 本地 Socket
    • 共享内存
    • 信号

Linux 有哪些跨进程的通信方式?

  • Binder 机制是Android基于Linux的一种独特的IPC机制。我们常用的AMS,PMS 等都是通过Binder机制来完成跨进程通信的,那么除了Binder ,Linux 还有其他跨进程通信的方式可以选择。在Android Framework中主要用到以下方式

      1. 管道2. Socket3. 共享内存4. 信号
    

管道

  • 管道的特点:半双工的,单向

    管道描述符数据只能往一个方向,要么read要么write。如果向既可以读又可以写,则需要两个描述符才可以。Linux 基于这种情况提供了 pipe(fds) api,这个api可以生成一对描述符,一个用来写,一个用来读。

  • 一般是在父子进程之间使用

    无名管道一般是在父子进程之间使用。如果是有名管道,只要两个进程之间都知道名字就可以直接通信了。

  • 管道的使用方式
    在这里插入图片描述

#include<stdio.h>
#include<unistd.h>int main()
{
int n,fd[2];                         // 这里的fd是文件描述符的数组,用于创建管道做准备的
pid_t pid;
char line[100];
if(pipe(fd)<0)                     //   创建管道,生成描述符 fd[1] 是用来写的 fd[0] 是用来读的printf("pipe create error/n");if((pid=fork())<0)              //利用fork()创建新进程printf("fork error/n");else if(pid>0){                   //这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world"close(fd[0]);write(fd[1],"hello word/n",11);
}
else{close(fd[1]);                 //这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据n= read(fd[0],line,100);write(STDOUT_FILENO,line,n);
}
exit(0);
}
  • Framework 中 在Android 4.4 中 Looper 中使用到了管道,高版本更换了 eventfd 的方式。当有线程拿到写的描述符,往里写内容,那么读端就可以收到通知了。
Looper::Looper(bool allowNonCallbacks) :mAllowNonCallbacks(allowNonCallbacks), mSendingMessage(false),mResponseIndex(0), mNextMessageUptime(LLONG_MAX) {int wakeFds[2];// 通过pipe 生成两个描述符int result = pipe(wakeFds);LOG_ALWAYS_FATAL_IF(result != 0, "Could not create wake pipe.  errno=%d", errno);// 0 元素对应的是 读mWakeReadPipeFd = wakeFds[0];// 1 对应的是写 mWakeWritePipeFd = wakeFds[1];result = fcntl(mWakeReadPipeFd, F_SETFL, O_NONBLOCK);result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK);mIdling = false;// Allocate the epoll instance and register the wake pipe.mEpollFd = epoll_create(EPOLL_SIZE_HINT);struct epoll_event eventItem;memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members of data field unioneventItem.events = EPOLLIN;eventItem.data.fd = mWakeReadPipeFd;// 通过 epoll_ctl 注册事件监听result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, & eventItem);
}
  • epoll 是怎么监听读端事件的
int Looper::pollInner(int timeoutMillis) {// 。。。struct epoll_event eventItems[EPOLL_MAX_EVENTS];// epoll_wait 阻塞在这,当返回的时候 eventCount 代表有几个事件被触发了int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis);// 然后依次处理for (int i = 0; i < eventCount; i++) {int fd = eventItems[i].data.fd;uint32_t epollEvents = eventItems[i].events;// 判断描述符 mWakeReadPipeFd ,如果是读描述符if (fd == mWakeReadPipeFd) {if (epollEvents & EPOLLIN) {// 从管道中读取数据awoken();} } else {// ... }}
}
  • 往管道中写数据,通过 Looper 的 wake() 函数写
void Looper::wake() {
#if DEBUG_POLL_AND_WAKEALOGD("%p ~ wake", this);
#endifssize_t nWrite;do {// 通过写描述符写nWrite = write(mWakeWritePipeFd, "W", 1);} while (nWrite == -1 && errno == EINTR);if (nWrite != 1) {if (errno != EAGAIN) {ALOGW("Could not write wake signal, errno=%d", errno);}}
}

管道在进程内可以用,跨进程也可以用,可以和 epoll 相结合监听读写事件,一般用在数据量不大的跨进程通信中使用。

本地 Socket

  • Socket 特点

      全双工,既可以读也可以写两个进程之间可以无亲缘关系
    
  • Android Framework 中在 Zygote 中,通过 Socket 来接收 AMS 请求,启动应用进程。在 ZygoteInit 的入口函数中

public static void main(String argv[]) {// 注册 Zygote 的 socket 监听接口,用来接收启动应用程序的消息zygoteServer.registerServerSocketFromEnv(socketName);// 通过调用 runSelectLoop 进入监听和接收消息的环节 里面有一个 while (true) caller = zygoteServer.runSelectLoop(abiList);
}
  • Runnable runSelectLoop(String abiList)  处理和返回Socket数据
    
Runnable runSelectLoop(String abiList) {while (true) {StructPollfd[] pollFds = new StructPollfd[fds.size()];// 。。。try {//	 用来检测有没有事件发生Os.poll(pollFds, -1);} catch (ErrnoException ex) {throw new RuntimeException("poll failed", ex);}if (i == 0) {// 处理新来的连接} else {// 处理发过来的数据}}}

共享内存

  • 共享内存的特点

      1. 很快,不需要多次拷贝。上面提到的管道和Socket数据量太大会很糟,因为会拷贝两次数据。共享内存拿到文件描述符后,把它同时交给两个进程,就可以进行通信了。2. 进程之间也不用存在亲缘关系
    
  • 具体匿名共享内存看之前的文章

  1. 匿名共享内存 ashmem
  2. 跨进程通信–共享内存(ashmem)实例

信号

  • 特点

      1. 单向发送:不关心发出去之后的事2. 只能带一个信号,不能带别的参数3. 知道进程 pid 就可以发信号了,而且可以群发信号
    
  • 哪里用到了信号?看下面的代码,大多数人都见过,一般我们安装或者重启应用的时候可能先kill掉自己。

android.os.Process.killProcess(android.os.Process.myPid())

killProcess 中就发送了一个信号

	public static final native void sendSignal(int pid, int signal);public static final void killProcess(int pid) {sendSignal(pid, SIGNAL_KILL);}
static void SetSigChldHandler() {struct sigaction sa;memset(&sa, 0, sizeof(sa)); //对sa地址内容进行清零操作sa.sa_handler = SigChldHandler;// zygote 关注的SIGCHLD信号,如果进程杀死了好及时回收资源int err = sigaction(SIGCHLD, &sa, NULL);
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【并发】深入理解Java线程的底层原理

线程基础知识 线程与进程 进程 操作系统会以进程为单位&#xff0c;分配系统资源&#xff08;CPU时间片、内存等资源&#xff09;&#xff0c;进程是资源分配的最小单位。 当一个程序被运行&#xff0c;从磁盘加载这个程序的代码至内存&#xff0c;这时就开启了一个进程。 线…

使用 Mason 创建自己的 Flutter brick

使用 Mason 创建自己的 Flutter brick 原文 https://medium.com/gytworkz/create-your-own-flutter-brick-using-mason-7abc70d0324e 前言 谁不喜欢用最少的努力完成大部分事情呢&#xff1f;我当然知道! &#xff01;Mason 帮我完成了几个简单的步骤。 在本文中&#xff0c;我…

Redis——》数据类型:List(列表)

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》数据类型&#xff1a;List&#xff08;列表&#xff09;一、简介…

复现黑客在后门中藏匿后门

PHP实现在后门中藏匿后门 在攻击渗透的时候会传入shell后门方便进行远控。其中的后门包括多种类型&#xff0c;大马是功能最全的直接提供了可视化的界面方便攻击者进行提权、扫描、上传等一系列的操作。 但有很多hacker不讲武德&#xff0c;在写好的大马中藏入自己的后门&…

VBA Regex 正则表达式应用介绍

. VBA正则表达式介绍 正则表达式或 RegEx 用于在字符串中查找特定的字符。 本文将展示一个 VBA RegEx 示例,并演示为什么在 VBA 中使用正则表达式如此强大。 正则表达式是一个比较大的话题,关于这方面的书很多。 同时也是一个让许多人感到害怕的话题,因为它的语法比较神秘和…

C++入门笔记

C 入门笔记Functions in CC header Files下面主要是我学习C的一个笔记&#xff0c;记录学习中遇到的一些重点事项。下面是视频的连接https://www.bilibili.com/video/BV1Ay4y1i7Z6/?p10&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourcee6e…

记录--两行CSS让页面提升了近7倍渲染性能!

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 对于前端人员来讲&#xff0c;最令人头疼的应该就是页面性能了&#xff0c;当用户在访问一个页面时&#xff0c;总是希望它能够快速呈现在眼前并且是可交互状态。如果页面加载过慢&#xff0c;你…

第四章. Pandas进阶—时间序列

第四章. Pandas进阶 4.9 时间序列 1.重采样&#xff08;resample&#xff09; 在Pandas中&#xff0c;对时间序列频率的调整称为重采样&#xff0c;即时间序列从一个频率转换到另一个频率的过程&#xff0c;由周统计变成月统计 1).语法&#xff1a; 4.8章 第4点 已介绍过&…

MySQL数据库行级锁之间隙锁、临键锁

间隙锁 默认情况下&#xff0c;InnoDB在 REPEATABLE READ事务隔离级别运行&#xff0c;InnoDB使用 next-key 锁进行搜索和索引扫描&#xff0c;以防止幻读。 索引上的等值查询(唯一索引)&#xff0c;给不存在的记录加锁时, 优化为间隙锁 。索引上的等值查询(非唯一普通索引)&…

如果把网络原理倒过来看,从无到有,一切如此清晰(下)

人生若只如初见。 前言 当我在台灯下&#xff0c;听着远隔17年前五月天的歌&#xff0c;而在数日后&#xff0c;我的文字也会纵使相隔万里远的来到你的屏幕前&#xff0c;就觉得这一切妙不可言。 OSI 网络七层模型 《如果把网络原理倒过来看&#xff0c;从无到有&#xff0c…

Seal库官方示例(二):encoders.cpp解析

补充一个常用的SIMD操作原理 图片来自的Hang Shao的文章。 完整代码 这个代码主要功能是编码明文&#xff0c;使得能够使用更加完整的明文多项式&#xff08;前一个只用到了一个多项式的常量&#xff09;&#xff0c;也就是SIMD操作。主要包含了两个部分&#xff0c;一个是BG…

HLS + ffmpeg 实现动态码流视频服务

一、简介 如下图&#xff0c;包含三部分&#xff0c;右边一列为边缘节点&#xff1b;中间一列代表数据中心&#xff1b;左边一列是项目为客户提供的一系列web管理工具&#xff1a; 具体来说在我们项目中有一堆边缘节点&#xff0c;每个节点上部署一台强大的GPU服务器及N个网络…

精彩回顾 | 苏州农商银行新一代云原生信息科技架构体系实践

11月18日&#xff0c;2022年第五届中国金融科技产业大会暨第四届中新&#xff08;苏州&#xff09;数字金融应用博览会“基础软件与云原生系统软件”分论坛成功举办。该论坛由由中国计算机学会CTO CLUB&#xff08;苏州&#xff09;承办&#xff0c;江苏省金融科技云原生融合创…

目标检测数据标注项目分析-产品缺陷检测

什么是生产过程中的产品缺陷检测? 生产过程中的缺陷检测是保证产品质量的重要环节。及时发现故障或缺陷&#xff0c;并采取适当的措施&#xff0c;我们可以降低运行和质量相关的风险。但在一般视觉系统中&#xff0c;每个缺陷都必须经过检查及预处理才能被检测到&#xff0c;…

javaSE - Arrays - 数组的定义与使用

一、数组基本用法 1.1、什么是数组 数组本质上就是让我们能 “批量” 创建相同类型的变量 也可以说是存储一组相同数据类型的数据的集合 如: 如果需要表示两个数据, 那么直接创建两个变量即可 int a; int b 如果需要表示五个数据, 那么可以创建五个变量 int a1; int a2; int …

[附源码]Python计算机毕业设计Django的4s店车辆管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

DPU网络开发SDK——DPDK(一)

随着软件定义网络SDN的不断发展&#xff0c;网络数据转发面的需求越来越多样化&#xff0c;这体现在更快的数据包处理速率&#xff0c;更高的网络吞吐带宽&#xff0c;更灵活的自定义网络协议。传统的硬件设备无法满足网络协议的自定义&#xff0c;而基于Linux内核网络协议栈的…

【能效管理】变电所运维云平台在上海某医院的设计分析

摘要&#xff1a;本文概述了变电所电力运维技术&#xff0c;分析了医院变电所中存在的技术设备老化和技术荷载不足的技术性问题&#xff0c;并从主变低压进出线路监测故障、环境监测故障、设备档案记录、运维排班记录、分析报告五个方面探讨了变电所电力运维技术的具体应用。变…

Java定时器选择

java计时器和死循环哪个好&#xff1f;哪个建议使用&#xff1f; 计时器性能更好&#xff0c;但是写起来稍微复杂一点。如果是非常短暂的延迟&#xff0c;用死循环也未尝不可。一般来说能不用死循环的尽量不用死循环&#xff01;如果你使用的是JDK1.5以上的&#xff0c;可以使…

高空简易水果采摘装置设计(CAD+proe)

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2研究现状 1 1.2.1国外果园采摘机械现状 1 1.2.2国内果园采摘机械现状 4 1.2.3果园机械存在问题 5 1.2.4果园采摘机械的发展趋势 6 1.3研究主要内容 7 2 高空简易水果采摘装置原理 8 2.1 水果实采摘方式的选择 8 2.…