草庐IT

packet_mmap

全部标签

c - mmap函数中的MAP_SHARED和MAP_PRIVATE有什么区别?

为了好玩而使用mmap,我有以下代码:(..snip..)fd=open("/home/me/straight_a.txt",O_RDONLY);if(fd==-1){perror("open");exit(1);}m=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_FILE|MAP_PRIVATE,fd,0);if(m==MAP_FAILED){perror("mmap");exit(1);}printf("mis%p\n",m);printf("*m=%c\n",*m);printf("*(m+1)=%c\n",*(m+1));(..snip..)这

c - mmap 与/开发/零

假设我使用/dev/zero为mmap分配了一个大内存(40MB),如下所示。fd=open("/dev/zero",O_RDWR);a=mmap(0,4096e4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FILE,fd,0);我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我想现代Linux内核使用Demandpaging)。因此,例如,当第一页被触及并因此被带入物理内存时,内核会将其所有4096字节初始化为零,然后当第二页被触及时,它会执行相同的操作,依此类推。我的理解正确吗? 最佳答案

c - mmap 与/开发/零

假设我使用/dev/zero为mmap分配了一个大内存(40MB),如下所示。fd=open("/dev/zero",O_RDWR);a=mmap(0,4096e4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FILE,fd,0);我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我想现代Linux内核使用Demandpaging)。因此,例如,当第一页被触及并因此被带入物理内存时,内核会将其所有4096字节初始化为零,然后当第二页被触及时,它会执行相同的操作,依此类推。我的理解正确吗? 最佳答案

c - 当还使用 PROT_READ 时,mmap MAP_SHARED 和 MAP_PRIVATE 之间有区别吗?

如果我创建一个mmap(2)文件,其prot参数仅为PROT_READ并且支持它的文件也被读取-仅且不变,MAP_SHARED和MAP_PRIVATE之间是否存在任何性能差异(或任何差异)?内核会在两者之间做一些不同的事情吗?(文档仅提及“更新”方面的行为差异,但因为它是PROT_READ,所以不可能没有更新。我想知道是否还有其他差异?) 最佳答案 在MAP_PRIVATE下,Linux联机帮助页指出未指定在映射区域中是否可见调用mmap()后对文件所做的更改。MAP_SHARED不是这种情况。所以如果你需要映射的内容和文件的内容一

c - 当还使用 PROT_READ 时,mmap MAP_SHARED 和 MAP_PRIVATE 之间有区别吗?

如果我创建一个mmap(2)文件,其prot参数仅为PROT_READ并且支持它的文件也被读取-仅且不变,MAP_SHARED和MAP_PRIVATE之间是否存在任何性能差异(或任何差异)?内核会在两者之间做一些不同的事情吗?(文档仅提及“更新”方面的行为差异,但因为它是PROT_READ,所以不可能没有更新。我想知道是否还有其他差异?) 最佳答案 在MAP_PRIVATE下,Linux联机帮助页指出未指定在映射区域中是否可见调用mmap()后对文件所做的更改。MAP_SHARED不是这种情况。所以如果你需要映射的内容和文件的内容一

c - 通过使用 mmap() 在进程之间共享内存

我在Linux2.6中。我有一个环境,其中2个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。我有一个客户端进程(从父进程派生,即服务器),它将结构(消息)写入(在派生之后)创建的内存映射区域:消息*m=mmap(NULL,sizeof(message),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)然后这个指针被写入一个队列(以链表的形式)到另一个共享内存区域,这是服务器和客户端进程共有的(因为if是在fork之前用上面相同的代码创建的)。然后服务器读取该区域,服务器获取指向消息的指针并对其进行处理。问题是*m是在

c - 通过使用 mmap() 在进程之间共享内存

我在Linux2.6中。我有一个环境,其中2个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。我有一个客户端进程(从父进程派生,即服务器),它将结构(消息)写入(在派生之后)创建的内存映射区域:消息*m=mmap(NULL,sizeof(message),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)然后这个指针被写入一个队列(以链表的形式)到另一个共享内存区域,这是服务器和客户端进程共有的(因为if是在fork之前用上面相同的代码创建的)。然后服务器读取该区域,服务器获取指向消息的指针并对其进行处理。问题是*m是在

c - 如果我使用 mmap 而不是 malloc 分配内存会怎样?

与使用malloc相比,使用mmap(使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存有什么缺点?对于函数作用域中的数据,无论如何我都会使用堆栈内存,因此不会使用malloc.我想到的一个缺点是对于动态数据结构,例如树和链表,您经常需要分配和释放小块数据。使用mmap会很昂贵,原因有两个,一个是在4096字节的粒度上分配,另一个是需要进行系统调用。但是在其他场景下,你觉得malloc比mmap好吗?其次,我是否高估了mmap对于动态数据结构的劣势?mmap优于malloc我能想到的一个优点是,当您执行munmap时,内存会立即返回给操作系统,而使用malloc/free

c - 如果我使用 mmap 而不是 malloc 分配内存会怎样?

与使用malloc相比,使用mmap(使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存有什么缺点?对于函数作用域中的数据,无论如何我都会使用堆栈内存,因此不会使用malloc.我想到的一个缺点是对于动态数据结构,例如树和链表,您经常需要分配和释放小块数据。使用mmap会很昂贵,原因有两个,一个是在4096字节的粒度上分配,另一个是需要进行系统调用。但是在其他场景下,你觉得malloc比mmap好吗?其次,我是否高估了mmap对于动态数据结构的劣势?mmap优于malloc我能想到的一个优点是,当您执行munmap时,内存会立即返回给操作系统,而使用malloc/free

c - mmap、msync 和 linux 进程终止

我想使用mmap在Linux下运行的C程序中实现程序状态某些部分的持久化,方法是使用带有MAP_SHARED标志集的mmap()将固定大小的结构与众所周知的文件名相关联。出于性能原因,我宁愿根本不调用msync(),并且没有其他程序会访问该文件。当我的程序终止并重新启动时,它将再次映射同一个文件并对它进行一些处理以恢复它在终止之前所处的状态。我的问题是:如果我从不在文件描述符上调用msync(),即使我的进程被SIGKILL终止,内核是否会保证所有对内存的更新都将写入磁盘并随后可恢复?此外,即使我的程序从不调用msync(),内核是否会定期将页面写入磁盘而产生一般系统开销?编辑:我已经