2017-02-04 65 views
0

无处不在我看到用于python的共享内存实现(例如,在multiprocessing中),创建共享内存始终分配新内存。有没有办法创建一个共享内存对象,并让它引用现有的内存?目的是为了预先初始化数据值,或者说,如果我们已经拥有了一个数组,例如避免必须复制到新的共享内存中。根据我的经验,分配一个大的共享数组要比将值复制到其中更快。在现有数组周围创建共享内存(python)

回答

3

简短的回答是否定的。

我是Python扩展的作者posix_ipc1sysv_ipc2。就像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没有提供,因为底层的操作系统调用不允许它,而底层的操作系统调用不允许它(可能),因为它对于操作系统。

+0

啊,太糟糕了,但是这对栈和栈来说是有意义的。谢谢! –