织梦图片瀑布流网站模板wordpress 登陆样式

张小明 2026/3/2 22:07:32
织梦图片瀑布流网站模板,wordpress 登陆样式,网站开发毕业设计开课题目,建设营销型网站的要素匿名共享内存模块详解 #x1f9e0; 一句话概括#xff1a;Ashmem#xff08;匿名共享内存#xff09;就像进程间的公共黑板#xff0c;多个进程可以同时读写同一块内存。 #x1f4da; 目录 什么是匿名共享内存#xff1f;为什么需要 Ashmem#xff1f;A…匿名共享内存模块详解一句话概括Ashmem匿名共享内存就像进程间的公共黑板多个进程可以同时读写同一块内存。 目录什么是匿名共享内存为什么需要 AshmemAshmem 工作原理Ashmem 类详解核心操作流程使用示例保护标志详解最佳实践1. 什么是匿名共享内存1.1 通俗理解想象一个办公室场景 普通内存每个员工有自己的便签本 员工A写在自己的便签上 员工B看不到员工A写的内容 要传递信息 → 需要复制便签共享内存办公室有一块公共白板 员工A在白板上写内容 员工B直接看白板上的内容 无需复制 → 直接共享1.2 技术定义AshmemAnonymous Shared Memory是 Android/Linux 系统提供的匿名共享内存机制基于文件描述符通过 fd 访问跨进程共享多个进程可以映射同一块内存自动回收当所有引用关闭时自动释放进程B内核空间进程A映射区域B用户空间BAshmem 区域/dev/ashmem映射区域A用户空间A2. 为什么需要 Ashmem2.1 进程间通信的挑战进程隔离无法直接访问进程A 内存空间进程B 内存空间问题每个进程有独立的内存空间无法直接访问其他进程的内存。2.2 传统 IPC 方式的问题方式问题管道/Socket需要数据复制大数据量效率低消息队列有大小限制需要序列化信号只能传递简单信息2.3 Ashmem 的优势Ashmem映射映射共享内存进程A进程B0次数据复制传统IPC复制数据复制数据内核缓冲区进程A进程B2次数据复制优势说明零拷贝数据无需复制直接共享高效适合大数据量传输灵活可以设置保护标志安全支持权限控制3. Ashmem 工作原理3.1 整体架构内核空间用户空间open/ioctl/mmapdev/ashmemAshmem 驱动物理内存应用程序Ashmem 类3.2 关键步骤应用程序Ashmem类内核物理内存CreateAshmem(name, size)open(/dev/ashmem)返回 fdioctl(SET_NAME)ioctl(SET_SIZE)MapReadAndWriteAshmem()mmap(fd, size)分配物理内存返回映射地址WriteToAshmem(data)直接写入ReadFromAshmem()直接读取UnmapAshmem()munmap()CloseAshmem()close(fd)应用程序Ashmem类内核物理内存4. Ashmem 类详解4.1 类结构«基类»RefBaseAshmem-int memoryFd_-int32_t memorySize_-int flag_-void* startAddr_CreateAshmem(name, size)Ashmem(fd, size)~Ashmem()GetAshmemFd() : intSetProtection(type) : boolGetProtection() : intGetAshmemSize() : int32_tCloseAshmem() : voidMapAshmem(mapType) : boolMapReadAndWriteAshmem() : boolMapReadOnlyAshmem() : boolUnmapAshmem() : voidWriteToAshmem(data, size, offset) : boolReadFromAshmem(size, offset)-CheckValid(size, offset, cmd) : bool4.2 成员变量成员类型说明memoryFd_int文件描述符memorySize_int32_t内存区域大小flag_int用户空间保护标志startAddr_void*映射后的起始地址4.3 核心方法创建 Ashmem// 静态工厂方法staticsptrAshmemCreateAshmem(constchar*name,int32_tsize);否是否是CreateAshmem参数有效?返回 nullptrAshmemCreateopen /dev/ashmemioctl SET_NAMEioctl SET_SIZE成功?new Ashmem返回 sptr映射内存boolMapAshmem(intmapType);// 通用映射boolMapReadAndWriteAshmem();// 读写映射boolMapReadOnlyAshmem();// 只读映射voidUnmapAshmem();// 取消映射flowchart LR subgraph 映射类型 A[MapAshmembr/PROT_READ] -- R[只读] B[MapAshmembr/PROT_WRITE] -- W[只写] C[MapAshmembr/PROT_READPROT_WRITE] -- RW[读写] end读写数据boolWriteToAshmem(constvoid*data,int32_tsize,int32_toffset);constvoid*ReadFromAshmem(int32_tsize,int32_toffset);ReadFromAshmem否是否是有效?检查参数返回 nullptr检查权限有读权限?返回地址指针WriteToAshmem否是否是有效?检查参数返回 false检查权限有写权限?memcpy 写入返回 true5. 核心操作流程5.1 完整生命周期CreateAshmem()MapAshmem()Read/WriteUnmapAshmem()MapAshmem()CloseAshmem()CloseAshmem()CreatedMappedUnmappedClosed5.2 内存布局Ashmem 内存区域: ┌────────────────────────────────────────────────────────┐ │ memorySize_ 字节 │ ├────────────────────────────────────────────────────────┤ │ startAddr_ │ │ ↓ │ │ ┌──────┬──────┬──────┬──────┬──────┬──────────────────┐│ │ │ │ │ │ │ │ ││ │ │ 数据1 │ 数据2 │ 数据3 │ ... │ 数据N │ 空闲空间 ││ │ │ │ │ │ │ │ ││ │ └──────┴──────┴──────┴──────┴──────┴──────────────────┘│ │ ↑ ↑ │ │ offset0 offsetn │ └────────────────────────────────────────────────────────┘5.3 跨进程共享流程进程ABinder/IPC进程BCreateAshmem(shared, 1024)MapReadAndWriteAshmem()WriteToAshmem(data)传递 fd接收 fdnew Ashmem(fd, size)MapReadOnlyAshmem()ReadFromAshmem()两个进程共享同一块内存进程ABinder/IPC进程B6. 使用示例6.1 基本用法#includeashmem.h#includeiostream#includecstringusingnamespaceOHOS;voidBasicAshmemDemo(){// 1. 创建 Ashmem 区域sptrAshmemashmemAshmem::CreateAshmem(MySharedMem,1024);if(ashmemnullptr){std::cerr创建 Ashmem 失败std::endl;return;}std::coutAshmem FD: ashmem-GetAshmemFd()std::endl;std::coutAshmem Size: ashmem-GetAshmemSize()std::endl;// 2. 映射到用户空间读写模式if(!ashmem-MapReadAndWriteAshmem()){std::cerr映射失败std::endl;return;}// 3. 写入数据constchar*messageHello, Ashmem!;if(ashmem-WriteToAshmem(message,strlen(message)1,0)){std::cout写入成功std::endl;}// 4. 读取数据constchar*readDatastatic_castconstchar*(ashmem-ReadFromAshmem(strlen(message)1,0));if(readData){std::cout读取到: readDatastd::endl;}// 5. 取消映射ashmem-UnmapAshmem();// 6. 关闭析构时也会自动关闭ashmem-CloseAshmem();}6.2 写入结构体#includeashmem.hstructUserData{intid;charname[32];doublescore;};voidWriteStructDemo(){sptrAshmemashmemAshmem::CreateAshmem(UserData,sizeof(UserData)*10);ashmem-MapReadAndWriteAshmem();// 写入多个结构体for(inti0;i10;i){UserData user;user.idi1;snprintf(user.name,sizeof(user.name),User%d,i1);user.score80.0i*2;intoffseti*sizeof(UserData);ashmem-WriteToAshmem(user,sizeof(UserData),offset);}// 读取第 5 个用户intreadOffset4*sizeof(UserData);constUserData*user5static_castconstUserData*(ashmem-ReadFromAshmem(sizeof(UserData),readOffset));if(user5){std::coutID: user5-idstd::endl;std::coutName: user5-namestd::endl;std::coutScore: user5-scorestd::endl;}ashmem-UnmapAshmem();ashmem-CloseAshmem();}6.3 跨进程共享示例进程 A生产者#includeashmem.h#includeunistd.hvoidProducerProcess(){// 创建共享内存sptrAshmemashmemAshmem::CreateAshmem(SharedBuffer,4096);ashmem-MapReadAndWriteAshmem();intfdashmem-GetAshmemFd();intsizeashmem-GetAshmemSize();// 通过某种 IPC 方式如 Binder将 fd 和 size 传递给进程 B// SendToProcessB(fd, size);// 写入数据intcounter0;while(true){charbuffer[64];snprintf(buffer,sizeof(buffer),Message #%d,counter);ashmem-WriteToAshmem(buffer,strlen(buffer)1,0);std::cout生产者写入: bufferstd::endl;sleep(1);}}进程 B消费者#includeashmem.h#includeunistd.hvoidConsumerProcess(intfd,intsize){// 使用从进程 A 获取的 fd 创建 AshmemsptrAshmemashmemnewAshmem(fd,size);// 只读映射ashmem-MapReadOnlyAshmem();// 读取数据while(true){constchar*datastatic_castconstchar*(ashmem-ReadFromAshmem(64,0));if(data){std::cout消费者读取: datastd::endl;}sleep(1);}}6.4 环形缓冲区实现#includeashmem.h#includeatomicclassSharedRingBuffer{public:staticconstexprintBUFFER_SIZE4096;staticconstexprintHEADER_SIZEsizeof(int)*2;// head tailSharedRingBuffer(constchar*name){ashmem_Ashmem::CreateAshmem(name,BUFFER_SIZEHEADER_SIZE);ashmem_-MapReadAndWriteAshmem();// 初始化头尾指针intzero0;ashmem_-WriteToAshmem(zero,sizeof(int),0);// headashmem_-WriteToAshmem(zero,sizeof(int),sizeof(int));// tail}boolWrite(constvoid*data,intsize){int*head(int*)ashmem_-ReadFromAshmem(sizeof(int),0);int*tail(int*)ashmem_-ReadFromAshmem(sizeof(int),sizeof(int));intavailable(BUFFER_SIZE*head-*tail)%BUFFER_SIZE;if(sizeavailable){returnfalse;// 缓冲区满}intwritePosHEADER_SIZE*tail;ashmem_-WriteToAshmem(data,size,writePos);intnewTail(*tailsize)%BUFFER_SIZE;ashmem_-WriteToAshmem(newTail,sizeof(int),sizeof(int));returntrue;}intRead(void*buffer,intmaxSize){int*head(int*)ashmem_-ReadFromAshmem(sizeof(int),0);int*tail(int*)ashmem_-ReadFromAshmem(sizeof(int),sizeof(int));intavailable(*tail-*headBUFFER_SIZE)%BUFFER_SIZE;intreadSizestd::min(available,maxSize);if(readSize0){return0;}intreadPosHEADER_SIZE*head;constvoid*dataashmem_-ReadFromAshmem(readSize,readPos);memcpy(buffer,data,readSize);intnewHead(*headreadSize)%BUFFER_SIZE;ashmem_-WriteToAshmem(newHead,sizeof(int),0);returnreadSize;}~SharedRingBuffer(){ashmem_-UnmapAshmem();ashmem_-CloseAshmem();}private:sptrAshmemashmem_;};7. 保护标志详解7.1 保护标志类型// Linux 内存保护标志#definePROT_NONE0x0// 不可访问#definePROT_READ0x1// 可读#definePROT_WRITE0x2// 可写#definePROT_EXEC0x4// 可执行7.2 两层保护机制flowchart TB subgraph 内核层保护 K[SetProtection] K -- KR[PROT_READ] K -- KW[PROT_WRITE] K -- KRW[PROT_READPROT_WRITE] end subgraph 用户空间保护 U[MapAshmem] U -- UR[PROT_READ] U -- UW[PROT_WRITE] U -- URW[PROT_READPROT_WRITE] end KRW -- URW KRW -- UR KR -- UR Note1[用户空间权限 ≤ 内核层权限]7.3 权限组合内核层用户空间结果READREAD✅ 可读READWRITE❌ 写入失败WRITEWRITE✅ 可写WRITEREAD❌ 读取失败READ|WRITEREAD✅ 可读READ|WRITEWRITE✅ 可写READ|WRITEREAD|WRITE✅ 可读写7.4 设置保护标志sptrAshmemashmemAshmem::CreateAshmem(Protected,1024);// 设置内核层保护只读ashmem-SetProtection(PROT_READ);// 尝试读写映射 - 会失败因为内核层只允许读boolsuccessashmem-MapReadAndWriteAshmem();// false// 只读映射 - 成功successashmem-MapReadOnlyAshmem();// true// 获取当前保护标志intprotashmem-GetProtection();// PROT_READ8. 最佳实践8.1 使用建议✅ 推荐做法// 1. 使用智能指针管理sptrAshmemashmemAshmem::CreateAshmem(name,size);// 2. 检查创建结果if(ashmemnullptr){// 处理错误}// 3. 检查映射结果if(!ashmem-MapReadAndWriteAshmem()){// 处理错误}// 4. 检查读写结果if(!ashmem-WriteToAshmem(data,size,offset)){// 处理错误}// 5. 使用完毕后取消映射ashmem-UnmapAshmem();// 6. 根据需要设置合适的保护标志ashmem-SetProtection(PROT_READ);// 只读共享❌ 避免的错误// 错误1: 不检查返回值sptrAshmemashmemAshmem::CreateAshmem(name,-1);// size 无效ashmem-MapReadAndWriteAshmem();// ❌ ashmem 为 nullptr// 错误2: 越界访问ashmem-WriteToAshmem(data,1024,900);// ❌ 900 1024 size// 错误3: 权限不匹配ashmem-SetProtection(PROT_READ);ashmem-MapReadAndWriteAshmem();// ❌ 映射失败// 错误4: 未映射就读写sptrAshmemashmemAshmem::CreateAshmem(name,1024);ashmem-WriteToAshmem(data,size,0);// ❌ 未映射// 错误5: 重复映射ashmem-MapReadAndWriteAshmem();ashmem-MapReadOnlyAshmem();// ❌ 应该先 UnmapAshmem8.2 性能优化场景建议大数据量使用 Ashmem 避免复制频繁读写保持映射状态避免反复 map/unmap多进程读使用只读映射提高安全性对齐访问按 4 字节或 8 字节对齐提高效率8.3 安全建议安全建议最小权限原则边界检查同步机制只读进程用 PROT_READ写入进程用 PROT_WRITE检查 offset size memorySize检查返回值多进程写入需要同步使用互斥锁或信号量8.4 调试技巧// 打印 Ashmem 状态voidDebugAshmem(constsptrAshmemashmem){std::cout Ashmem Debug std::endl;std::coutFD: ashmem-GetAshmemFd()std::endl;std::coutSize: ashmem-GetAshmemSize()std::endl;std::coutProtection: ashmem-GetProtection()std::endl;}// 检查系统 Ashmem 使用情况// cat /proc/ashmem (如果可用) API 速查表全局函数函数说明返回值AshmemCreate(name, size)创建 Ashmem 区域fdAshmemSetProt(fd, prot)设置保护标志0 成功-1 失败AshmemGetSize(fd)获取大小sizeAshmem 类方法说明返回值CreateAshmem(name, size)创建 AshmemsptrGetAshmemFd()获取文件描述符intGetAshmemSize()获取大小int32_tSetProtection(type)设置保护标志boolGetProtection()获取保护标志intMapAshmem(mapType)映射内存boolMapReadAndWriteAshmem()读写映射boolMapReadOnlyAshmem()只读映射boolUnmapAshmem()取消映射voidWriteToAshmem(data, size, offset)写入数据boolReadFromAshmem(size, offset)读取数据void*CloseAshmem()关闭void保护标志标志值说明PROT_NONE0x0不可访问PROT_READ0x1可读PROT_WRITE0x2可写PROT_EXEC0x4可执行 总结记住这三点先创建再映射才能读写用户空间权限 ≤ 内核层权限多进程写入需要同步机制
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站备案 更名平面设计跟网站建设

在人工智能技术快速演进的今天,Apertus开源语言模型以其前所未有的透明度和多语言能力,为全球AI发展开辟了全新路径。这款具备700亿和80亿参数的双版本模型,通过15万亿tokens的系统化训练,在确保完全合规的前提下实现了与闭源模型…

张小明 2026/1/20 6:15:38 网站建设

网站频道建设WordPress模板cms

微软 Edge 浏览器使用指南 在当今数字化时代,浏览器是我们访问互联网的重要工具。微软 Edge 浏览器以其快速的浏览速度和简洁的界面设计,成为了许多用户的选择。本文将详细介绍微软 Edge 浏览器的使用方法,帮助你更好地利用它在互联网上畅游。 1. 打开微软 Edge 浏览器 要…

张小明 2026/1/20 6:14:36 网站建设

温州做网站制作哪家好定制开发软件系统开发

开篇:为什么选择达梦作为你的第一个国产数据库? 随着国产化替代浪潮的到来,掌握一款国产数据库已经成为IT从业者的重要技能。达梦数据库作为国内市场份额领先、生态完善的关系型数据库,是入门国产数据库的绝佳选择。本文将为完全…

张小明 2026/1/20 6:14:05 网站建设

分局网站建设百度免费做网站

摘要:AI营销内容生产与原圈科技被普遍视为企业内容降本增效的高效结合方案。在技术能力、行业适配度和系统整合度等多个维度下,原圈科技的AI智能内容生产体系表现突出,能够有效改善传统内容生产模式下的效率与成本难题,并在服务稳…

张小明 2026/1/20 6:13:34 网站建设

建立网站模板友情链接交换的方法

1.实验目的1.掌握内核模块基本编程技术2.向内核中添加一个内核模块,打印进程控制块信息,编译模块3.加载、卸载模块2.实验截图及结果分析(1)实验截图① 编译环节② 加载模块③ 卸载模块卸载前:卸载后:④ 删除…

张小明 2026/1/20 6:13:03 网站建设