程序是什麼?
狹義定義:程序是正在運作的程式的執行個體(an instance of a computer program that is being executed)。
廣義定義:程序是一個具有一定獨立功能的程式關于某個資料集合的一次運作活動。它是作業系統動态執行的基本單元,在傳統的作業系統中,程序既是基本的配置設定單元,也是基本的執行單元。
程序的概念主要有兩點:第一,程序是一個實體。每一個程序都有它自己的位址空間,一般情況下,包括文本區域(textregion)、資料區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;資料區域存儲變量和程序執行期間使用的動态配置設定的記憶體;堆棧區域存儲着活動過程調用的指令和本地變量。第二,程序是一個“執行中的程式”。程式是一個沒有生命的實體,隻有處理器賦予程式生命時(作業系統執行之),它才能成為一個活動的實體,我們稱其為程序。[3]
程序是作業系統中最基本、重要的概念。是多道程式系統出現後,為了刻畫系統内部出現的動态情況,描述系統内部各道程式的活動規律引進的一個概念,所有多道程式設計作業系統都建立在程序的基礎上。
特征
動态性:程序的實質是程式在多道程式系統中的一次執行過程,程序是動态産生,動态消亡的。
并發性:任何程序都可以同其他程序一起并發執行
獨立性:程序是一個能獨立運作的基本機關,同時也是系統配置設定資源和排程的獨立機關;
異步性:由于程序間的互相制約,使程序具有執行的間斷性,即程序按各自獨立的、不可預知的速度向前推進
結構特征:程序由程式、資料和程序控制塊三部分組成。
多個不同的程序可以包含相同的程式:一個程式在不同的資料集裡就構成不同的程序,能得到不同的結果;但是執行過程中,程式不能發生改變。
線程是什麼?
線程,有時被稱為輕量級程序(LightweightProcess,LWP),是程式執行流的最小單元。一個标準的線程由線程ID,目前指令指針(PC),寄存器集合和堆棧組成。另外,線程是程序中的一個實體,是被系統獨立排程和分派的基本機關,線程自己不擁有系統資源,隻擁有一點兒在運作中必不可少的資源,但它可與同屬一個程序的其它線程共享程序所擁有的全部資源。一個線程可以建立和撤消另一個線程,同一程序中的多個線程之間可以并發執行。由于線程之間的互相制約,緻使線程在運作中呈現出間斷性。線程也有就緒、阻塞和運作三種基本狀态。就緒狀态是指線程具備運作的所有條件,邏輯上可以運作,在等待處理機;運作狀态是指線程占有處理機正在運作;阻塞狀态是指線程在等待一個事件(如某個信号量),邏輯上不可執行。每一個程式都至少有一個線程,若程式隻有一個線程,那就是程式本身。
特點
在多線程OS中,通常是在一個程序中包括多個線程,每個線程都是作為利用CPU的基本機關,是花費最小開銷的實體。線程具有以下屬性。
1)輕型實體
線程中的實體基本上不擁有系統資源,隻是有一點必不可少的、能保證獨立運作的資源。
線程的實體包括程式、資料和TCB。線程是動态概念,它的動态特性由線程控制塊TCB(Thread Control Block)描述。TCB包括以下資訊:
(1)線程狀态。
(2)當線程不運作時,被儲存的現場資源。
(3)一組執行堆棧。
(4)存放每個線程的局部變量主存區。
(5)通路同一個程序中的主存和其它資源。
用于訓示被執行指令序列的程式計數器、保留局部變量、少數狀态參數和傳回位址等的一組寄存器和堆棧。
2)獨立排程和分派的基本機關。
在多線程OS中,線程是能獨立運作的基本機關,因而也是獨立排程和分派的基本機關。由于線程很“輕”,故線程的切換非常迅速且開銷小(在同一程序中的)。
3)可并發執行。
在一個程序中的多個線程之間,可以并發執行,甚至允許在一個程序中所有線程都能并發執行;同樣,不同程序中的線程也能并發執行,充分利用和發揮了處理機與外圍裝置并行工作的能力。
4)共享程序資源。
在同一程序中的各個線程,都可以共享該程序所擁有的資源,這首先表現在:所有線程都具有相同的位址空間(程序的位址空間),這意味着,線程可以通路該位址空間的每一個虛位址;此外,還可以通路程序所擁有的已打開檔案、定時器、信号量機構等。由于同一個程序内的線程共享記憶體和檔案,是以線程之間互相通信不必調用核心。
程序和線程之間的關系?
1、一個線程隻能屬于一個程序,而一個程序可以有多個線程,但至少有一個線程(通常說的主線程)。
2、資源配置設定給程序,同一程序的所有線程共享該程序的所有資源。
3、線程在執行過程中,需要協作同步。不同程序的線程間要利用消息通信的辦法實作同步。
4、處理機分給線程,即真正在處理機上運作的是線程。
5、線程是指程序内的一個執行單元,也是程序内的可排程實體。
從三個角度來剖析二者之間的差別
1、排程:線程作為排程和配置設定的基本機關,程序作為擁有資源的基本機關。
2、并發性:不僅程序之間可以并發執行,同一個程序的多個線程之間也可以并發執行。
3、擁有資源:程序是擁有資源的一個獨立機關,線程不擁有系統資源,但可以通路隸屬于程序的資源。
什麼是守護程序?
在linux或者unix作業系統中,守護程序(Daemon)是一種運作在背景的特殊程序,它獨立于控制終端并且周期性的執行某種任務或等待處理某些發生的事件。由于在linux中,每個系統與使用者進行交流的界面稱為終端,每一個從此終端開始運作的程序都會依附于這個終端,這個終端被稱為這些程序的控制終端,當控制終端被關閉的時候,相應的程序都會自動關閉。但是守護程序卻能突破這種限制,它脫離于終端并且在背景運作,并且它脫離終端的目的是為了避免程序在運作的過程中的資訊在任何終端中顯示并且程序也不會被任何終端所産生的終端資訊所打斷。它從被執行的時候開始運轉,直到整個系統關閉才退出。
上下文切換
上下文切換(Context Switch),也稱為PCB,性質為環境切換。
上下文切換,有時也稱做程序切換或任務切換,是指CPU從一個程序或線程切換到另一個程序或線程。
在作業系統中,CPU切換到另一個程序需要儲存目前程序的狀态并恢複另一個程序的狀态:目前運作任務轉為就緒(或者挂起、删除)狀态,另一個被標明的就緒任務成為目前任務。上下文切換包括儲存目前任務的運作環境,恢複将要運作任務的運作環境。
程序上下文用程序的PCB(程序控制塊,也稱為PCB,即任務控制塊)表示,它包括程序狀态,CPU寄存器的值等。
通常通過執行一個狀态儲存來儲存CPU目前狀态,然後執行一個狀态恢複重新開始運作。
在上下文切換過程中,CPU會停止處理目前運作的程式,并儲存目前程式運作的具體位置以便之後繼續運作。從這個角度來看,上下文切換有點像我們同時閱讀幾本書,在來回切換書本的同時我們需要記住每本書目前讀到的頁碼。在程式中,上下文切換過程中的“頁碼”資訊是儲存在程序控制塊(PCB)中的。PCB還經常被稱作“切換幀”(switchframe)。“頁碼”資訊會一直儲存到CPU的記憶體中,直到他們被再次使用。
在三種情況下可能會發生上下文切換:中斷處理,多任務處理,使用者态切換。在中斷進行中,其他程式”打斷”了目前正在運作的程式。當CPU接收到中斷請求時,會在正在運作的程式和發起中斷請求的程式之間進行一次上下文切換。在多任務進行中,CPU會在不同程式之間來回切換,每個程式都有相應的處理時間片,CPU在兩個時間片的間隔中進行上下文切換。對于一些作業系統,當進行使用者态切換時也會進行一次上下文切換,雖然這不是必須的。
作業系統或者計算機硬體都支援上下文切換。一些現代作業系統通過系統本身來控制上下文切換,整個切換過程中并不依賴于硬體的支援,這樣做可以讓作業系統儲存更多的上下文切換資訊
上下文切換的消耗
上下文切換通常是計算密集型的。也就是說,它需要相當可觀的處理器時間,在每秒幾十上百次的切換中,每次切換都需要納秒量級的時間。是以,上下文切換對系統來說意味着消耗大量的 CPU 時間,事實上,可能是作業系統中時間消耗最大的操作。