日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux系統(tǒng)調(diào)用fork函數(shù)的方法

fork()函數(shù)是分叉函數(shù),現(xiàn)有的進程可以調(diào)用fork()函數(shù)來新建一個新進程,那么在Linux下要如何調(diào)用fork()函數(shù)呢?又或者fork()函數(shù)要如何在Linux下實現(xiàn)呢?隨小編一起來瞧瞧吧 。

Linux系統(tǒng)調(diào)用fork函數(shù)的方法


1.傳統(tǒng)的fork()系統(tǒng)調(diào)用直接把所有的資源復(fù)制給新創(chuàng)建的進程.Linux的fork()使用寫時拷貝(copy-on-write)頁實現(xiàn) 。寫時拷貝是一種可以推遲甚至免除拷貝數(shù)據(jù)的技術(shù),內(nèi)核此時并不復(fù)制整個進程地址空間,而是讓父進程和子進程共享同一個拷貝 。
只有在需要寫入的時候,數(shù)據(jù)才會被復(fù)制,從而使各個進程擁有各自的拷貝,也就是說,資源的復(fù)制只有在需要寫入的時候才進行,在此之前,只是以只讀的方式共享 。這種技術(shù)使地址空間上的頁的拷貝被推遲到實際發(fā)生寫入的時候才進行 。在頁跟本不會被寫入的情況下(比如:fork()后立即調(diào)用exec())它們就無需復(fù)制了 。
2.linux通過系統(tǒng)調(diào)用clone()來實現(xiàn)fork() 。然后由clone()來調(diào)用do_fork() 。
linux下fork()函數(shù)的實現(xiàn):
Linux通過clone()系統(tǒng)調(diào)用實現(xiàn)fork() 。這個調(diào)用通過一系列的參數(shù)標(biāo)志來指明父,子進程需要共享的資源 。fork(),vfork()和__clone()庫函數(shù)都根據(jù)各自需要的參數(shù)標(biāo)志去調(diào)用clone() 。然后由clone()去調(diào)用do_fork() 。
do_frok完成了創(chuàng)建中的大部分工作,它的定義在ker/frok.c文件中 。該函數(shù)調(diào)用copy_process()的函數(shù),然后讓進程開始運行 。copy_process()函數(shù)完成的工作很有意思:
1.調(diào)用dup_task_struct()為新進程創(chuàng)建一個內(nèi)核棧,thread_info結(jié)構(gòu)和task_struct,這些值與當(dāng)前進程的值相同 。此時,子進程和父進程的描述符是完全相同的 。
【Linux系統(tǒng)調(diào)用fork函數(shù)的方法】 2.檢查新創(chuàng)建的這個子進程后,當(dāng)前用戶所擁有的進程數(shù)目沒有超出給它分配的資源的限制 。
3.現(xiàn)在,子進程著手使自己與父進程區(qū)別開來 。進程描述符內(nèi)的許多成員都要被清0或者設(shè)為初始值 。進程描述符的成員值并不是繼承而來的,而主要是統(tǒng)計信息 。進程描述符中的大多數(shù)數(shù)據(jù)都是共享的 。
4.接下來,子進程的狀態(tài)被設(shè)置為TASK_UNINTERRUPTIBLE以保證它不會投入運行 。
5.copy_process()調(diào)用copy_flags()以更新task_struct的flags成員 。表明進程是否擁有超級用戶權(quán)限的PF_SUPERPRIV的標(biāo)志被清0.表明進程還沒有調(diào)用exec()函數(shù)的PF_FORKNOEXEC標(biāo)志被設(shè)置 。
6.調(diào)用get_pid()為新進程獲取一個有效的PID 。
7.根據(jù)傳遞給clone()的參數(shù)標(biāo)志,copy_process()拷貝或共享打開的文件,文件系統(tǒng)信息,信號處理函數(shù),進程地址空間和命名空間等 。再一半情況下,這些資源會被給定進程的所有線程共享;否則,這些資源對每個進程是不同的,因此被拷貝到了這里 。
8.讓父進程和子進程平分剩余的時間片 。
9.最后,copy_process()做掃尾工作并返回一個指向子進程的指針 。
再回到do_fork()函數(shù),如果copy_process()函數(shù)返回成功,新創(chuàng)建的子進程被喚醒并讓其投入運行 。內(nèi)核有意選擇子進程首先執(zhí)行 。因為一半子進程都會馬上調(diào)用exec()函數(shù),這樣可以避免寫時拷貝的額外開銷,如果父進程首先執(zhí)行的話,有可能會開始向地址空間寫入 。
上面就是Linux調(diào)用fork()函數(shù)的方法介紹了,本文除了介紹了Linux下調(diào)用fork()函數(shù)的方法,還對fork()函數(shù)的實現(xiàn)做了詳細介紹,希望對你有所幫助 。

    推薦閱讀