我有一個C++應用程序,通過shmget(2)在Linux系統上分配共享內存。我在共享內存中存儲的數據會週期性地增長,我想以類似於realloc()增長常規內存的方式調整共享內存的大小。有沒有辦法做到這一點?我在IBM的網站上發現了一個提到SHM_SIZE命令的文檔,但是Linux和BSD手冊頁沒有,即使在Linux特定部分也是如此。我可以使用shmctl調整Linux共享內存嗎?
回答
簡單的答案:沒有簡單的方法。
原因很合理。共享內存正逐個附加到每個進程的虛擬空間。每個進程都有自己的虛擬地址空間。每個進程都可以自由地附加在任何段(並非字面上,對齊設置一些限制)任意地址。系統如何保證,比如說,通過擴大面積4MiB,這個細分市場的每個'用戶'都能夠適合bigget塊在相同的起始地址那裏較小的細分市場以前是?
但你不應該放棄!您可以富有創意。你可以想出一個頭段段的概念,在那裏存儲有關真實有效載荷段的信息。您可以使每個進程遵守一些規則,例如:重新附加有效負載段,當其ID爲標頭段,與已知不匹配時。
建議:我懷疑你知道這一點,但絕不保持指向數據共享區域內,只有偏移。
我希望你能有一些用我的胡言亂語。
謝謝,這非常有幫助! – 2016-09-20 19:33:45
在我看來,你可以爲自己的目的編寫自己的內存管理器。這個概念很簡單:
- 您有一個共享內存塊,其大小爲
N
字節; - 用
2*N
大小分配新的共享內存塊; - 將存儲器從一個塊複製到另一個塊;
- 釋放舊的共享內存塊;
- 把#2-4換成一些程序並使用它;
恐怕我們沒有更多的事情要做。這是如何實現std::vector
。在大多數情況下,void *realloc()
會返回指向新內存塊的指針(但不包括擴展的舊塊)。
我相信這樣做會使這種內存的'共享'屬性不存在。 – GreenScape 2014-05-28 06:51:18
- 1. 用shmctl刪除共享內存段
- 2. CUDA,可以使用共享內存提高我的性能嗎?
- 3. 我可以使用帶有共享內存的MPI嗎
- 4. 誰可以在Linux共享共享內存?
- 5. Linux共享內存
- 6. 在共享主機Linux帳戶上使用共享內存
- 7. Windows:調整共享內存的大小
- 8. 調整共享內存的大小
- 9. 多個JVM進程可以共享公共類的內存嗎?
- 10. 我可以在Windows和Linux之間共享docker映像嗎?
- 11. 參考存儲庫可以共享嗎?
- 12. 我可以與Facebook Graph API共享嗎?
- 13. MySQL:我可以共享枚舉嗎?
- 14. 我可以在iCloud上共享CoreData嗎?
- 15. Path.GetTempFileName() - 我可以更改它以使用共享驅動器嗎?
- 16. 是否可以在共享內存中加載共享庫?
- 17. 可以兩個進程共享相同的GPU內存嗎? (CUDA)
- 18. 多個Django站點可以共享內存嗎?
- 19. 多個進程可以共享堆內存嗎?
- 20. 多個線程可以同時訪問共享內存嗎?
- 21. 鎖定可共享內存
- 22. Linux的RSS和共享內存
- 23. c/linux-ftruncate和POSIX共享內存段
- 24. Linux共享內存分段故障
- 25. Linux共享內存分配行爲
- 26. linux共享內存實際在哪裏?
- 27. Linux共享內存:shmget()vs mmap()?
- 28. 使用api「CreateFileMapping」創建後可以增加共享內存大小嗎?
- 29. 進程共享內存不共享(c,linux)
- 30. 我可以在Android中使用共享首選項和SQLite嗎?
作爲一個靈感,看看:http://www.boost.org/doc/libs/1_61_0/doc/html/interprocess/quick_guide.html - 特別是'managed_shared_memory',可以用來保存' vector' in shared memory ... – Nim 2016-09-19 13:28:24