1. 程式人生 > >Linux程序管理之1 程序概念與作業系統基礎原理

Linux程序管理之1 程序概念與作業系統基礎原理

計算機硬體層面之上是作業系統,狹義的作業系統主要指系統核心,核心有以下作用:程序管理、檔案系統、網路管理、記憶體管理、驅動程式、安全功能。核心可以將使用者無法操作的底層硬體介面進行抽象並封裝為使用者可以操作的介面,稱為系統呼叫(system call),當用戶需要操作硬體時就可以向核心發起系統呼叫完成響應操作。

程式設計師編寫的程式碼其實就是一條條指令構成,程式程式碼在執行過程中,如果這條指令使用者自身有許可權去執行,則可以直接執行。如果需要執行特權指令,例如操作硬體,由於特權指令只能由核心執行,使用者沒有許可權執行;所以此時,執行的程式需要做軟中斷,然後向核心發起系統呼叫,核心執行系統呼叫的程式碼,完成後將執行結果返回給執行的程式,然後再繼續執行後面的指令。 程式執行遇到特權指令,就必須發起系統呼叫,核心在執行系統呼叫程式碼時,程式是處在等待狀態。執行系統呼叫時,程式工作在核心空間(核心態)

;執行使用者可以執行的指令時,程式工作在使用者空間(使用者態)。 一個有效率的程式,它不應該浪費太多時間在系統呼叫。一般CPU應該有70%的時間在執行使用者程式碼(即工作在使用者態),30%的時間用來執行系統呼叫(工作在核心態)。因為只有使用者自己的程式程式碼才能發揮生產力,而核心程式碼並不直接發揮生產力。

CPU是通過給不同的程式分配時間片(time slice)來完成多工執行,給每一個程式分配獨立的時間片。在執行過程中,很產生很多中間狀態資料,例如執行到第幾條指令,接下來CPU該去取第幾條指令,這些資料存放在CPU的指令指標暫存器中。如果此時發生了程序切換,暫存器的資料就會被新的程序所覆蓋,等到下次再執行相同程式時又得從頭再來,這是所不能接受的。所以一旦程式在一個時間片內沒有辦法執行完畢,CPU需要把程式執行的中間狀態的資料儲存起來例如當前執行到哪個指令,在記憶體中取資料取到哪個地址,這稱為儲存現場

。儲存完成後,在下一個時間片執行另一個程序。當重新恢復執行當前程序時,需要把儲存的中間資料裝載到CPU中,稱為恢復現場。儲存和恢復現場需要執行核心程式碼完成(即工作在核心空間,消耗CPU時間)。

Linux系統管理機制類似於中央集權,核心是最高統治者,程序都要在核心的管理下排程執行。正常情況下,程序都不可能逃脫核心的控制,除非核心中存在漏洞。當程序試圖執行特權指令時,CPU會觸發一個軟中斷,然後喚醒核心,由核心負責處理;一旦觸發中斷就必須由核心接管一切。

編寫好的程式程式碼存放在磁碟上是靜態的,放在那裡只是乾巴巴的程式檔案。而程序是程式的活動實體,程式只有執行起來才能稱之為程序。一個程序從建立到結束,是有自己的生命週期。每一個檔案都有自己的元資料即屬性,與之類似,程序也有自己的屬性,例如程序名稱、程序號、運行了多長時間、使用哪顆CPU、佔用多少記憶體等等。核心對程序的排程需要追蹤檢視程序的屬性,所以核心為每一個程序建立能夠追蹤其屬性的資料結構。在C語言中,資料儲存有一種方式叫做結構體

,結構體是用來儲存內容的一個特定的組織機制或組織格式。而核心就為每一個程序建立結構體,核心儲存程序資訊的固定格式稱為task struct;當我們去檢視系統上的程序資訊時,就是遍歷每個程序的task struct。這些task struct是通過連結串列的方式進行儲存。何為連結串列?例如第一個結構體資料的結尾部分指向第二個結構體起始地址,而第二個結構體的結尾部分又指向第三個結構體的起始地址,這樣連線起來像一個數據鏈似的就稱為連結串列。在Linux系統上眾多程序的task struct組成的連結串列稱為任務列表(t