進程和程序(Process and Program)

原出處:http://oss.org.cn/kernel-book/ch04/4.1.htm數據結構

----------------------------------我的理解分割線-----------------------------------併發

程序:存放在硬盤中的文件,指令集+數據。被組織成:正文段(指令集) + 用戶數據段(數據)編輯器

進程:程序加載到內存中,分配內存空間,存放正文段(指令集) + 用戶數據段(棧 + 堆) + 系統數據段(PCB等系統用到的數據結構)函數

 

---------------------------------我是copy分割線-----------------------------------spa

首先咱們對進程做一明肯定義:所謂進程是由正文段(text)、用戶數據段(user segment)以及系統數據段(system segment)共同組成的一個執行環境操作系統


      圖4.1 程序及進程的組成

 程序只是一個普通文件,是一個機器代碼指令和數據的集合,這些指令和數據存儲在磁盤上的一個可執行映象(Executable Image)中,因此,程序是一個靜態的實體。這裏,對可執行映象作進一步解釋,可執行映象就是一個可執行文件的內容,例如,你編寫了一個C源程序,最終這個源程序要通過編譯、鏈接成爲一個可執行文件後才能運行。源程序中你要定義許多變量,在可執行文件中,這些變量就組成了數據段的一部分;源程序中的許多語句,例如「 i++; for(i=0; i<10; i++);」等,在可執行文件中,它們對應着許多不一樣的機器代碼指令,這些機器代碼指令經CPU執行,就完成了你所指望的工做。能夠這麼說:程序表明你指望完成某工做的計劃和步驟,它還浮在紙面上,等待具體實現。而具體的實現過程就是由進程來完成的,進程能夠認爲是運行中的程序,它除了包含程序中的全部內容外,還包含一些額外的數據。程序和進程的組成如圖4.1所示。指針

程序裝入內存後就能夠運行了:在指令指針寄存器的控制下,不斷的將指令取至CPU運行。這些指令控制的對象不外乎各類存儲器(內存、外存和各類CPU寄存器等),這些存儲器中保存有待運行的指令和待處理的數據,固然,指令只有獲得CPU才能發揮其做用。可見,在計算機內部,程序的執行過程實際上就是一個執行環境的總和,這個執行環境包括程序中各類指令和數據,還有一些額外數據,好比說寄存器的值、用來保存臨時數據(例如傳遞給某個函數的參數、函數的返回地址、保存變量等)的堆棧(包括程序堆棧和系統堆棧)、被打開文件的數量及輸入輸出設備的狀態等等。這個執行環境的動態變化表徵程序的運行。咱們就把這個環境稱做「進程」,它表明程序的執行過程,是一個動態的實體,它隨着程序中指令的執行而不斷地變化。在某個特定時刻的進程的內容被稱爲進程映象(process image)htm

Linux是一個多任務操做系統,也就是說,能夠有多個程序同時裝入內存並運行,操做系統爲每一個程序創建一個運行環境即建立進程,每一個進程擁有本身的虛擬地址空間,它們之間互不干擾,即便要相互做用(例如多個進程合做完成某個工做),也要經過內核提供的進程間通訊機制(IPC)。Linux內核支持多個進程虛擬地併發執行,這是經過不斷地保存和切換程序的運行環境而實現的,選擇哪一個進程運行是由調度程序決定的。注意,在一些UNIX書籍中,又把「進程切換」(Process Switching)稱爲「環境切換」或「上下文切換」(Context Switching),這些術語表達的意思是相同的。對象

進程運行過程當中,還須要其餘的一些系統資源,例如,要用CPU來運行它的指令、要用系統的物理內存來容納進程自己和它的有關數據、要在文件系統中打開和使用文件、而且可能直接或間接的使用系統的物理設備,例如打印機、掃描儀等。因爲這些系統資源是由全部進程共享的,因此Linux必須監視進程和它所擁有的系統資源,使它們們能夠公平地擁有系統資源以獲得運行。blog

系統中最寶貴的資源是CPU,一般來講,系統中只有一個CPU,固然也能夠有多個CPU(Linux支持SMP___對稱多處理機)。Linux做爲多任務操做系統,其目的就是讓CPU上一直都有進程在運行,以最大限度地利用這一寶貴資源。一般狀況下,進程數目是多於CPU數目的,這樣其餘進程必須等待CPU這一資源。操做系統經過調度程序來選擇下一個最應該運行的進程,並使用一系列的調度策略來確保公平和高效。

進程是一個動態實體,如圖4.1所示,進程實體由三個獨立的部分組成:

(1)正文段(text):存放被執行的機器指令。這個段是隻讀的(因此,在這裏不能寫本身能修改的代碼),它容許系統中正在運行的兩個或多個進程之間可以共享這一代碼。例如,有幾個用戶都在使用文本編輯器,在內存中僅須要該程序指令的一個副本,他們全都共享這一副本。

(2)用戶數據段(user segment):存放進程在執行時直接進行操做的全部數據,包括進程使用的所有變量在內。顯然,這裏包含的信息能夠被改變。雖然進程之間能夠共享正文段,可是每一個進程須要有它本身的專用用戶數據段。例如同時編輯文本的用戶,雖然運行着一樣的程序__編輯器,可是每一個用戶都有不一樣的數據:正在編輯的文本。

(3)系統數據段(system segment):該段有效地存放程序運行的環境。事實上,這正是程序和進程的區別所在。如前所述,程序是由一組指令和數據組成的靜態事物,它們是進程最初使用的正文段和用戶數據段。做爲動態事物,進程是正文段、用戶數據段和系統數據段的信息的交叉綜合體,其中系統數據段是進程實體最重要的一部分,之因此說它有效地存放程序運行的環境,是由於這一部分存放有進程的控制信息。系統中有許多進程,操做系統要管理它們、調度它們運行,就是經過這些控制信息。Linux爲每一個進程創建了task_struct數據結構來容納這些控制信息。

總之,進程是一個程序完整的執行環境。該環境是由正文段、用戶數據段、系統數據段的信息交織在一塊兒組成的。

相關文章
相關標籤/搜索