fork、vfork聯絡與區別

來源:互聯網
上載者:User

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

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

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

 

 總結:優點是子進程的執行獨立於父進程,具有良好的並發性。缺點是兩者的通訊需要專門的通訊機制,如pipe、fifo和system V等。有人認為這 樣大批量的複製會導致執行效率過低。其實在複製過程中,子進程複製了父進程的task_struct,系統堆棧空間和頁面表,在子進程運行前,兩者指向同一頁面。而當子進程改變了父進程的變數時候,會通過copy_on_write的手 段為所涉及的頁面建立一個新的副本。因此fork效率並不低。

 

 總結:當建立子進程的目的僅僅是為了調用exec()執行另一個程式時,子進程不會對父進程的地址空間又任何引用。因此,此時對地址空間的複製是多餘的,通過vfork可以減少不必要的開銷。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.