第3章程序管理(二)

2021-08-21 12:05:21 字數 1712 閱讀 8609

3.3程序建立

unix的程序建立很特別。許多其它的作業系統都提供了產生程序的機制,首先在新的位址空間裡建立程序,讀入可執行檔案,最後開始執行。unix採用與眾不同的實現方式,把上述步驟分解到兩個單獨的函式中去執行:fork()和exec()。首先,fork()通過拷貝當前程序建立乙個子程序。子程序與父程序的區別僅僅在pid、ppid和某些資源和統計量。exec()函式負責讀取可執行檔案並將其載入位址空間開始執行。

1、寫時拷貝(copy-on-write)

傳統的fork()系統呼叫直接把所有的資源複製給新建立的程序。這種實現過於簡單並且效率低下,因為它拷貝的資料也許並不共享,如果新程序打算立即執行乙個新的映像,那麼所有的拷貝將前功盡棄。linux的fork()使用寫時拷貝頁實現。寫時拷貝是一種可以推遲甚至免除拷貝資料的技術。核心此時並不複製整個程序位址空間,而是讓父程序和子程序共享同乙個拷貝。

只有在需要寫入時,資料才會被複製,從而使各個程序擁有各自的拷貝。資源的複製只有在需要寫入時才進行,在此之前,只是以唯讀方式共享。這種技術使位址空間上的頁的拷貝被推遲到實際發生寫入時才進行。在頁根本不會被寫入的情況下它們就無須複製了。

fork()的開銷是複製父程序的頁表以及給子程序建立唯一的程序描述符。在一般情況下,程序建立後會馬上執行乙個可執行檔案,這種優化可以避免拷貝大量根本就不會使用的資料。由於unix強調程序快速執行的能力,所以這個優化很重要。

2、fork()

linux通過clone()系統呼叫實現fork()。這個呼叫通過一系列的引數標誌來指明父、子程序需要共享的資源。fork()、vfork()、__clone()庫函式都根據各自需要的引數標誌去呼叫clone(),然後clone()去呼叫do_fork()。

do_fork完成建立中的大部分工作,定義在kernel/fork.c檔案中。該函式呼叫copy_process()函式,讓程序開始執行。copy_process()函式完成的工作:

1、呼叫dup_task_struct()為新程序建立乙個核心棧、thread_info結構和task_struct,這些值與當前程序的值相同。此時,子程序和父程序的描述符完全相同。

2、檢查並確保新建立這個子程序後,當前使用者所擁有的程序數目沒有超出給它分配的資源的限制。

3、子程序著手使自己與父程序區別開來。程序描述符內的許多成員都要被清零或設為初始化值。不是繼承而來的程序描述符成員,主要是統計資訊。task_struct中的大多數資料依然未被修改。

4、子程序狀態被設定為task_uninterruptible,以保證它不會投入執行。

5、copy_process()呼叫copy_flags()以更新task_struct的flags成員。表明程序是否擁有超級使用者許可權的pf_superpriv標誌被清0。表明程序還沒有呼叫exec()函式的pf_forknoexec標誌被設定。

6、呼叫alloc_pid()為新程序分配乙個有效的pid。

7、根據傳遞給clone()的引數標誌,copy_process()拷貝或共享開啟的檔案、檔案系統資訊、訊號處理函式、程序位址空間和命名空間等。在一般情況下,這些資源會被給定程序的所有執行緒共享;否則,這些資源對每個程序是不同的,因此被拷貝到這裡。

8、copy_process()做掃尾工作並返回乙個指向子程序的指標。

再回到do_fork()函式,如果copy_process()函式成功返回,新建立的子程序被喚醒並讓其投入執行。核心有選擇子程序首先執行。因為一般子程序都會馬上呼叫exec()函式,這樣可以避免寫時拷貝的額外開銷,如果父程序首先執行的話,有可能會開始向位址空間寫入。

第 3 章 程序

程序是現代分時作業系統的工作單元。程序是資源分配的基本單位。執行緒是程式執行的最小單位。程序是執行的程式,這是一種非正式的說法。程序不只是程式 也稱文字段 程序還包括資料 程式計數器的值和處理器暫存器的內容等 程序堆疊 包括臨時資料,如函式引數 返回位址和區域性變數 和資料段 包括全域性變數 和堆。...

第16章 程序管理

system 函式 在perl中,啟動子程序最簡單的方法是用system 函式,例如要呼叫unix的date命令,system date 這會建立乙個子程序來執行date命令 root jhoa 20150304 cat a1.pl usr bin perl if system date else ...

第2章 程序管理

要點 分析程式執行順序 以及併發的特徵 程序的概念 特徵與狀態 程序控制塊及其組織 關於程式執行順序 1 引入前趨圖 描述程序執行前後關係的圖 有向無迴圈圖 dag 2 程式順序執行時的特徵 1 順序性 處理機的操作嚴格按程式規定順序執行 2 封閉性 程式一旦開始執行,其計算結果不受外界因素影響。3...