2014-02-18 27 views
5

我正在學習過程分支,但也知道如何在Ruby中專門完成它。在我的閱讀中,我學習了「寫複製」行爲。從我的理解,這基本上沒有任何內存的副本,直到子線程試圖進行寫操作。這是否意味着當子進程試圖寫一個父內存被複制和修改,並且原始內存保持不變(並且父內存不受子進程影響?)的時候。謝謝。Ruby中的寫入分支複製

+2

在這個問題上有混淆的措辭。分叉和線程是兩個完全不同的東西。如果你把一些基本的骨架代碼放在你想要回答的問題的附近,這將會有所幫助。 –

+1

垃圾收集已成爲Ruby 2.0及更高版本的寫入複製功能。請參閱http://patshaughnessy.net/2012/3/23/why-you-should-be-excited-about-garbage-collection-in-ruby-2-0 – Agis

+0

@FredtheMagicWonderDog修正,謝謝 –

回答

6

是的。寫入時複製意味着只有兩個進程相同的內存頁保持共享。如果子進程或父進程寫入其中一個共享頁面,則寫入將被攔截,頁面將被複制,並且寫入將發生在僅由子/父進程擁有的新頁面上。

值得一提的是,這與Ruby沒有任何關係。 Ruby使用底層系統的fork系統調用,在Linux和大多數UNIX上都有寫入行爲的複製。

+0

謝謝!不知道在寫入之前共享內存頁面。 – hek2mgl

+0

@ hek2mgl:好的。從程序的角度來看,你的回答是對的。這兩個過程完全分開。寫入時複製是一種透明的性能技巧,可使叉在實際代碼中可用。 – Linuxios

+0

是的,我確實知道他們獨立行事,但這是我缺少的共享內存頁面細節。非常感謝! :) – hek2mgl