MMAP文件映射

MMAP文件映射:

mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。 

  注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或System V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。 

首先用文件空洞和ftruncate改到4k的空间大小,把文件映射到内存里面,可提高多线程或者多进程来进行读写。

Lazy模式,在映射时会耗时;比read,write系统调用的速率高三倍

#include <sys/mman.h>
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
//从磁盘映射到内存
//start,起始点(文件开头)
//length映射多长,文件映射多少,一般是4096,用stat查看大小
//prot,内存保护标志
//flags是否可以共享的标志
//fd文件描述符
//被映射对象内容起点,相对于start的偏移数

char* pstart = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
//prot与fd属性要保持一致,位权限,rdwr
//MAP_SHARED,默认共享
int munmap(void* addr,size_t length);
//解除映射,文件从内存回归磁盘
//addr必须为共享内存最开始获得的pstart,不能偏移
//length映射的长度大小,初始获取的大小
int ret = munmap(pstart, 4096);

内存管理中,大于4k的用堆空间, 小于4k的用栈空间,MMAP不具备改变文件大小的功能

 

应用实例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc,char *argv[])
{
	if(argc!=2)
	{
		printf("error args\n");
		return -1;
	}
	int fd;
	fd=open(argv[1],O_RDWR);
	if(-1==fd)
	{
		perror("open");
		return -1;
	}
	char *pstart;
	pstart=(char*)mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
	if((char*)-1==pstart)
	{
		perror("mmap");
		return -1;
	}
	printf("%s\n",pstart);
	pstart[0]='H';
	int ret=munmap(pstart,4096);
	if(-1==ret)
	{
		perror("munmap");
		return -1;
	}
	return 0;
}

参考:https://baike.baidu.com/item/mmap/1322217?fr=aladdin

https://blog.csdn.net/ypt523/article/details/79958188

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mmap() 是一种将文件映射到内存的系统调用,它可以用于提高文件 I/O 的效率。通过 mmap(),我们可以将一个文件或者其他类型的对象(比如共享内存)映射到进程地址空间中的一段虚拟内存区域,这样就可以直接操作内存,而不需要进行繁琐的文件 I/O 操作。 mmap() 函数的原型如下: ``` void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); ``` 其中,参数的含义如下: - addr:指定映射区域的首地址,如果是 NULL,则由系统自动分配一个地址。 - length:指定映射区域的长度。 - prot:指定映射区域的保护方式,可以是以下几种组合: - PROT_READ:可读。 - PROT_WRITE:可写。 - PROT_EXEC:可执行。 - flags:指定映射区域的标志,可以是以下几种组合: - MAP_SHARED:共享映射。 - MAP_PRIVATE:私有映射。 - MAP_ANONYMOUS:匿名映射。 - fd:指定被映射文件描述符,如果是匿名映射,则该参数应该传入 -1。 - offset:指定被映射文件中的偏移量,通常应该设置为 0。 使用 mmap() 时,通常的步骤如下: 1. 打开文件并获取文件描述符。 2. 使用 mmap() 映射文件到内存中。 3. 对内存进行读写操作。 4. 使用 munmap() 取消内存映射关系。 需要注意的是,使用 mmap() 时应该遵循操作系统的内存页大小进行对齐。通常情况下,内存页大小是 4KB,可以使用 getpagesize() 函数获取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值