進程和程序(Process and Program)


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

----------------------------------個人理解分割線-----------------------------------

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

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

 

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

首先我們對進程作一明確定義:所謂進程是由正文段(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)

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

進程運行過程中,還需要其他的一些系統資源,例如,要用CPU來運行它的指令、要用系統的物理內存來容納進程本身和它的有關數據、要在文件系統中打開和使用文件、並且可能直接或間接的使用系統的物理設備,例如打印機、掃描儀等。由於這些系統資源是由所有進程共享的,所以Linux必須監視進程和它所擁有的系統資源,使它們們可以公平地擁有系統資源以得到運行。

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

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

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

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM