python共享内存mmap_用mmap()共享内存 - 我的天地

本文介绍了Python中使用mmap进行内存共享的原理和方法,详细讲解了mmap函数的参数及其作用。通过示例展示了如何在两个进程中通过mmap共享内存,并修改对方的数据。文中还提到,映射初期并未立即分配内存,而是等到访问时才触发内存分配。最后,讨论了 munmap如何将内存中的更改写回文件。
摘要由CSDN通过智能技术生成

接口:

void *mmap( void *start, size_t length, int port, int flags, int fd, off_t offset)

正常返 回映射区的地址,出错返回-1。

start 为映射区域的首地址,一般赋 值NULL通过系统自动分配。

length 为区域大小。

fd 为映射文件的文件描述符。

offset 为映 射文件的偏移,也就是从文件的offset处开始映射。

port : 映射 区域的属性值,可取PORT_EXEC, PORT_READ, PORT_WRITE, PORT_NONE,四个值,分别 是区域内可执行、可读、可写和不可访问。

flags : 映射文件属 性值,可取 MAP_ANON, MAP_PRIVATE, MAP_SHARED,分别代表匿名映射,私有copy-on -write映射,和共享映射。

MAP_ANON映射只能实现父子进程的内存共 享,因为只有父子进程有才有相同的映射后的地址空间,不同进程的内存共享需要用 MAP_SHARED通过映射文件来实现。

值得一提的是,映射的初期并没有 真正分配内存,只有访问页面的时候,引发一个缺页异常,这时才真正分配内存。

示例a.c和b.c,先建立一个文件sharefile,内容是”My name is Foo!”。

----a.c----

int main()

{

int fd;

char *prt;

char *msg="My name is Foo!";

fd=open("sharefile",O_RDWR,00777);

prt=(char*) mmap(NULL,strlen(msg)+1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

close(fd);

memcpy(prt,msg,strlen(msg)+1);

printf("%s",prt);

sleep(10); /*等待b去修改共享内存内容。*/

printf("%s",prt);

munmap(prt,strlen(msg)+1);

return 0;

}

----b.c----

int main()

{

int fd;

char *prt;

char *msg="My name is Bar!";

fd=open("sharefile",O_RDWR,00777);

prt=(char*) mmap(NULL,strlen(msg)+1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

close(fd);

memcpy(prt,msg,strlen(msg)+1);

munmap(prt,strlen(msg));

return 0;

}

运行./a 程序输出:

My name is Foo!

停止10s

My name is Foo!

先运行./a, 然后切换另一个控制台运行./b,切换回发现a的输出变为:

My name is Foo!

停止10s

My name is Bar!

可见,a内 存中的内容被b修改了~最后的munmap函数会使得映射内存中的内容写回文件中,所以 文件中的内容也变成”My name is Bar!”。

参考资料: 1. 《Computer Systems - A Programmer's Perspective》 2.《Linux Programming by Example》

Python提供了共享内存的实现方式,可以通过使用multiprocessing模块中的SharedMemory类来实现。 共享内存是一种进程间通信方式,允许两个不相关的进程访问同一段逻辑内存。这种方式非常高效,可以在进程之间共享和传递数据。共享内存的实现原理是不同进程之间连接同一段物理内存,在进程的地址空间中将这段物理内存连接起来,从而实现数据的共享。当某个进程向共享内存写入数据时,其他进程可以立即访问到这些数据的改动。 共享内存Python中的实现方式是使用SharedMemory类,通过该类可以创建共享内存对象,并在多个进程之间实现数据共享。首先,我们需要创建一个共享内存对象,可以通过指定共享内存的名称和大小来创建。然后,可以通过get_fd()方法获取共享内存的文件描述符,然后可以在其他进程中使用该文件描述符来连接到同一段共享内存。在连接到共享内存后,就可以在不同的进程中读取和写入共享内存中的数据。 总结来说,Python中的共享内存提供了一种高效的进程间通信方式,可以在不同的进程之间实现数据的共享和传递。通过使用SharedMemory类,可以创建共享内存对象,并在多个进程之间实现数据的读取和写入。这种方法可以提高程序的性能和效率,特别是在需要进程间快速交换大量数据的情况下。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python进程通信方式总结(三):共享内存](https://blog.csdn.net/submarineas/article/details/113824445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python - mmap 共享内存](https://blog.csdn.net/zywvvd/article/details/122778874)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值