跳至內容
主選單
主選單
移至側邊欄
隱藏
導覽
首頁
近期變更
隨機頁面
MediaWiki說明
Taiwan Tongues 台語維基
搜尋
搜尋
外觀
建立帳號
登入
個人工具
建立帳號
登入
檢視 Fork(系統呼叫) 的原始碼
頁面
討論
臺灣正體
閱讀
檢視原始碼
檢視歷史
工具
工具
移至側邊欄
隱藏
操作
閱讀
檢視原始碼
檢視歷史
一般
連結至此的頁面
相關變更
特殊頁面
頁面資訊
外觀
移至側邊欄
隱藏
←
Fork(系統呼叫)
由於以下原因,您無權編輯此頁面:
您請求的操作只有這些群組的使用者能使用:
使用者
、taigi-reviewer、apibot
您可以檢視並複製此頁面的原始碼。
佇咧電腦領域內底,尤其是 Unix 佮類 Unix 系統作業系統當中,'''fork'''(行程複製)是一款的建立家己程副本的操作。伊通常是核心實現的一種系統呼叫。Fork 是類 Unix 作業系統上建立行程的一種主要方法,甚至歷史上是唯一方法。 ==概述== 佇咧加工作業系統內底,行程(執行的程式)需要一種方法來建立新行程,譬如講執行其他程式。Fork 佮其變種佇類 Unix 系統中通常是按呢做的唯一方式。若行程需要啟動另外一个程式的會當執行檔,伊需要先 Fork 來建立一个自身的副本。然後由著副本即「子行程」搧叫 exec 系統呼叫,用其他的程式崁佇家己:停止執行家己進前的程式並執行其他的程式。 Fork 操作會做子行程建立一个單獨的定址空間。子行程有父行程所有記憶體段的精確副本。佇現代的 UNIX 變種內底,這遵循出自 SunOS 抹四配零的虛擬記持體模型,根據寫入時陣複製語意,實體記持體無需要予實際複製。取代之的是,兩个行程的虛擬記持體頁面可能指向實體記持體中的仝一个頁,直到𪜶寫入這个頁面,寫入去才會發生。咧用 fork 配合 exec 來執行新程式的情況下,此最佳化誠重要。通常來講,子行程佇停止程式執行進前會執行一小組有利用其他程式的操作,伊可能用著少量的其實行程的資料結構。 做一个行程呼叫 fork 時,伊予人認為是父行程,新建立的行程是伊的囡仔(子行程)。 佇咧 fork 了後,兩个行程閣執行著仝款的程式,攏親像呼叫著該系統呼叫一般恢復執行。然後𪜶會當檢查呼叫的返回值確定其狀態:是父行程抑是子行程,猶閣有根據這个行事。 fork 系統呼叫佇頭一个版本的 Unix 就已經存在矣,伊借用佇閣較早的 GENIE 分時系統。Fork 是標準化的 POSIX 的一部份。 ==通批== 子行程對父行程的檔案描述子副本開始。對行程間通訊,父行程通常會建立一个抑是幾若个管道,佇咧 fork 行程了後,行程關起來𪜶無需要的管道捀。 ==反種== ===Vfork=== Vfork 是佮 fork 具有仝款呼呼的約定和誠濟仝款語意的一个變種,毋過干焦會當佇有限的情形下使用伊。伊是起佇咧 Unix 的三 BSD 版本,這是頭一个支援虛擬記憶體的 Unix 版本。伊已經揤 POSIX 標準化,這會使 vfork 人具有佮 fork 完全仝款的行為。但是這已經佇二空空四年的版本中被標為過時,並佇咧後續的版本內底予人 posix \ _ spawn ( ) 取代(其通常通過 vfork 實現)。 咧發出一个 vfork 系統呼叫時,爸行程被暫停,行程完成執行抑是予新的會當執行影像取代(通過系統呼叫之「exec」家族內底的一項)。 子行程借用爸行程的 MMU 設定佮記持體頁面,佇爸行程佮子行程之間共享,無進行複製,尤其是無寫入時陣複製語意;所以,若是子行程在任何共享頁面中進行修改,袂建立新的頁面,並且修改的頁面對父行程平平可見。因為無頁面複製(消耗另外的記持體), 此技術佇咧純複製環境使用 exec 時候比較一般 fork 閣較最佳化。佇咧 POSIX 中,除非講將隨呼叫 exec 家族(猶閣有其他幾若个操作)的函式,其他任何的目的會致使未定義行為。使用 vfork 時,子行程借用毋是複製資料結構,所以乎 vfork 猶原比使用寫時複製語意的 fork 較緊咧。 System V 佇咧 System VR 四予人引入前不支援此系統函式,因為伊的記持體共享較會出來: > _ Vfork _ does not copy page tables so it is faster than the System V _ fork _ implementation . But the child process executes in the same physical address space as the parent process ( until an _ exec _ or _ exit _ ) and can thus overwrite the parent's data and stack . A dangerous situation could arise if a programmer uses _ vfork _ incorrectly , so the onus for calling _ vfork _ lies with the programmer . The difference between the System V approach and the BSD approach is philosophical : Should the kernel hide idiosyncrasies of its implementation from users , or should it allow sophisticated users the opportunity to take advantage of the implementation to do a logical function more efficiently ? > > 仝款,Linux 著 vfork 的手冊頁面強烈無鼓勵伊的使用: > It is rather unfortunate that Linux revived this specter from the past . The BSD man page states : " This system call will be eliminated when proper system sharing mechanisms are implemented . Users should not depend on the memory sharing semantics of vfork ( ) as it will , in that case , be made synonymous to fork ( 二 ) . " > > 使用 vfork 的其他問題包括死結,伊可能發生佇多執行程式內底,因為佮動態連結互動。做為 vfork 介面的替代品,POSIX 引入來 posix \ _ spawn 函式家族,伊結合矣 fork 和 exec 的動作。遮的函式會當實現為 fork 的程式庫定式,就親像 Linux 彼款的,抑是為著閣較好的效能實現為 vfork,就親像 Solaris 彼款的。猶毋過,POSIX 規範中註明伊是「為核心操作設計」,尤其是用佇執行咧受限硬體佮即時系統上的作業系統。 雖然四配四 BSD 的實現中排脫去矣 vfork 的實現,使 vfork 做甲佮 fork 仝款的行為,伊佇咧 NetBSD 作業系統當中有效能原因恢復。 一寡躉入式的作業系統(比如講 uClinux)省略 fork 並且實現 vfork,因為𪜶需要佇欠缺記持體管理單元(MMU)無可能來實現寫時複製的裝置操作。 ===Rfork=== Plan 九作業系統由 Unix 的設計者創造,包括講 fork,但是嘛有一个叫做「rfork」來變種,伊允准父行程佮子行程之間資源的幼粒仔度共享,包括定址空間(除了呼叫棧段,彼是每一个行程獨有的)、 環境變數和檔案系統號名空間;這就是使伊成做建立行程佮其中的執行緒的一个統一介面。佇咧 FreeBSD 和 IRIX 著採用矣來自 Plan 九的 rfork,後者共更號做「sproc」。 ===Clone=== 「 clone」(克隆)是 Linux 核心中的一个系統呼叫,伊建立一个會當佮其爸共享「執行上下文」的子行程。類似 FreeBSD 的 rfork 和 IRIX 的 sproc,Linux 的 clone 受著矣 Plan 九的 rfork 啟發,而且用佇實現執行緒(就算應用程式的程式設計師通常使用閣較進階的介面,比如講 pthreads,實現此時 clone 的頂層)。 出自 Plan 九和 IRIX 的「separate stacks」(單獨堆疊)特性已經予人省略,因為其實致使傷濟開銷(根據 Linus Torvalds)。 ==其他作業系統內面的 Fork== 佇咧 VMS 作業系統(一九七七年)的原始設計中,新行程根據當前一寡特定位址進行複製來建立予人認為是有風險的。當前行程當中的錯誤狀態可能去予人複製予子行程。按呢佇遮使用矣行程「生卵」(spawning)之隱喻:新行程的每一个組件的記持體布局攏是重新建立的。spawn 後來予微軟的作業系統採用(一九九三年)。 VM / CMS(OpenExtensions)的 POSIX 相容組件提供一个非常有限的 fork 實現,其中的爸行程佇子行程執行的時予暫停,並且子和父共享同一定址空間。這本質上是一个名 fork 的 vfork。(注意,這隻有合用著 CMS 客戶機作業系統,其他 VM 客戶機作業系統如 Linux 提供標準的 fork 功能。) ==應用程式範例== 下列 Hello World 程式的變種以 C 語言展示矣 fork 系統呼叫的機理。該程式 fork 為兩个行程,逐个攏因為 fork 系統呼叫的返回值決定𪜶執行啥物功能。平板代碼中的標頭檔等已經被省略。 下跤是該該是的程式的解析: 咻叫中的第一句是呼叫 fork 系統呼叫來分割執行為兩个行程。fork 的倒轉去值予人記錄佇類型做 pid \ _ t 的變數中間,其中是 POSIX 類型的行程識別碼(PID)。 佇咧電腦領域,尤其是 Unix 佮類 Unix 系統作業系統當中,'''fork'''是一款的建立家己程副本的操作。伊通常是核心實現的一種系統呼叫。Fork 是咧類 Unix 作業系統上建立行程的一種主要方法,甚至歷史上捌是唯一方法。 鋪一錯誤表示 fork 脫箠:無新的行程予人建立。因此愛印出一條錯誤訊息。 若是 fork 成功,遮爾仔這馬有兩个行程。兩个攏對 fork 返回的時開始執行 main 函式。為著使行程執行無仝款的任務,程式著愛基於 fork 的返回值決定其做為子行程抑是父行程執行某一个分支。 Fork 操作會做子行程建立一个單獨的定址空間。子行程有父行程所有記憶體段的精確副本。佇現代的 UNIX 變種內底,這遵循出自 SunOS 抹四配零的虛擬記持體模型,根據寫入時陣複製語意,實體記持體無需要予實際複製。取代之的是,兩个行程的虛擬記持體頁面可能指向實體記持體中的仝一个頁,直至𪜶寫入這个頁面,寫入去才會發生。咧用 fork 配合 exec 來執行新程式的情況下,此最佳化誠重要。通常,子行程佇停止程式執行進前會執行一小組有利用其他程式的操作,伊可能用著少量的其實行程的資料結構。 其他的行程—— 即父行程,會收著 fork 傳來的子行程的行程識別碼,其實是一个正數。老爸的行程來共這个識別碼傳達予 waitpid 系統呼叫來暫停執行,到甲子行程登出。彼此情形發生了後,父行程繼續執行並按 return 語句的含義登出。 ==參見== * fork 炸彈 * Fork–exec * Exit * Wait ==參考資料== [[分類: 待校正]]
返回到「
Fork(系統呼叫)
」。