無處不在我看到用於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. Python共享讀取內存
- 5. 如何與shm_open共享現有內存?
- 6. Bzr:從現有獨立存儲庫創建共享存儲庫
- 7. C++ WIN32在共享內存中創建一個整數和布爾值數組
- 8. 在沒有共享內存的共享內存中創建像PyOpenCL一樣的模板
- 9. 在共享內存
- 10. C++:數組和共享內存
- 11. IPC與共享內存的共享內存有什麼區別?
- 12. 不能創建共享內存鍵12345:文件存在
- 13. 內存共享
- 14. 用Python定義GPU內存共享數組?
- 15. Python共享內存數組,無屬性get_obj()
- 16. 在內存中緩存數據共享
- 17. Eclipse:在現有項目周圍創建一個工作區
- 18. cuda從全局內存複製數組到共享內存
- 19. 在共享內存中存儲和操作對象數組
- 20. 檢查共享內存是否存在,以及是否存在共享內存
- 21. 如何在C中的共享內存中創建信號燈?
- 22. 確定哪個進程在Windows中創建共享內存
- 23. 如何在fork或子進程之後創建共享內存?
- 24. CreateFileMapping用於在win32中創建共享內存
- 25. 如何在Windows中創建共享內存池
- 26. 無法訪問在子進程中創建的共享內存
- 27. 在共享內存中創建隊列POSIX
- 28. 如何在共享內存段中創建apr_table_t類型的表?
- 29. 使用共享內存實現管道
- 30. 如何創建共享磁頭內存exe和dll /共享對象
啊,太糟糕了,但是這對棧和棧來說是有意義的。謝謝! –