无处不在我看到用于python的共享内存实现(例如,在multiprocessing
中),创建共享内存始终分配新内存。有没有办法创建一个共享内存对象,并让它引用现有的内存?目的是为了预先初始化数据值,或者说,如果我们已经拥有了一个数组,例如避免必须复制到新的共享内存中。根据我的经验,分配一个大的共享数组要比将值复制到其中更快。在现有数组周围创建共享内存(python)
0
A
回答
3
简短的回答是否定的。
我是Python扩展的作者posix_ipc
1和sysv_ipc
2。就像Python的标准库中的multiprocessing
模块一样,我的模块只是操作系统提供的工具的包装器,所以您真正需要知道的是操作系统在分配共享内存时允许的内容。这对于SysV IPC和POSIX IPC有点不同,但在这种情况下,差异并不重要。 (我认为多处理在可能的情况下使用POSIX IPC。)
对于SysV IPC,分配共享内存的OS级调用是shmget()
。您可以在该调用的手册页上看到它不接受指向现有内存的指针;它总是为你分配新的记忆。对于相同呼叫的POSIX IPC版本(shm_open()
)也是如此。 POSIX IPC很有趣,因为它实现的共享内存看起来像一个内存映射文件,所以它的行为与SysV IPC有点不同。
无论是从Python还是C调用,都无法要求操作系统将现有的私有内存转换为共享内存。
如果你仔细想想,你会明白为什么。假设您可以将指向一大块私有内存的指针传递给shmget()
或shm_open()
。现在,操作系统一直在将内存保留在原来的位置,直到完成所有共享过程。如果它在你的堆栈中间呢?突然你的堆栈的这个大块不能被分配,因为其他进程正在使用它。这也意味着,当您的进程死亡时,操作系统无法释放其所有内存,因为其中一些内存正在被其他进程使用。
简而言之,你所要求的Python没有提供,因为底层的操作系统调用不允许它,而底层的操作系统调用不允许它(可能),因为它对于操作系统。
相关问题
- 1. Win CE:创建命名共享内存
- 2. 创建共享内存时出错
- 3. 共享内存sysv_ipc Python
- 4. 不能创建共享内存键12345:文件存在
- 5. 内存共享
- 6. 用Python定义GPU内存共享数组?
- 7. Python共享内存数组,无属性get_obj()
- 8. 在内存中缓存数据共享
- 9. Eclipse:在现有项目周围创建一个工作区
- 10. 在共享内存中存储和操作对象数组
- 11. 无法访问在子进程中创建的共享内存
- 12. 如何在Windows中创建共享内存池
- 13. 如何在共享内存段中创建apr_table_t类型的表?
- 14. 如何在fork或子进程之后创建共享内存?
- 15. 在共享内存中创建队列POSIX
- 16. 共享内存在Unix的
- 17. C共享内存
- 18. Linux共享内存
- 19. 共享内存段
- 20. CUDA共享内存
- 21. RDMA内存共享
- 22. 创建图形共享轴Python
- 23. 创建使用多维数组共享值的新数组值
- 24. 将结构数组保存到共享内存中
- 25. 创建多于6个子进程的共享内存出错
- 26. 从一个进程创建多个共享内存段
- 27. Linux:从shell命令创建共享内存段
- 28. 从一个进程创建多个共享内存
- 29. 以相同名称创建共享内存段 - 返回错误?
- 30. Oracle共享内存领域不存在
啊,太糟糕了,但是这对栈和栈来说是有意义的。谢谢! –