当前位置:首页 > 内存 > 正文

mmap共享内存多进程修改(怎么让gpu调用共享内存)

  • 内存
  • 2024-07-01 05:03:12
  • 6732

一、javammapjavammap是什么,我们一起来了解一下吧?
Mmap将文件或其他对象映射到内存。该文件被分配到多个页面将被清除。mmap在用户空间映射的调用系统中起着主要作用。
目前Java提供的mmap只有内存文件映射,其他IO操作不具备内存映射能力。
Java内存映射文件(MemoryMappedFiles)已经在包中,但对于许多应用程序开发人员来说它们仍然是一个相当新的概念。引入NIO后,JavaIO已经相当快了,内存映射文件提供了Java中最快的IO操作。
Java中mmap有什么用?
1.使用mmap为普通文件提供内存映射I/O,以避免系统调用(read、write、lseek)带来的性能开销。同时,减少了核心缓冲区和进程地址空间中数据的副本数量。
2.使用特殊文提供匿名内存映射。
3.使用shm_open在不相关的进程之间提供Posix共享内存区域。
Java中如何使用mmap?(具体参见kafka源码中的OffsetIndex类)
操作文件相当于操作一个ByteBuffer。公共类TestMmap{undefinedpublicstaticStringpath="C:\\Users\\64371\\Desktop\\mmap";);RandomAccessFilerandomAccessFile=newRandomAccessFile(file1,"rw");intlen​​​​​​=2048;//映射为2kb,那么生成的文件也是2kbMappedByteBuffermmap=nnel().map(()READ_WRITE,0,len);n(Only());n(on());n(());//写入数据后,JVM退出之后,("a".getBytes());("b".getBytes());("c".getBytes());("d"将被强制更新".getBytes());//n(on());//n(());////();//引用OffsetIndex强制回收分配的mmap,不等待下一次GC,unmap(mmap)//在Windows上必须运行unmap(mmap)否则会出错被报告不会让我们在文件映射时更改文件长度//ption:无法在使用用户分配区域打开的文件上执行请求的操作gth(len/2);mmap=nnel().map(_WRITE,0,len/2);//映射一旦建立,就不依赖于用于创建它的文件通道,特别是,no//影响mapping的有效性.();(128,"es()[0]);}//从FileChannelImpl#unmap(privatemethod)复制privatestaticvoidunmap(MappedByteBufferbb){undefinedCleanercl=((DirectBuffer)bb).cleaner();if(cl!=null)();}}


二、嵌入式中经常使用mmap这个函数,可以介绍一下作用吗如何使用mmap函数《UNIX网络编程卷2进程间通信》介绍了mmap函数。该函数有三个主要用途:
1.将常规文件映射到内存中。一般用于需要频繁读写文件的情况。这样内存读写就替代了I/O读写。实现更高的效率;
2.特殊文件的匿名内存映射可以为关联进程提供共享内存空间;
3.为不关联的进程提供共享内存空间。记忆。
函数:void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffsize);
参数start:指向要映射的内存的起始地址,通常设置为NULL,让系统自动选择地址,并在映射成功后返回地址。
参数length:表示映射到内存的文件数量。
Prot参数:映射区域的保护方法。可以是以下方法的组合:
PROT_EXEC映射区域可以执行
PROT_READ映射区域可以读取
PROT_WRITE映射区域可以写入
映射区域PROT_NONE不能存储
参数标志:影响映射区域的各种特征。调用mmap()时必须指定MAP_SHARED或MAP_PRIVATE。
MAP_FIXED如果start参数指向的地址无法映射成功,则映射将中止,地址不会改变。通常不鼓励使用此标志。
MAP_SHARED写入映射区域的数据将被复制回文件,并且可以被映射该文件的其他进程共享。
对映射区域的MAP_PRIVATE写入操作将产生映射文件的副本,即私有的“copyonwrite”。对此区域所做的任何更改都不会覆盖原始文件的内容。
MAP_ANONYMOUS建立匿名映射。此时fd参数将被忽略,不涉及任何文件,并且映射区域无法与其他进程共享。
MAP_DENYWRITE只允许对映射区域进行写操作,其他对文件的直接写操作将被拒绝。
MAP_LOCKED锁定映射区域,意味着该区域不会被交换。
参数fd:映射到内存的文件描述符。如果使用匿名内存映射,即在flags中设置MAP_ANONYMOUS并将fd设置为-1。有些系统不支持匿名内存映射。可以使用fopen打开/dev/zero文件,然后映射该文件,以达到匿名内存映射相同的效果。
参数offset:文件映射的偏移量,通常设置为0,表示匹配文件的开头。偏移量必须是分页大小的整数倍。
返回值:
如果映射成功,则返回映射区域的内存起始地址,否则返回MAP_FAILED(-1),并说明失败原因错误存储在错误号中。
错误代码:
EBADFfd参数不是有效的文件描述符
EACCES访问权限不正确。如果是MAP_PRIVATE,则该文件必须可读。如果使用MAP_SHARED,则必须存在PROT_WRITE并且文件必须可写。
EINVAL起始、长度或偏移参数之一非法。
EAGAIN文件被锁定或锁定的内存过多。
ENOMEM没有更多内存。
mmap()系统调用有两种方式来共享内存:
(1)使用普通文件提供的内存映射:
适用于任何之间的过程。此时需要打开或创建一个文件,然后调用mmap()
典型的调用代码为:
fd=open(name,flag,mode);if(fd<0)...
ptr=mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
通过mmap()通信创建内存方法有许多特点和需要注意的要素。可以参考《UNIX网络编程》第2卷。
(2)使用特殊文件提供匿名内存映射:
适用于有亲和力的进程。由于父子进程之间有特殊的亲和力,所以先在父进程中调用mmap(),然后再调用fork()。然后,在调用fork()之后,子进程继承父进程的匿名映射地址空间,以及mmap()返回的地址。这样,父进程和子进程就可以通过映射区域进行通信。注意,这不是一般的继承关系。一般来说,子进程独立维护从父进程继承的某些变量。mmap()返回的地址由父进程和子进程共同管理。实现相关进程之间共享内存的最佳方式是使用匿名内存映射。此时不需要指定特定的文件,只需设置适当的标志即可。
本文来自CSDN博客转载请注明出处: