各位看官們,大家好,上一回中咱們說的是從內存角度看進程和線程的例子,這一回咱們說的例子是:創建進程時的內存細節。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們,我們都知道使用fork函數可以創建一個新的進程,今天我們一起說一下使用該函數創建進程時內存的一些細節問題。我們介紹的的重點還是內存布局中的四個分區。
1.在父進程中使用fork時,會創建一個新的進程,我們叫它子進程,子進程有自己的內存空間; 2.子進程的內存空間中沒有代碼區,子進程和父進程共享代碼區; 3.子進程的內存空間中擁有自己的數據區,堆區和棧區,並且這些區域中的內容是父進程區域中內容的副本; 4.上面所說的副本表明父子進程中的內容是相同的,但是子進程沒有直接從父進程復制這些內容,而是有點像C語言中的指針,子進程通過“指針”指向了父進程的內存,因此他們的內容是相同的; 5.子進程沒有直接復制父進程內存中的內容,是因為這樣做會消耗時間和空間,影響創建進程的效率; 6.當修改子進程內存空間中的內容時,子進程開始復制父進程內存空間的內容,這個時候,子進程內存空間的內容完全屬於自己,這種變化就叫作寫時復制技術(copy on write); 7.因為子進程內存中的內容屬於自己,所以修改子進程內存中的內容時不會影響父進程內存中的內容;這 一點,我們在前面章回舉過具體的例子,這裡就不再舉例子了; 8.執行execve系列函數時也會觸發寫時復制,關於execve系列函數,我們在後面章回中再做介紹; 9.寫時復制技術可以減少不必要的內存復制操作,進而提高創建進程的效率;看官們,我們把創建進程時的內存細節一步一步地列出來了,希望能夠幫助大家詳細地理解創建進程時的內存細節問題。
各位看官,關於“創建進程時的內存細節”的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。