草庐IT

mmap_alloc

全部标签

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秒

linux - 如何在 Linux 系统上使用 mmap() 进行读写

我需要在Linux中使用mmap()创建一些流进流出类。为此,我尝试编写一些测试代码,将一些整数写入文件、保存、再次加载并将文件中的数据写入cout。如果该测试代码有效,那么之后进出流就不会有问题。当我刚开始的时候,我遇到了段错误,如果我没有得到,什么都没有发生,所以我用谷歌搜索了一下。我找到这本书了http://www.advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf在第107页附近有一些有用的代码。我复制粘贴了该代码并做了一些小改动,得到了这段代码:intfd;void*file_memory;/*Prepareafi

linux mmap从用户空间应用程序访问PCI内存区域

作为我的PCI驱动程序的第一级测试,我希望我可以通过/sys/bus/pci/devices/0000:01:00.0/resource0访问pci_iomap区域来self的用户应用程序的文件。mmap的手册页、我找到的示例程序和其他帖子似乎表明用户进程访问应该有效。但是一些文章似乎表明mmap调用需要通过ioctl访问器从内核中完成。我的问题是PCIsysfs资源文件的mmap()应该从应用程序空间工作吗?当我运行我的代码时,mmap返回了一个看似有效的地址,但当我尝试访问该虚拟地址时却收到了总线错误。我相信我的终端设备是FPGA上的PCI到XilinxAXI桥接器,运行正常,因为

linux - mmap() 使用进程虚拟内存布局的哪一部分?

mmap()函数应在进程虚拟地址空间和设备文件或物理内存区域之间建立映射。一个进程虚拟内存布局有以下部分:进程虚拟地址空间的哪个区域mmap()用于映射? 最佳答案 mmap使用“未分配的内存”。请注意,您绘制的图片不太可能用于任何低于30年的UNIX系统。UNIXused在70年代早期确实有这种内存布局,但现在情况要复杂得多,尤其是在使用共享库时。 关于linux-mmap()使用进程虚拟内存布局的哪一部分?,我们在StackOverflow上找到一个类似的问题:

c - 为什么在 POSIX 中创建消息队列时出现错误 "Cannot Allocate Memory"?

为什么在POSIX中创建消息队列时出现“无法分配内存”错误? 最佳答案 Adrian的回答是正确的,但由于这是一个令人沮丧的常见错误,当第一次尝试将POSIX消息队列用于任何非平凡的事情时,在Linux上会遇到这个错误,我想我应该添加一些有用的细节。首先,要了解RLIMIT_MSGQUEUE资源限制,请参阅mansetrlimit中的公式:RLIMIT_MSGQUEUE(SinceLinux2.6.8)SpecifiesthelimitonthenumberofbytesthatcanbeallocatedforPOSIXmessa

c++ - mmap 用于写入顺序日志文件以提高速度?

我想写日志文件,非结构化格式(一次一行),使用mmap(为了速度)。最好的程序是什么?我是否打开空文件,截断到1页大小(写入空字符串以调整文件大小?),然后mmap-并在mmap区域已满时重复?我通常使用mmap来编写固定大小的结构,通常一次只写一页,但是这是用于使用mmap编写日志文件(0.5-10Gb的任何地方)但不确定是什么填充第一个mmaped区域后的最佳实践-munmap,调整文件大小truncate和mmap下一页?在将日志写入内存区域时,我会跟踪大小和msync,一旦我到达映射内存区域的末尾,正确的处理是什么?假设我永远不需要返回或覆盖现有数据,所以我只将新数据写入文件。

linux - mmap 的大小限制是多少

我正在使用mmap()将共享内存对象映射到进程。我的问题分为两部分:1)mmap()对linux进程的大小限制是多少?(有这样的限制吗?)2)进程运行一段时间后,我认为进程虚拟内存地址空间会莫名其妙地碎片化。这会影响我在此过程中可以执行的最大大小mmap()吗?使用的linux内核是2.6.27。共享内存对象的大小约为32MB。我正在尝试访问mmap()由于没有足够的虚拟地址空间而导致此类共享内存对象失败的可能性。 最佳答案 mmap大小没有限制,但取决于给定进程使用的现有地址空间。但强烈建议您不要mmap到一个大的连续虚拟地址空间

python - 使用 mmap 增加文件的大小

在Windows上的Python中,我可以通过以下方式创建一个大文件frommmapimportmmapf=open('big.file','w')f.close()f=open('big.file','r+')m=mmap(f.fileno(),10**9)现在big.file是(大约)1GB。但是,在Linux上,这将返回ValueError:mmaplengthisgreaterthanfilesize。有没有办法在Linux上获得与在Windows上相同的行为?也就是说,能够使用mmap增加文件的大小吗? 最佳答案 至少在P

c - 地址空间布局随机化 ( ALSR ) 和 mmap

我预计,由于地址空间布局随机化(ALSR),从另一个进程派生的进程在调用mmap时将返回不同的地址。但正如我发现的那样,事实并非如此。为此,我制作了以下测试程序。malloc返回的所有地址对于父项和子项都是完全相同的。请注意,cl1、cl2、pl1、pl2的malloc在内部使用mmap因为它们是大块。所以,我的问题是,为什么即使存在ALSR,mmap也不会返回不同的地址。可能是因为这里的随机化种子对于原始进程和fork进程是相同的。还是有其他原因?intmain(){pid=fork();if(pid==0)//child{void*c1=malloc(4096);void*c2=m

c - 在没有先调用 munmap() 的情况下关闭文件描述符后,mmap() 指针的行为是什么?

考虑以下代码片段:#include#include#include#includeintfd=open("/path/to/existing/file/or/device",O_RDONLY);intnumberOfWords=4096;//chosentobesmallerthanfilesizeint*data=mmap(NULL,nomberOfWords*sizeof(int),PROT_READ,MAP_SHARED,fd,0);if(data!=MAP_FAILED){printf("%d\n",data[0]);//oops,forgottomunmapclose(fd)