程序的建立
Unix 在程序的產生上採取相當獨特的作法。絕大多數系統會設計一種叫「 spawn 」的機制,為新的程序先建立起新的定址空間,之後便讀進執行檔,並開始執行它。 Unix 系統上會將這些步驟分離成兩個函式,分別為 fork() 跟 exec() 。首先說明的是: fork() 會產生一個子程序,這是當前 task 的複製品;跟父程序不同的地方只有 PID﹑ PPID﹑特定的資源(如懸滯信號)與統計資料等不會作繼承動作的東西。第二個函式則是 exec() ,這個函式會將新的執行檔載入到定址空間裡面,同時開始執行它。將 fork() 和 exec() 依序結合後,就跟大部份的作業系統上所使用的單一函式相同。
※ 「大部份的作業系統上所使用的單一函式」這是在說 像 win32 上的 system() 嗎?還是 exec() ?
Copy-on-Write
以往的作法在呼叫 fork() 時,所有的父程序所擁有的資源都會複製一份給子程序。我們在複製時可以很容易發現到,不少資源可以藉由共享的動作來讓父子程序共用;所以每一樣資源都複製的動作不旦原始也缺乏效率。更糟的是,如果緊接著的動作就是執行新的程式,所先前所作的複製就完全是畫蛇添足了。在 Linux 系統底下, fork() 會藉由「 copy-on-write 」分頁(就是寫入分頁前才進行複製的動作)這個機制來防止前面提到的這種浪費行為。 Copy-on-Write 或簡稱 (COW) 是一種延遲或完全防止資料複製的技術。父程序和子程序並非各自擁有完整的空間,而是共享單一個程序定址空間。共享的資料會預先打上特殊的標記,以確保在寫入動作發生的時候再來進行對應的資料複製;到發生寫入動作完成後,程序才可以說是「擁有不同的資料」,而在這之前,資料都是以唯讀的方式進行共享的動作。這個技術可以延遲定址空間內的資料複製,進而讓記憶體分頁寫入的動作減少,可以說是相當重要的最佳化機制,讓程序得以快速的執行,而不用在意分頁上的資源與時間浪費。
沒有留言:
張貼留言