精华内容
下载资源
问答
  • 内存共享实例.rar 内存共享实例.rar 内存共享实例.rar 内存共享实例.rar 内存共享实例.rar 内存共享实例.rar
  • 最近研究Android6.0流媒体传输,用到了Android里面的内存共享(Ashmem匿名共享),研究了两天怎么用的,现在分享一下: 1、Java层使用内存共享:关键MemoryFile的类。 1.1 service 初始化 1.2 service 写数据 1.3...

    最近研究Android6.0流媒体传输,用到了Android里面的内存共享(Ashmem匿名共享),研究了两天怎么用的,现在分享一下:

    1、Java层使用内存共享:关键MemoryFile的类。

    1.1 service 初始化



    1.2 service 写数据




    1.3 获取文件描述符传递给别的进程使用。


    1.4 别的进程拿到文件描述符后读取数据:



      2  Native 层内存共享,用到的关键类,MemoryDealer、IMemory、IMemoryHeap 三个类。

    2.1 创建共享内存



    2.2  Bp 端传输IMemory


    2.3 客户端JNI 获取数据,或者上传给java层




    2.4 java层的使用 和1.4 一样就不在描述了。


    展开全文
  • c# 内存共享操作,可以创建、读取、写入内存共享区,
  • delphi内存共享

    热门讨论 2008-12-07 17:33:59
    delphi内存共享的详细案例,有需要的朋友可以看看
  • 内存共享示例(C#)

    2009-06-29 19:03:08
    内存共享示例(C#) 内存共享示例(C#) 内存共享示例(C#)
  • 一、简介 共享内存允许两个进程访问同一块内存区域,它们使用同一个 key 值标记。 二、特点 优点: 通信方便,两个进程也是直接访问同一块内存区域,减少了数据复制的操作,速度上...2. 创建内存共享区 int sh...

    一、简介

    共享内存允许两个进程访问同一块内存区域,它们使用同一个 key 值标记。

    二、特点

    优点:

    通信方便,两个进程也是直接访问同一块内存区域,减少了数据复制的操作,速度上也有明显优势。

    缺点:

    没有提供同步机制,往往需要我们使用其它(例如信号)等手段实现进程的同步工作。

    三、API 说明

    1. 头文件

    #include <sys/shm.h>
    

    2. 创建内存共享区

    int shmget(key_t key, size_t size, int shmflg);
    
    • key : 一个非零整数,两个进程需保持一致,即两个进程之间通信的钥匙
    • size : 申请的共享区的大小,单位是字节。需要是内存页大小的整数倍
    • shmflg : 同 open 函数的 mode 参数,设置文件访问权限,这里额外多出一个 IPC_CREATIPC_EXCL,可与 mode 进行或操作。IPC_CREAT 表示共享区不存在则创建,IPC_EXCLIPC_CREAT 共同使用,表示共享区已存在则返回错误。如 0644 | IPC_CREAT
    • 返回值 : 返回共享区域的 id 值,用于唯一识别该区域

    3. 映射内存共享区

    void *shmat(int shmid, const void *shmaddr, int shmflg);
    

    at 是 attach 的意思。创建内存共享后,还不能被任何进程使用,需要使用该函数启动对共享内存的访问。

    • shmid : 创建时候返回的 id 值
    • shmaddr : 将共享内存映射到指定地址,可以为 NULL,此时系统将自动分配地址
    • shmflg : 同 shmget 函数中的参数,通常为 0
    • 返回值 : 成功执行后,返回该地址的起始地址,失败返回 -1

    4. 撤销映射

    int shmdt(const void *shmaddr);
    

    dt 是 detach 的意思。用于将共享内存从该进程中分离,但并不会删除共享内存。

    • shmaddr : shmat 函数返回的地址
    • 返回值 : 成功返回 0,失败返回 -1,errno 将被设置为相应的值

    5. 删除内存共享区

    int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    

    ctl 是 control 的意思。该函数用于查询、更新、删除共享区域。共享内存不使用后必须删除,以便回收内存。

    • shmid : 创建时候返回的 id 值
    • cmd : 控制命令。
      • IPC_STAT 状态查询
      • IPC_SET 在权限允许下,将共享内存状态更新为 buf 中的数据
      • IPC_RMID 删除共享内存
    • 返回值 : 成功返回 0,失败返回 -1,errno 将被设置为相应的值

    四、示例

    1. 写端

    #include <sys/shm.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
     
    int main() {
        void *shmaddr = NULL;
        const char data[] = "Hello World\n";
        int shmid;
        key_t key = (key_t) 666;
        long page_size = sysconf(_SC_PAGESIZE);
        int data_size =  (strlen(data) + page_size - 1) & (~(page_size - 1));
        printf("data size: %d, page size: %ld\n", data_size, page_size);
     
        // 1. create shared memory
        shmid = shmget(key, data_size, 0644 | IPC_CREAT);
        if (shmid == -1) {
            perror("shmget failed\n");
            exit(EXIT_FAILURE);
        }
     
        // 2. attach shared memory
        shmaddr = shmat(shmid, NULL, 0);
        if (shmaddr == (void *)-1) {
            perror("shmat failed\n");
            exit(EXIT_FAILURE);
        }
     
        // 3. write data to shared memory
        memset(shmaddr, 0, data_size);
        memcpy(shmaddr, &data, strlen(data));
     
        // 4. detach shared memory
        if (shmdt(shmaddr) == -1) {
            perror("shmdt failed\n");
            exit(EXIT_FAILURE);
        }
     
        printf("write done !\n");
        return 0;
    }
    

    2. 读端

    #include <sys/shm.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
     
    int main() {
        void *shmaddr = NULL;
        const char data[] = "Hello World\n";
        int shmid;
        key_t key = (key_t) 666;
        long page_size = sysconf(_SC_PAGESIZE);
        int data_size =  (strlen(data) + page_size - 1) & (~(page_size - 1));
        printf("data size: %d, page size: %ld\n", data_size, page_size);
     
        // 1. create shared memory
        shmid = shmget(key, data_size, 0644 | IPC_CREAT);
        if (shmid == -1) {
            perror("shmget failed\n");
            exit(EXIT_FAILURE);
        }
     
        // 2. attach shared memory
        shmaddr = shmat(shmid, NULL, 0);
        if (shmaddr == (void *)-1) {
            perror("shmat failed\n");
            exit(EXIT_FAILURE);
        }
     
        // 3. read data to shared memory
        printf("read form shead memory: %s\n", (char *)shmaddr);
     
        // 4. detach shared memory
        if (shmdt(shmaddr) == -1) {
            perror("shmdt failed\n");
            exit(EXIT_FAILURE);
        }
     
        // 5. delete shared memory
        if (shmctl(shmid, IPC_RMID, 0) == -1) {
            perror("shmctl delete shared memory failed\n");
            exit(EXIT_FAILURE);
        }
     
        return 0;
    }
    

    3. 执行结果

    第一次执行写进程,往 shared memory 中写入了 “Hello World”,再执行读进程,读出并打印 shared memory 中的内容,并删除掉共享内存。
    在这里插入图片描述

    展开全文
  •  通过使用“内存映射文件”,实现内存共享 二.主要操作  共享内存结构:  PShareMem = ^TShareMem;  TShareMem = Record  id:string[10];  name:string[20];  age:Integer; end;  基本变量...

    一.原理

        通过使用“内存映射文件”,实现内存共享

    二.主要操作

        共享内存结构:

      PShareMem = ^TShareMem;
      TShareMem = Record
        id:string[10];
        name:string[20];
        age:Integer;  end;

        基本变量:

        shareMemName:string; //共享内存名
        fileHandle : THandle;//内存映射文件句柄
        pUserInfoShareMem : PShareMem;//指向共享内存的指针

        a)写入程序

            1)创建“内存映射文件”

       //=CreateFileMapping($FFFFFFFF, , PAGE_READWRITE, , SizeOf(TShareMem), PChar(shareMemName));
     fileHandle <>  
       ;

            2)建立映射关系

      //将“内存映射文件”与“应用程序地址空间”建立映射关系
      pUserInfoShareMem:=MapViewOfFile(fileHandle,FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem));  if pUserInfoShareMem <> nil then
      begin
         Self.Memo1.Lines.Add('已成功建立映射关系!');  end;

            3)写入信息

       pUserInfoShareMem.id:='8888';
       pUserInfoShareMem.name:='Terry';
       pUserInfoShareMem.age:=25;
       Self.Memo1.Lines.Add('已向共享内存中写入用户信息!');

            4)解除映射关系

      //解除“内存映射文件”与“应用程序地址空间”的映射关系  if pUserInfoShareMem<> nil then
         UnmapViewOfFile(pUserInfoShareMem);
      Self.Memo1.Lines.Add('已成功解除映射关系!');

            5)关闭“内存映射文件”

      //关闭内存映射文件  if fileHandle<> 0 then
         CloseHandle(fileHandle);
      Self.Memo1.Lines.Add('已成功关闭内存映射文件!');

     

        b)读取程序

            1)打开“内存映射文件”

     fileHandle:=OpenFileMapping(FILE_MAP_ALL_ACCESS,false,pchar(shareMemName));  if self.FileHandle <> 0 then
      begin
        Self.Memo1.Lines.Add('已成功打开内存映射文件!')  end;

            2)建立映射关系

       pUserInfoShareMem:= MapViewOfFile(self.FileHandle,windows.FILE_MAP_ALL_ACCESS,0,0,sizeof(TShareMem));   if pUserInfoShareMem <> nil then
       begin
         Self.Memo1.Lines.Add('已成功建立映射关系!');   end;

            3)读取信息

       if pUserInfoShareMem <> nil then
       begin
          userInfoStr:='共享内存中获取的用户信息如下:'+#13#10;
          userInfoStr:=userInfoStr+'用户Id号:'+pUserInfoShareMem.id+#13#10;
          userInfoStr:=userInfoStr+'用户姓名:'+pUserInfoShareMem.name+#13#10;
          userInfoStr:=userInfoStr+'用户年龄:'+IntToStr(pUserInfoShareMem.age);
          Self.Memo1.Lines.Add(userInfoStr);   end;

            4)解除映射关系

      if pUserInfoShareMem<> nil then
         UnmapViewOfFile(pUserInfoShareMem);
      Self.Memo1.Lines.Add('已成功解除映射关系!');

            5)关闭“内存映射文件”

      if fileHandle<> 0 then
         CloseHandle(fileHandle);
      Self.Memo1.Lines.Add('已成功关闭内存映射文件!');

     

        c)交互顺序

           1)“写入程序”创建共享内存,并写入信息

               

           2)“读取程序”从共享内存读取信息,并解除映射,关闭文件

               

           3) “写入程序”解除映射,关闭文件

              

     

         PS:“写入程序”解除映射关系,关闭内存映射文件对“读取程序”的影响。
              1) 写入程序解除映射关系,不影响读取程序的读取操作关闭内存映射文件,会

                 影响读取程序的读取操作
              2) 解除映射关系与关闭内存映射文件无顺序要求,及时不解除映射关系也可直

                 接关闭内存映射文件
              3) 两个程序通讯时,要使用sendmessage,同步操作,而不是postmessage,

                 防止前者已关闭内存映射文件,而后者还没读取。


    出自:http://www.cnblogs.com/python001/

    展开全文
  • 本篇我们回到ROS的内部,看看如何实现ROS节点间的内存共享,以实现更加快速的内部通信。 首先,我们需要清楚为什么要用内存共享? 答案是ROS提供的服务或者话题都是通过网络来实现的。这样做虽然更具普遍性,照顾...

    上一篇文章我们介绍了怎么在ROS中应用LCM与外部进行通信。本篇我们回到ROS的内部,看看如何实现ROS节点间的内存共享,以实现更加快速的内部通信。

    首先,我们需要清楚为什么要用内存共享?

    答案是ROS提供的服务或者话题都是通过网络来实现的。这样做虽然更具普遍性,照顾到ROS节点可能架设在不同的硬件上这一点,然对于在同一台设备的两个节点间传输数据是非常不友好的。因为其既没必要性又浪费大量资源,且效率低下,容易造成网络堵塞,延时严重。

    那么怎么改善最好呢,自然是进程间的内存共享。我们直接让两个节点共享一片物理内存,在里面做一个队列数据结构,一个往里面写,一个去里面读。

    下面我们就来实现这一功能。跟上篇文章一样,我们先实现纯净的Linux C++版本,然后再把代码移植到ROS的节点中。

    实现Linux进程间的内存共享,主要参考这篇文章(因为写的很好,运行顺利,这部分只做了一点点修改,其他照抄,见谅见谅):

    “写”进程,流程如下:

    1) 获得key, ftok()

    2) 使用key来创建一个共享内存 shmget() 

    3) 映射共享内存(得到虚拟地址), shmat()

    4) 使用共享内存, 往共享内存中写入数据

    5) 解除映射 shmdt()

    6) 如果共

    展开全文
  • linux进程间通信———内存共享

    千次阅读 2017-03-16 19:08:23
    共享内存(shared memory):是linux下的多进程之间的通信方法,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。共享内存指在多处理器的计算机系统中,可以被不同中央处理...
  • SurfaceFlinger GraphicBuffer内存共享缓冲区机制

    万次阅读 多人点赞 2012-04-23 15:48:48
    GraphicBuffer 是 Surface 系统中用于GDI内存共享缓冲区管理类,封装了与硬件相关的细节,从而简化应用层的处理逻辑 SurfaceFlinger是个服务端,而每个请求服务的应用程序都对应一个Client端,Surface绘图由...
  • 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝),引用计数实现
  • Linux进程间内存共享机制mmap详解

    万次阅读 2015-08-28 13:30:12
    共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何 ...只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程
  • linux 下的内存共享

    千次阅读 2013-09-27 14:37:56
    共享内存是最快的进程间...实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域,而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没
  • 多核DSP的IPC模块中的SharedRegion模块,利用SharedRegion来进行多核DSP,核间内存共享,多核DSP教程及相关例程
  • MFC写的程序,自己对共享内存的一点理解,赶紧记下来方便今后对照、修改。
  • 内存共享CreateFileMapping用法

    千次阅读 2014-09-19 10:41:28
     这个就是我今天测试的时候碰壁的祸根, 因为为了对于内存进行互斥访问, 我设置了一个互斥句柄, 而名称我选择和命名共享内存同名, 之下就是因为他们使用共同的namespace导致了错误, 呵呵. 7) 调用...
  • python 多进程之间内存共享

    千次阅读 2019-09-14 10:33:30
    进程是一个独立的资源管理单元,不同进程间的资源是独立的,不能在一个进程中访问另一个进程的用户空间和内存空间。但是,进程不是孤立的,不同进程之间需要信息的交互和状态的传递,因此需要进程间数据的传递、同步...
  • 共享内存的步骤为:CreateFileMapping创建共享内存空间;OpenFileMapping打开共享内存,返回HANDLE型句柄;MapViewOfFile获取内存映射到该程序的内存,可以进行读写操作。  在实验中遇到了意外的情况,具体应用...
  • [转] Delphi7 内存管理及 FastMM 研究 (对于EXE和DLL内存共享很有用) 故国之晚秋 发表于2010-12-06 19:34 浏览(32) 评论(0) 分类:我的日记  举报 引自:...
  • 所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享...
  • 首先先使用shmget建立一块共享内存,然后向该内存中写入数据并返回该共享内存shmid 使用另一个程序通过上一程序返回的shmid读该共享内存内的数据 建立共享内存并写入数据的程序 #include #include #include ...
  • C#进程同步之内存共享

    千次阅读 2015-08-03 20:15:03
    //内存写 using System; using System.IO; using System.IO.MemoryMappedFiles; using System.Threading; namespace memoryWrite { class Program { static void Main(string[] args) {
  • 关于Swoole中内存共享和热重启

    千次阅读 2016-03-20 22:53:48
    热重启的基本业务逻辑是,将变动性大的业务逻辑加载过程放在OnWorkerStart方法中。...OnWorkerStart之后加载的代码都在各自进程中,OnWorkerStart之前加载的代码属于共享内存。 OnWorkerStart会由Worker或Task
  • http://blog.csdn.net/great3779/article/details/7226388 http://blog.csdn.net/great3779/article/details/7240271 ...匿名互斥量举例 想象两个进程需要往一个共享内存中的循环缓冲区中写
  • 两个或多个进程之间通过Win32 API实现内存共享的方法(转) 作者: 未知本文讨论Windows 95环境下,两个或多个进程之间通过Win32 API实现内存共享的方法。共享内存的方法可以归纳为四种:内存映像文件、共享内存页、...
  • 对线程间共享内存的问题,许多同学是不是都觉得很简单?就是用全局变量来共享码,然而你说的并没有什么卵用…….(^__^)……. 对于线程间内存关系不弄得清清楚楚,很难写好多线程程序。最简练而精准的话来形容线程间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 941,609
精华内容 376,643
关键字:

内存共享