草庐IT

PACKET_MMAP

全部标签

c - 如何并行 mmap 以加快文件读取速度?

我正在处理thiscode并让mmap现在工作,但我想知道我是否可以并行使用mmap,如果可以,如何实现它。假设我的数据位于并行文件系统(GPFS、RAID0等)上,并且我想使用n进程读取它。例如,我如何让每个处理器将1/nth连续数据block读入内存?或者,或者,将每个nth内存块(1B、1MB、100MB、1GB,无论我为优化选择什么)读入内存?我在这里假设一个posix文件系统。 最佳答案 这是我用于并行读取的mpi函数。它根据pagesize将文件分成n个连续的片段,并让每个进程通过mmap读取一个单独的片段。最后需要做一

linux - mmap/dev/mem时的缓存和 volatile 内存

我有一个在内核中分配的硬件缓冲区。该缓冲区从PCIe总线接收DMA数据。然后,我从用户空间使用mmap/dev/mem将硬件缓冲区映射到我的虚拟地址空间。我的问题如下:1)mmap如何处理缓存?a)通过阅读mmap我了解到,当从用户空间写入映射区域时,我可能需要调用msync将内存的缓存版本刷新到"file"中。由于/dev/mem的实现方式不同于mmaped文件,我是否仍需要msync我的写入?b)由于我正在映射的内存是volatile内存(DMA硬件写入它),我如何保持从该内存读取的同步?如果物理内存中的硬件发生了变化,那么我已经从用户空间将更改写入缓存,然后我msync我的更改以

c++ - mmap 通过 PCI 将 VME 总线覆盖到用户空间内存中?

我正在尝试通过PCI总线将VME地址空间映射到用户空间,这样我就可以在内存上执行常规读/写操作。我已经用这样的另一个PCI设备完成了此操作:-unsignedlong*mapArea(unsignedintbarAddr,unsignedintmapSize,int*fd){unsignedlong*mem;*fd=open("/dev/mem",O_RDWR);if(*fd然后“bar”就可以正常用于读/写了。对于VME,以及TundraUniverseIIPCI-VMEBridge芯片:-我应该打开“/dev/vme_m0”吗我从哪里映射我的BAR?lspci-vv:“区域1:80

c - 在 Linux 设备驱动程序中使用 do_mmap()

我们现在工作的设备需要有一个用户空间虚拟内存地址,我们尝试使用do_mmap()如下:*uvaddr=(void*)do_mmap(0,0,size,PROT_READ|PROT_WRITE,MAP_ANONYMOUS,0);但是我们得到了以下错误Unabletohandlekernelpagingrequestfordataatad8可以在设备驱动程序中使用“do_mmap()”吗?如果没有,有什么正确的方法吗? 最佳答案 有可能do_mmap成功了,但是uvaddr没有指向存储结果的有效位置。要确定这一点,请执行以下操作:voi

c - mmap/munmap 问题 - 在第 783 次迭代后出现总线错误?

好的,这是设置:我在HPC工作,我们正在为扩展到数万个节点的需求做准备。为了解决这个问题,我实现了一个本地进程,在每个节点上缓存信息以减少网络流量。然后它通过共享内存公开此信息。基本逻辑是有一个众所周知的共享内存块,其中包含当前缓存表的名称。当更新发生时,缓存工具创建一个新的共享内存表,填充它,然后用新表的名称更新众所周知的block。代码似乎可以正常工作(例如,valgrind说没有内存泄漏)但是当我故意对其进行压力测试时,前783次更新工作得非常好-但在第784次,当我尝试更新时出现SIGBUS错误写入映射内存。如果问题是打开的文件太多(因为我正在泄漏文件描述符),我预计shm_o

c - valgrind:mmap(0x600000, 8192) 在 UME 中失败,错误 12(无法分配内存)

我正在关注thisexercise.此页面包含安装Valgrind3.6.1的说明,但我当前的Linux内核版本不支持此版本的Valgrind。因此,我安装了Valgrind3.11.0并在运行此命令之后和之后按照那里的说明进行操作:$valgrind./ex4得到这个错误:valgrind:mmap(0x600000,8192)failedinUMEwitherror12(Cannotallocatememory).我该如何解决?我正在使用内核版本为4.4.0的Ubuntu14.04LTS 最佳答案 您遇到的错误实际上是一个内核错

c - mmap 分配多个页面

所以我在x86-64linux上,当我尝试mmap一个字节时,我得到的不仅仅是一页。这是我的想法:当我分配一个字节时,之后我应该能够访问PAGE_SIZE个字节。这就是分页的工作原理,对吧?我确认我系统上的PAGE_SIZE是4096。但是,下面的代码仍然没有段错误:#include#includeintmain(){char*p=mmap(0,1,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);p[5000]=3;}5000有某个任意值大于PAGE_SIZE。我的理解是,行p[5000]=3应该产生页面错误,页面错误处理程序应

c++ - 重载新运算符以将对象存储在 mmap 文件中

我有一个需要相当大内存的LinuxC++程序。大部分内存只被几个类占用,而且访问频率相当低。我想将这些类从主内存移动到基于磁盘的存储,同时尽可能少地更改现有代码。我们的想法是为这些对象覆盖new运算符,并将它们分配到mmap()的内存区域中。这样我的代码修改就非常有限,程序的其余部分可以愉快地访问这些对象而不知道有任何更改,内核将确保我需要的对象在内存中而其他对象在磁盘上。我知道这与交换的工作方式非常相似,但交换分区通常对于我的程序需要来说太小了。我的一些问题:这是一个非常糟糕的主意吗?你知道更好的方法来实现同样的目标吗?我是否需要预先分配最大文件大小,我是否需要在磁盘上分配所有这些空

linux - mmap() : resetting old memory to a zero'd non-resident state

我正在编写内存分配例程,目前运行顺利。我使用4096字节页面中的mmap()从操作系统获取内存。当我启动我的内存分配器时,我使用mmap()分配了1gig的虚拟地址空间,然后随着分配的进行,我根据我的分配算法的细节将它分成block。我觉得一时兴起分配多达1gig的内存是安全的,因为我知道mmap()实际上不会将页面放入物理内存,直到我实际写入它们。现在,使用我的分配器的程序可能会突然需要大量内存,在这种情况下,操作系统最终必须将整个1gig的页面放入物理RAM中。问题是程序可能会进入休眠期,释放大部分1gig,然后只使用最少的内存。然而,我在分配器的MyFree()函数中真正做的就是

c - 处理进程间大文件的 mmap 和 fread

我有两个进程:进程A正在将大文件(~170GB-内容不断变化)映射到内存中以使用标志MAP_NONBLOCK和MAP_SHARED进行写入:MyDataType*myDataType;=(MyDataType*)mmap(NULL,sizeof(MyDataType),PROT_WRITE,MAP_NONBLOCK|MAP_SHARED,fileDescriptor,0);每一秒我都会调用msync:msync((void*)myDataType,sizeof(MyDataType),MS_ASYNC);这部分工作正常。当进程B试图从进程A映射到的同一个文件中读取时,进程A在大约20秒