033android多进程-共享内存

author author     2023-05-04     765

关键词:

参考技术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的共享内存在本质上是大同小异的。

Gunicorn 在多处理进程和工作进程之间共享内存

】Gunicorn在多处理进程和工作进程之间共享内存【英文标题】:Gunicornsharedmemorybetweenmultiprocessingprocessesandworkers【发布时间】:2015-08-1600:32:48【问题描述】:我有一个python应用程序,它使用字典作为多个进程之间的共享内存:frommu... 查看详情

8-1多进程锁和共享内存

多进程Lock组件当我们使用多进程读写文件时,一个进程写文件,一个进程读文件。如果两个进程同时进行,肯定不行,必须等写结束后,才可以进行多操作。或者多个进程在共享一些资源时,同时只能有一个进程进行访问,需... 查看详情

Python多进程共享内存与使用参数

】Python多进程共享内存与使用参数【英文标题】:Pythonmultiprocesssharememoryvsusingarguments【发布时间】:2015-05-0521:26:34【问题描述】:我正试图弄清楚在不同进程之间共享相同数据源的最有效且内存消耗更少的方法是什么。想象一下... 查看详情

C ++多进程共享内存实现

】C++多进程共享内存实现【英文标题】:C++multipleprocesssharedmemoryimplementation[closed]【发布时间】:2011-05-2918:44:20【问题描述】:这就是我想要实现的目标。我希望program1创建一个共享内存段,用于存储各种数组。然后,我希望progra... 查看详情

day37——多进程锁多进程共享内存

Lock组件当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件,如果两个文件同时进行,肯定是不行的,必须是文件写结束以后,才可以进行读操作。或者是多个进程在共享一些资源的时候,同时只能... 查看详情

Python - 多处理和共享内存

...用Deap框架实现遗传算法。该算法有效,但我注意到GA的多进程版本非常消耗内存9GB,而单进程的2GB我怀疑是因为它已经为每个进程分配了内存。事实上,一旦执行映射,使用的内存就会增加。由于进程之间共享的数据只用于读取... 查看详情

python多进程共享内存(代码片段)

frommultiprocessingimportProcess,Manager,Lockimportosimporttimedefrun_proc(dict,slip,lock):tmp=dict[slip].copy()forkindict[slip]:tmp[k]=k+tmp[k]print(‘Runchildprocessch...‘.format(ch=os.getpid()))wi 查看详情

多线程和多进程的区别

参考技术A一般运行一个程序称为一个进程。进程可以创建线程,也可以创建进程。多线程和多进程的区别:线程是由进程管理的,线程之间、线程和父进程(创建线程的进程)之间可以共享内存变量(需要使用策略的)。进程之间一... 查看详情

多线程与多进程的区别

(1)多线程多进程的区别维度多进程多线程总结数据共享、同步数据是分开的:共享复杂,需要用IPC;同步简单多线程共享进程数据:共享简单;同步复杂各有优势内存、CPU占用内存多,切换复杂,CPU利用率低占用内存少,切换简... 查看详情

java多线程

一:线程的基本概念线程指进程中的一个执行场景,也就是执行流程,那么进程和线程有什么区别呢? 每个进程是一个应用程序,都有独立的内存空间同一个进程中的线程共享其进程中的内存和资源(共享的内存是堆内存和... 查看详情

多线程还是多进程的选择及区别

  对比维度多进程多线程总结数据共享、同步数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂各有优势内存、CPU占用内存多,切换复杂,CPU利用率... 查看详情

具有共享内存的 Pytorch 多处理导致 matmul 慢 30 倍(只有两个进程)

】具有共享内存的Pytorch多处理导致matmul慢30倍(只有两个进程)【英文标题】:Pytorchmultiprocessingwithsharedmemorycausesmatmultobe30xslower(withonlytwoprocesses)【发布时间】:2021-03-1110:04:47【问题描述】:我正在尝试通过使用多处理让多个工... 查看详情

android匿名共享内存原理浅读(代码片段)

理论基础android系统在应用程序框架层中提供了两个C++类MemoryHeapBase和MemoryBase来创建和管理匿名共享内存。如果一个进程需要与其他进程共享一块完整的匿名共享内存,那么就可以通过使用MemoryHeapBase类类创建这块匿名... 查看详情

基于多进程的网络聊天程序

...。作者:游双程序简单介绍:该程序用了共享内存来实现进程间的同步,因为仅仅是同一时候读取共享内存。所以没实用到锁。该程序的功能是server监听网络连接,当有一个client连接时,server创建一个子进程处理该连接。每一个... 查看详情

使用共享内存(mmap)和信号量的进程间通信

】使用共享内存(mmap)和信号量的进程间通信【英文标题】:interprocesscommunicationusingsharedmemory(mmap)andsemaphores【发布时间】:2018-03-1523:29:13【问题描述】:我正在尝试使用计数信号量即兴创作我为单生产者多消费者多线程编写的... 查看详情

通过swooletable实现swoole多进程数据共享(代码片段)

...ole的 Process 及 ProcessPool 模块在PHP中实现多进程管理,但是多进程模式下进程间是相互隔离的,无法共享数据和变量,即便是通过 global 定义的全局或超全局变量,也只是在所属进程中有效,如果要在Swoole实... 查看详情

多线程的优势

...线程在程序中是独立的,并发的执行流,但是,与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存,文件句柄和其他每个进程应有的状态。2,线程比进程具有更高的性能,这是由于同一个进程中的线程都有... 查看详情

进程间通信方式及特点

1.管道无名管道是一种只用于父子进程间的半双工的通信方式。有名管道是可以在无亲缘关系进程间通信。2.信号量用来控制多进程或多线程对共享资源的访问,是一种多进程和多线程之间同步的手段。3.信号用来通知接收进程某... 查看详情