mprotect()
用於保護內存頁面,例如,使頁面爲只讀。它爲整個過程設置了這種保護,也就是說,如果頁面是隻讀的,則沒有線程可以寫入該頁面。有沒有辦法以不同的方式爲不同的線程保護頁面?例如,1個線程可以寫入頁面P,並且我的程序中的所有其他線程只能從P.是否有基於線程的mprotect?
回答
中讀取如果在「克隆」系統調用中使用CLONE_VM標誌創建線程(這是您通常的做法調用線程),那麼MMU設置與父線程相同。
這意味着兩個線程都可以進行寫訪問。
如果您不使用CLONE_VM標誌,那麼這兩個線程根本沒有共享內存!
(pthread_create()在內部設置CLONE_VM標誌)。
這將有可能做你想要的東西 - 但是這將是非常困難的:
使用共享內存功能分配所有的內存塊(例如shmget的()),而不是標準的函數(例如malloc()函數)。
如果創建了新線程,則未使用CLONE_VM標誌來直接使用「clone()」而不是「pthread_create()」。
共享內存由線程共享,由「正常」內存分配函數(例如malloc())創建的線程不在線程之間共享。 mmap()映射的內存也是如此。
當創建一個新線程時,會複製這些內存塊(由malloc或mmap創建),以便兩個線程在同一地址都有自己的該內存塊副本。如果一個線程寫入該地址,則另一個線程將不會看到該更改。
分配更多的「共享」內存相當棘手。如果僅在分配線程和未創建的子線程之間共享內存,則很容易。很難在已經運行的線程之間或不同的已運行線程的(間接)子線程之間共享內存。
線程沒有共享堆棧內存,因此它們不能訪問彼此的堆棧。
全局變量和「靜態」變量不是默認共享的 - 爲了讓它們在線程之間「共享」,需要一些棘手的編程。
這是一個有趣的想法。又怎麼能讓線程對共享數據擁有不同的權限呢?每個線程可以使用不同的'PROT_'標誌在共享內存上調用'mprotect()'嗎? – danyhow
這實際上不太可能。 CLONE_SIGHAND需要CLONE_VM,CLONE_THREAD需要CLONE_SIGHAND(http://linux.die.net/man/2/clone)。因此,爲了不共享內存映射,新線程必須是它自己的進程。如果你願意爲線程使用進程,那麼這將工作得很好,但你不需要使用clone()。 – zmccord
是的 - 然後線程將是單獨的進程。但是使用fork()系統調用將不起作用(因爲內存不會被共享),所以clone()將是唯一能夠創建「線程」進程的系統調用。 –
- 1. 基於線程ID的中斷線程
- 2. 是否有一個基於AJAX的基於網絡的Junit TestRunner?
- 3. 是否有基於JVM的指標庫
- 4. 是否有基於extjs的datetimepicker?
- 5. 是否有基於文本的MySQL UI?
- 6. 是否有回收線程
- 7. PHP中是否有線程?
- 8. 基於Prority的線程?
- 9. 是否有可能基於子域創建ASP.NET MVC路線?
- 10. 是否有多線程的Web編程?
- 11. 基於多線程的基於pthread的多線程實用程序庫
- 12. java中是否有基於約束的編程的API
- 13. 是否有基於Web的日誌加載應用程序?
- 14. 是否有任何基於Maven的HTML驗證程序
- 15. 是否有可能基於位置
- 16. 多線程是否等於少CPU?
- 17. 是否有某種可用於PHP的線程?
- 18. 線程是否有助於提高Java的效率?
- 19. Boost:是否有僅用於線程通信的interprocess :: message_queue機制?
- 20. mprotect速度有多快
- 21. mmap/mprotect-readonly零頁是否計入已提交的內存?
- 22. 基於優先級的線程(不是進程)調度
- 23. 是否有最大線程數的Silverlight線程池?
- 24. 是否有並行線程相當於WatiForMultipleObjects
- 25. MPROTECT errno的12(ENOMEM)
- 26. 是否有任何事件基於日曆的可用於ASP.NET
- 27. 基於HTTP的基於聲明的安全性是否有任何標準?
- 28. C++的基於線程的線程安全的std :: cerr
- 29. C SIGSEGV Handler&Mprotect
- 30. Java多線程:執行對象方法的線程是否依賴於創建它的線程上的線程?
操作系統內存安全性處於進程級別。 –
'mprotect'不能做到這一點。線程必須*鎖定*他們想要保留的內容。在線程中保護整個頁面的動機是什麼?你不能用鎖嗎(例如,當一個線程擁有寫鎖,而其他人都可以讀取)? –
即使遇到應用程序錯誤,我也想保護這些區域,這就是爲什麼鎖定不充分的原因。是的,我知道'mprotect'不是正確的方法,所以我想知道是否有任何方法可以實現這一點。 – danyhow