Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6)

简介:

   接下来,我们再来看看server模块的实现。在external/ashmem/common目录下,只有一个源文件SharedBufferServer.cpp,它实现了内存共享服务SharedBufferService:

  1. #define LOG_TAG "SharedBufferServer"  
  2.   
  3. #include <utils/Log.h>  
  4. #include <binder/MemoryBase.h>  
  5. #include <binder/MemoryHeapBase.h>  
  6. #include <binder/IServiceManager.h>  
  7. #include <binder/IPCThreadState.h>  
  8.   
  9. #include "../common/ISharedBuffer.h"  
  10.   
  11. class SharedBufferService : public BnSharedBuffer  
  12. {  
  13. public:  
  14.     SharedBufferService()  
  15.     {  
  16.         sp<MemoryHeapBase> heap = new MemoryHeapBase(SHARED_BUFFER_SIZE, 0, "SharedBuffer");  
  17.         if(heap != NULL)  
  18.         {  
  19.             mMemory = new MemoryBase(heap, 0, SHARED_BUFFER_SIZE);  
  20.   
  21.             int32_t* data = (int32_t*)mMemory->pointer();  
  22.             if(data != NULL)  
  23.             {  
  24.                 *data = 0;  
  25.             }  
  26.         }  
  27.     }  
  28.   
  29.     virtual ~SharedBufferService()  
  30.     {  
  31.         mMemory = NULL;  
  32.     }  
  33.   
  34. public:  
  35.     static void instantiate()  
  36.     {  
  37.         defaultServiceManager()->addService(String16(SHARED_BUFFER_SERVICE), new SharedBufferService());  
  38.     }  
  39.   
  40.     virtual sp<IMemory> getBuffer()  
  41.     {  
  42.         return mMemory;  
  43.     }  
  44.   
  45. private:  
  46.     sp<MemoryBase> mMemory;  
  47. };  
  48.   
  49. int main(int argc, char** argv)  
  50. {  
  51.     SharedBufferService::instantiate();  
  52.   
  53.     ProcessState::self()->startThreadPool();  
  54.     IPCThreadState::self()->joinThreadPool();  
  55.   
  56.     return 0;  
  57. }  
        SharedBufferService服务实现了BnSharedBuffer接口。在它的构造函数里面,首先是使用MemoryHeapBase类创建了一个匿名共享内存,大小为SHARED_BUFFER_SIZE。接着,又以这个MemoryHeapBase对象为参数,创建一个MemoryBase对象,这个MemoryBase对象指定要维护的匿名共享内存的的偏移位置为0,大小为SHARED_BUFFER_SIZE,并且,将这个匿名共享内存当作一个整型变量地址,将它初始化为0。最终,这个匿名共享内存对象保存在SharedBufferService类的成员变量mMemory中,这个匿名共享内存对象可以通过成员函数getBuffer来获得。
 
        在Server端应用程序的入口函数main中,首先是调用SharedBufferService静态成员函数instantiate函数来创建一个SharedBufferService实例,然后通过defaultServiceManager函数来获得系统中的Service Manager接口,最后通过这个Service Manager接口的addService函数来把这个SharedBufferService服务添加到Service Manager中去,这样,Client端就可以通过Service Manager来获得这个共享内存服务了。有关Service Manager的实现,请参考前面一篇文章 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路 ,而用来获取Service Manager接口的defaultServiceManager函数的实现可以参考另外一篇文章 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路 。初始化好这个共享内存服务之后,程序就通过ProcessState::self()->startThreadPool()函数来创建一个线程等待Client端来请求服务了,最后,程序的主线程也通过IPCThreadState::self()->joinThreadPool()函数来进入到等待Client端来请求服务的状态中。
       我们还需要为这个Server端应用程序编译一个编译脚本,在external/ashmem/server目录下,新建一个Android.mk文件,它的内容如下所示:
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE_TAGS :optional  
  6.   
  7. LOCAL_SRC_FILES := ../common/ISharedBuffer.cpp \  
  8.         SharedBufferServer.cpp  
  9.   
  10. LOCAL_SHARED_LIBRARIES:libcutils libutils libbinder  
  11.   
  12. LOCAL_MODULE :SharedBufferServer  
  13.   
  14. include $(BUILD_EXECUTABLE)  
        最后,我们再来看看client模块的实现。在external/ashmem/client目录下,只有一个源文件SharedBufferClient.cpp,它的内容如下所示:
  1. #define LOG_TAG "SharedBufferClient"  
  2.   
  3. #include <utils/Log.h>  
  4. #include <binder/MemoryBase.h>  
  5. #include <binder/IServiceManager.h>  
  6.   
  7. #include "../common/ISharedBuffer.h"  
  8.   
  9. int main()  
  10. {  
  11.         sp<IBinder> binder = defaultServiceManager()->getService(String16(SHARED_BUFFER_SERVICE));  
  12.         if(binder == NULL)  
  13.         {  
  14.                 printf("Failed to get service: %s.\n", SHARED_BUFFER_SERVICE);  
  15.                 return -1;  
  16.         }  
  17.   
  18.         sp<ISharedBuffer> service = ISharedBuffer::asInterface(binder);  
  19.         if(service == NULL)  
  20.         {  
  21.                 return -2;  
  22.         }  
  23.   
  24.         sp<IMemory> buffer = service->getBuffer();  
  25.         if(buffer == NULL)  
  26.         {  
  27.                 return -3;  
  28.         }  
  29.   
  30.         int32_t* data = (int32_t*)buffer->pointer();  
  31.         if(data == NULL)  
  32.         {  
  33.                 return -4;  
  34.         }  
  35.   
  36.         printf("The value of the shared buffer is %d.\n", *data);  
  37.   
  38.         *data = *data + 1;  
  39.   
  40.         printf("Add value 1 to the shared buffer.\n");  
  41.   
  42.         return 0;  
  43. }  
        在这个文件中,主要就是定义了Client端应用程序的入口函数main,在这个main函数里面,首先通过Service Manager接口获得前面所实现的匿名共享内存服务SharedBufferService的远程接口service,然后通过这个远程接口的getBuffer成员函数获得由Server端提供的一块匿名共享内存接口buffer,最后通过这个匿名共享内存接口获得这个匿名共享内存的基地址data。有了这个匿名共享内存的地址data之后,我们就可以对它进行读写了,先是把这个匿名共享内存当作是一个整型变量地址进行访问,并输出它的值的大小,然后对这个整量变量进行加1的操作,并写回到原来的共享内存空间中去。这样,当Server端应用程序运行之后,第一次运行这个Client端应用程序时,输出的值为0,第二次运行这个个Client端应用程序时,输出的值为1,第三次运行这个个Client端应用程序时,输出的值为3......依次类推,后面我们将在模拟器中对这个分析进行验证,如果验证成功的话,就说明这个匿名共享内存成功地在Server端和Client端实现共享了。
 




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966923,如需转载请自行联系原作者
目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1410 4
|
9月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
568 3
|
5月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
165 1
|
8月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
531 4
AI代理内存消耗过大?9种优化策略对比分析
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
655 159
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
116 4
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
248 2
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
962 21
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
255 8
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
557 1