2017-02-04 53 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

啊,太糟糕了,但是這對棧和棧來說是有意義的。謝謝! –