vfork與fork

來源:互聯網
上載者:User
一、進程的建立步驟以及建立函數的介紹
1、使用fork()或者vfork()函數建立新的進程
2、條用exec函數族修改建立的進程。使用fork()建立出來的進程是當前進程的完全複製,然而我們建立進程是為了讓新的進程去執行新的程式,因此,就需要用到exec函數族對建立出來的新進程進行修改,讓他擁有和父進程不一樣的東西,修改後就可以執行新的程式,當然,修改後的子進程包含了要執行程式的資訊。
在Linux中,fork()和vfork()就是用於建立進程的兩個函數,他們的相關資訊如下:
建立進程函數:
pid_t
fork(void)//成功返回0,失敗返回-1
fork()用於建立新的進程,所建立進程為當前進程的子進程,可以通過fork()函數的返回質6來控制進程是在父進程中還是在子進程中。如果運行在父進程中,則返回PID為子進程的進程號,如果在子進程中,則返回的PID為0
pid_t
vfork(void)//成功返回0,失敗返回-1
vfork()函數和fork()函數比較類似,都用於建立子進程。只是其用於建立新的進程,父子進程共用虛擬記憶體空間。然而在核心中,vfork()的實現任然調用fork()函數,調用函數如下:
sys_vfork(struct pt_regs *regs)
{
        return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gr[30], regs, 0, NULL, NULL);
}
在上述函數中,pid_t為隱含類型,實際上就是一個int的類型。隱含類型只資料類型的物理表示是未知的或者是不相關的
二、實現過程和區別
1、Linux是通過_cloen()系統調用來實現fork()的,這一調用通過一系列的參數標誌來指明父子進程需要的資源。Fork(),vfork(),_cloen()庫函數都根據各自需要的參數標誌去調用cloen(),然後由cloen()去調用do_fork()函數,do_fork()函數也就是真正的建立進程的函數。他完成了建立進程的大部分工作。同時他還會調用copy_process()函數。然後讓進程開始運行。
2、vfork()和fork()的功能相同,除了不拷貝父進程的頁表項,也就是說不會複製和父進程相關的資源,父子進程將共用地址空間,子進程對虛擬記憶體空間的任何實際修改實際上是在修改父進程虛擬內粗空間的內容。並且其父進程會被阻塞,直到子進程退出或者執行exec()函數族.這樣由於父子進程共用地址空間,避免了fork在資源複製是的消耗。
3、寫時copy機制:Linux系統採用了“些操作時複製”的方法,其是一種延遲資源複製的方法,子進程在建立的時候並不複製父進程的相關資源,父子進程通過訪問相同的實體記憶體來偽裝已經實現了的對資源的複製。這種共用是制度方式是唯讀方式,這一點與vfork是不同的,當子進程對記憶體資料存在這些的操作時,才會進香資源的複製。正是由於這種機制的出現,vfork()好像已經沒有什麼作用了。
三、在進程窗建立過程中copy_process()函數完成的工作//摘自:Linux核心設計與實現
1、調用dup_task_struct()為心進程建立一個核心棧、thread_info結構和task_struct,這些值與當前進程的值相同。此時,子進程和父進程的描述符完全相同。
2、檢查新建立的這個子進程後,目前使用者所用有的進程數目沒有超過給他分配的資源的限制
3、現在,子進程著手使自己與父進程區別開來,進程描述符內的許多成員都要被清0或者設定初始值。進程描述符的成員值並不是繼承而來的,而主要是統計資訊,進程描述符中的大多數資料都是共用的。
4、接下來,子進程的狀態被設定為不可終端等待狀態以保證他不會投入運行
5、copy_process()調用copy_flags()以更新task_struct的flags成員。表明進程是擁有超級使用者權限的PF_SUPER[RIV標誌被清0。表明進程還沒有調用exec()函數的PE_FORKNOEXEC標誌被設定。
6、調用get_pid()為新進程擷取一個有效PID
7、根據傳給cloen()的參數標誌copy_process()拷貝或者共用開啟的檔案、檔案系統信、訊號處理函數、進程地址空間和命名空間等。
8、讓父進程和子進程平分剩餘的時間片。
9、最後,copy_proccess()做掃尾工作並返回一個只想子進程的指標

聯繫我們

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