android跨进程通信-共享内存

author author     2023-04-06     635

关键词:

参考技术A

还是先看共享内存的使用方法,我主要介绍两个函数:

通过 shmget() 函数申请共享内存,它的入参如下

通过 shmat() 函数将我们申请到的共享内存映射到自己的用户空间,映射成功会返回地址,有了这个地址,我们就可以随意的读写数据了,我们继续看一下这个函数的入参

共享内存的原理是在内存中单独开辟的一段内存空间,这段内存空间其实就是一个tempfs(临时虚拟文件),tempfs是VFS的一种文件系统,挂载在/dev/shm上,前面提到的管道pipefs也是VFS的一种文件系统。

由于共享的内存空间对使用和接收进程来讲,完全无感知,就像是在自己的内存上读写数据一样,所以也是 效率最高 的一种IPC方式。

上面提到的IPC的方式都是 在内核空间中开辟内存来存储数据 ,写数据时,需要将数据从用户空间拷贝到内核空间,读数据时,需要从内核空间拷贝到自己的用户空间,
共享内存就只需要一次拷贝 ,而且共享内存不是在内核开辟空间,所以可以 传输的数据量大

但是 共享内存最大的缺点就是没有并发的控制,我们一般通过信号量配合共享内存使用,进行同步和并发的控制

共享内存在Android系统中主要的使用场景是 用来传输大数据 ,并且 Android并没有直接使用Linux原生的共享内存方式,而是设计了Ashmem匿名共享内存

之前说到有名管道和匿名管道的区别在于有名管道可以在vfs目录树中查看到这个管道的文件,但是匿名管道不行, 所以匿名共享内存同样也是无法在vfs目录中查看到 的, Android之所以要设计匿名共享内存 ,我觉得主要是为了安全性的考虑吧。

我们来看看共享内存的一个使用场景,在Android中,如果我们想要将当前的界面显示出来,需要将当前界面的图元数据传递Surfaceflinger去做图层混合,图层混合之后的数据会直接送入帧缓存,送入帧缓存后,显卡就会直接取出帧缓存里的图元数据显示了。

那么我们如何将应用的Activity的图元数据传递给SurfaceFlinger呢?想要将图像数据这样比较大的数据跨进程传输,靠binder是不行的,所以这儿便用到匿名共享内存。

从谷歌官方提供的架构图可以看到,图元数据是通过BufferQueue传递到SurfaceFlinger去的,当我们想要绘制图像的时候, 需要从BufferQueue中申请一个Buffer,Buffer会调用Gralloc模块来分配共享内存 当作图元缓冲区存放我们的图元数据。

可以看到Android的匿名共享内存是通过 ashmem_create_region() 函数来申请共享内存的,它会在/dev/ashmem下创建一个虚拟文件,Linux原生共享内存是通过shmget()函数,并会在/dev/shm下创建虚拟文件。

匿名共享内存是通过 mmap() 函数将申请到的内存映射到自己的进程空间,而Linux是通过*shmat()函数。

虽然函数不一样,但是Android的匿名共享内存和Linux的共享内存在本质上是大同小异的。

要使用一块共享内存

android基于共享内存实现跨进程大数据的高效传输(代码片段)

前言提到Android进程间的通信方式,即使是Android客户端开发初学者,也能列举出来几种,无外乎:bundle文件共享AIDL(Binder)MessengerContentProviderSocket然而都2022年了,本文如果只是介绍下以上的几种进程间... 查看详情

android跨进程通信-mmap函数

...繁琐过程,因此mmap效率很高。mmap()使用非常频繁,看过Android系统源码的人,肯定看到过大量的地 查看详情

android跨进程通信binder机制与aidl实例(代码片段)

...通信1.1进程空间划分1.2跨进程通信IPC1.3Linux跨进程通信1.4Android进程通信Binder跨进程通信2.1Binder简介2.2Binder驱动2.3Binder原理AIDL编程Demo3.1服务端3.2客户端在操作系统中,进程与进程间的内存和数据都是不共享的。这样做的目的&#... 查看详情

android跨进程通信binder机制与aidl实例(代码片段)

...通信1.1进程空间划分1.2跨进程通信IPC1.3Linux跨进程通信1.4Android进程通信Binder跨进程通信2.1Binder简介2.2Binder驱动2.3Binder原理AIDL编程Demo3.1服务端3.2客户端在操作系统中,进程与进程间的内存和数据都是不共享的。这样做的目的&#... 查看详情

深入理解android跨进程通信-binder机制(代码片段)

说到binder,很多Android开发者会觉得很复杂,因为binder横跨了整个Android系统架构,从framework到kernel,binder无处不在。在日常的面试过程中,binder也是一个绕不开的话题。为啥binder这么重要,跨进程通信方式... 查看详情

androidipc跨进程通讯的几种方式作用(代码片段)

...号3.3、消息队列3.4、共享内存3.5、信号量3.6、套接字四丶Android通信的几种方式Bundle&IntentSharedPerferenceActivityContentProviderBroadcastMessagerAIDLSocket一丶跨进程通信作用数据传输:一 查看详情

carson带你学android:全面剖析binder跨进程通信原理

...定义Client&Server进程并显式使用上述3个步骤,最终借助Android的基本架构功能就可完成进程间通信注册服务后,Binder驱动持有Server进程创建的Binder实体此时,Client进程与Server进程已经建立了连接Client进程根据获取到的Service信息... 查看详情

Windows 中跨进程的共享内存是不是一致?

】Windows中跨进程的共享内存是不是一致?【英文标题】:IssharedmemorycoherentacrossprocessesinWindows?Windows中跨进程的共享内存是否一致?【发布时间】:2016-03-0118:31:37【问题描述】:我需要在同一台机器上的两个进程之间进行一些高... 查看详情

使用 TCP 跨进程共享内存

】使用TCP跨进程共享内存【英文标题】:UsingTCPformemorysharingacrossprocesses【发布时间】:2015-11-3017:35:59【问题描述】:我在开始处理nodejs时犯了一个错误,因为我没有使用Redis或Memcache或其他内存存储系统。现在,重写所有内容以... 查看详情

python跨进程通信可以使用哪些消息中间件?

文章大纲简介数据库作为消息中间件是否能满足性能要求?参考文献与学习路径简介从通信目的的角度来看,我们可以把进程之间的通信分成3种:进程调度:可以通过信号来实现;共享资源:可以通过互斥锁、信号量、读写锁、文件锁... 查看详情

python跨进程通信可以使用哪些消息中间件?

文章大纲简介数据库作为消息中间件是否能满足性能要求?参考文献与学习路径简介从通信目的的角度来看,我们可以把进程之间的通信分成3种:进程调度:可以通过信号来实现;共享资源:可以通过互斥锁、信号量、读写锁、文件锁... 查看详情

python跨进程通信可以使用哪些消息中间件?

文章大纲简介数据库作为消息中间件是否能满足性能要求?参考文献与学习路径简介从通信目的的角度来看,我们可以把进程之间的通信分成3种:进程调度:可以通过信号来实现;共享资源:可以通过互斥锁、信号量、读写锁、文件锁... 查看详情

android跨进程通信aidl的使用及注意事项

博客首发公众号地址:coolspan前提在其他进程开辟使用内存,不会影响当前App进程;进而,也会很大一部分避免App被垃圾回收机制回收;QQ的网路通信使用的就是跨进程通讯。创建Aidl接口文件创建一个File,命名... 查看详情

android进程间通信的几种实现方式

Android进程间通信的几种实现方式主要有4种方式:这4种方式正好对应于android系统中4种应用程序组件:Activity、ContentProvider、Broadcast和Service。主要实现原理:由于应用程序之间不能共享内存。为了在不同应用程序之间交互数据(... 查看详情

跨进程内存屏障

】跨进程内存屏障【英文标题】:CrossProcessMemoryBarrier【发布时间】:2014-06-1421:12:10【问题描述】:我正在使用内存映射文件进行跨进程数据共享。我有两个进程,一个写入数据块,一个或多个读取这些块。为了让读者知道一个... 查看详情

android进程间通信的几种实现方式(代码片段)

...同应用程序之间交互数据(跨进程通讯),在androidSDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、ContentProvider、Broadcast和Service。其中Activity可以跨进程调用其他... 查看详情

android跨进程通信aidl和messenger详解(代码片段)

1.定义我们都知道,Android应用一旦启动就会生成一个以包名为名字的进程,当然我们还知道android中很多manager都是运行在systemserver进程中的,像AMS,PMS,WMS等,它们都是通过binder来进程远程调用,说到... 查看详情

精品文章系列

文章目录Android☆跨进程通信☆☆Service☆Java☆多线程☆Flutter☆环境搭建☆☆语法基础☆☆实战进阶☆☆问题总结☆Dart☆环境搭建☆☆语法基础☆☆问题总结☆Android☆跨进程通信☆跨进程通讯的几种方式、作用Messenger实现跨进程... 查看详情