Linux fork與vfork的區別

來源:互聯網
上載者:User

vfork用於建立一個新進程,而該新進程的目的是exec一個新進程,vfork和fork一樣都建立一個子進程,但是它並不將父進程的地址空間完全複製到子進程中,不會複製頁表。因為子進程會立即調用exec,於是也就不會存放該地址空間。不過在子進程中調用exec或exit之前,他在父進程的空間中運行。

 

為什麼會有vfork,因為以前的fork當它建立一個子進程時,將會建立一個新的地址空間,並且拷貝父進程的資源,而往往在子進程中會執行exec調用,這樣,前面的拷貝工作就是白費力氣了,這種情況下,聰明的人就想出了vfork,它產生的子進程剛開始暫時與父進程共用地址空間(其實就是線程的概念了),因為這時候子進程在父進程的地址空間中運行,所以子進程不能進行寫操作,並且在兒子“霸佔”著老子的房子時候,要委屈老子一下了,讓他在外面歇著(阻塞),一旦兒子執行了exec或者exit後,相當於兒子買了自己的房子了,這時候就相當於分家了。

vfork和fork之間的另一個區別是: vfork保證子進程先運行,在她調用exec或exit之後父進程才可能被調度運行。如果在調用這兩個函數之前子進程依賴於父進程的進一步動作,則會導致死結。

由此可見,這個系統調用是用來啟動一個新的應用程式。其次,子進程在vfork()返回後直接運行在父進程的棧空間,並使用父進程的記憶體和資料。這意味著子進程可能破壞父進程的資料結構或棧,造成失敗。

為了避免這些問題,需要確保一旦調用vfork(),子進程就不從當前的棧架構中返回,並且如果子進程改變了父進程的資料結構就不能調用exit函數。子進程還必須避免改變全域資料結構或全域變數中的任何資訊,因為這些改變都有可能使父進程不能繼續。
通常,如果應用程式不是在fork()之後立即調用exec(),就有必要在fork()被替換成vfork()之前做仔細的檢查。

用fork函數建立子進程後,子進程往往要調用一種exec函數以執行另一個程式,當進程調用一種exec函數時,該進程完全由新程式代換,而新程式則從其main函數開始執行,因為調用exec並不建立新進程,所以前後的進程id 並未改變,exec只是用另一個新程式替換了當前進程的本文,資料,堆和棧段。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.