1. android跨进程通信-共享内存
还是先看共享内存的使用方法,我主要介绍两个函数:
通过 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的共享内存在本质上是大同小异的。
要使用一块共享内存
2. 安卓文件无法复制到根目录
使用第三方软件复制。
安卓手机正常通过数据线连接手机和电脑的时候,只显示内存卡,不显示手机自身内存,这样您就无法把内存卡的东西复制到电脑里,但是可以通过第三方软件,比如豌豆荚、360助手或者手机助手连接手机和电脑的,这样可以查看到内存卡的内存还可以查看到手机内存的,您可以尝试将内存卡里的东西复制到手机内存里。
根目录指逻辑驱动器的最上一级目录,它是相对子目录来说的。打开“我的电脑”,双击C盘就进入C盘的根目录,双击D盘就进入D盘的根目录。其它类推。根目录在文件系统建立时即已被创建,其目的就是存储子目录(也称为文件夹)或文件的目录项。一“棵“目录树,树的最根本就是它的根(根目录)。
3. android系统的手机目录各个文件夹代表什么例如acct
1、acct文件夹:根目录/acct/ ,系统回收站,误删除的系统文件恢复ACCT计算机语言,系统调用禁止/启用系统记录进程信息。
2、cache文件夹:缓存(cache) 文件。只是内存中少部分数据的复制品,先于内存与CPU交换数据,因此速率很快。
3、config文件夹:(计算机系统)配置。如:系统里的config.sys就是系统自动配置文件,它是在用户开机这段时间对计算机进行初始化设置,也就是用户对系统的设置都由它来对计算机进行恢复。
4、system:Android 系统文件。主要包括usr(用户文件夹,包含共享、键盘布局、时间区域文件等) ,app(常规下载的应用程序,这些 apk 包都是受保护的), lib(系统底层库,如平台运行时库等)等。
5、etc:系统主要配置文件,比如APN接入点设置等核心配置等。
6、data:用户程序目录。存储手机系统文件和安装软件的数据文件,不能随便删除。