在现有数组周围创建共享内存 (python)

create shared memory around existing array (python)

我到处都看到 python 的共享内存实现(例如在 multiprocessing 中),创建共享内存总是分配新内存。有没有办法创建共享内存对象并让它引用现有内存?目的是预初始化数据值,或者更确切地说,如果我们已经有了,比如说,手头有一个数组,就可以避免复制到新的共享内存中。根据我的经验,分配大型共享数组比将值复制到其中要快得多。

简短的回答是否定的。

我是 Python 扩展 posix_ipc1 and sysv_ipc2 的作者。就像来自标准库的 Python 的 multiprocessing 模块一样,我的模块只是操作系统提供的设施的包装器,所以你真正需要知道的是 OS 在分配时允许什么共享内存。 SysV IPC 和 POSIX IPC 略有不同,但在这种情况下,差异并不重要。 (我认为 multiprocessing 在可能的情况下使用 POSIX IPC。)

对于 SysV IPC,分配共享内存的 OS-level 调用是 shmget()。您可以在该调用的手册页上看到它不接受指向现有内存的指针;它总是为你分配新的内存。相同调用的 POSIX IPC 版本 (shm_open()) 也是如此。 POSIX IPC 很有趣,因为它实现了共享内存,看起来像一个内存映射文件,所以它的行为与 SysV IPC 有点不同。

无论是从 Python 还是 C 调用,都没有要求操作系统将现有的私有内存块转换为共享内存的选项。

如果你仔细想想,你就会明白为什么。假设您可以将指向一块私有内存的指针传递给 shmget()shm_open()。现在,操作系统的任务是将内存保留在原处,直到所有共享进程都用它完成。如果它在你的堆栈中间怎么办?突然,你的堆栈中的这一大块无法分配,因为其他进程正在使用它。这也意味着当您的进程终止时,OS 无法释放其所有内存,因为其中一些内存正在被其他进程使用。

简而言之,您向 Python 请求的内容并未提供,因为基础 OS 调用不允许,而基础 OS 调用不允许不允许(可能)因为它对 OS.

来说真的很乱