1. 程式人生 > >程序,執行緒,協程概念

程序,執行緒,協程概念

一、概念

  1、程序

  程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在當代面向執行緒設計的計算機結構中,程序是執行緒的容器。程式是指令、資料及其組織形式的描述,程序是程式的實體。

  程序是一個具有獨立功能的程式關於某個資料集合的一次執行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程式的程式碼,還包括當前的活動,通過程式計數器的值和處理暫存器的內容來表示。

  程序的概念主要有兩點:第一,程序是一個實體。每一個程序都有它自己的地址空間,一般情況下,包括

文字區域(text region)、資料區域(data region)和堆疊(stack region)。文字區域儲存處理器執行的程式碼;資料區域儲存變數和程序執行期間使用的動態分配的記憶體;堆疊區域儲存著活動過程呼叫的指令和本地變數。第二,程序是一個“執行中的程式”。程式是一個沒有生命的實體,只有處理器賦予程式生命時(作業系統執行之),它才能成為一個活動的實體,我們稱其為程序

  2、執行緒

  執行緒,有時被稱為輕量級程序(Lightweight Process,LWP),是程式執行流的最小單元。一個標準的執行緒由執行緒ID,當前指令指標(PC),暫存器集合和堆疊組 成。另外,執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個 程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行。由於執行緒之間的相互制約,致使執行緒 在執行中呈現出間斷性。執行緒也有

就緒阻塞執行三種基本狀態。就緒狀態是指執行緒具備執行的所有條件,邏輯上可以執行,在等待處理機;執行狀態是指執行緒佔有處理機正在執行;阻塞狀態是指執行緒在等待一個事件(如某個訊號量),邏輯上不可執行。每一個程式都至少有一個執行緒,若程式只有一個執行緒,那就是程式本身。

執行緒是程式中一個單一的順序控制流程。程序內一個相對獨立的、可排程的執行單元,是系統獨立排程和分派CPU的基本單位指執行中的程式的排程單位。在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒

  3、協程

  一個程式可以包含多個協程,可以對比與一個程序包含多個執行緒,因而下面我們來比較協程和執行緒。我們知道多個執行緒相對獨立,有自己的上下文,切換受系統控制;而協程也相對獨立,有自己的上下文,但是其切換由自己控制,由當前協程切換到其他協程由當前協程來控制。

  4、Daemon

  Daemon()程式是一直執行的服務端程式,又稱為守護程序。通常在系統後臺執行,沒有控制終端,不與前臺互動,Daemon程式一般作為系統服務使 用。Daemon是長時間執行的程序,通常在系統啟動後就執行,在系統關閉時才結束。一般說Daemon程式在後臺執行,是因為它沒有控制終端,無法和前 臺的使用者互動。Daemon程式一般都作為服務程式使用,等待客戶端程式與它通訊。我們也把執行的Daemon程式稱作守護程序。

  所謂守護 執行緒,是指在程式執行的時候在後臺提供一種通用服務的執行緒,比如垃圾回收執行緒就是一個很稱職的守護者,並且這種執行緒並不屬於程式中不可或缺的部分。因此, 當所有的非守護執行緒結束時,程式也就終止了,同時會殺死程序中的所有守護執行緒。反過來說,只要任何非守護執行緒還在執行,程式就不會終止。

使用者執行緒和守護執行緒兩者幾乎沒有區別,唯一的不同之處就在於虛擬機器的離開:如果使用者執行緒已經全部退出執行了,只剩下守護執行緒存在了,虛擬機器也就退出了。 因為沒有了被守護者,守護執行緒也就沒有工作可做了,也就沒有繼續執行程式的必要了。

  5、多程序和多執行緒

程序是資源分配的最小單位,執行緒是CPU排程的最小單位。執行緒和程序的區別在於,子程序和父程序有不同的程式碼和資料空間,而多個執行緒則共享資料空 間,每個執行緒有自己的執行堆疊和程式計數器為其執行上下文.多執行緒主要是為了節約CPU時間,發揮利用,根據具體情況而定. 執行緒的執行中需要使用計算機的記憶體資源和CPU。

  多程序: 程序是程式在計算機上的一次執行活動。當你執行一個程式,你就啟動了一個程序。顯然,程式是死的(靜態的),程序是活的(動態的)。程序可以分為系統程序 和使用者程序。凡是用於完成作業系統的各種功能的程序就是系統程序,它們就是處於執行狀態下的作業系統本身;所有由使用者啟動的程序都是使用者程序。程序是操作 系統進行資源分配的單位。 程序又被細化為執行緒,也就是一個程序下有多個能獨立執行的更小的單位。在同一個時間裡,同一個計算機系統中如果允許兩個或兩個以上的程序處於執行狀態,這 便是多工。現代的作業系統幾乎都是多工作業系統,能夠同時管理多個程序的執行。 多工帶來的好處是明顯的,比如你可以邊聽mp3邊上網,與此同時甚至可以將下載的文件打印出來,而這些任務之間絲毫不會相互干擾。那麼這裡就涉及到並行 的問題,俗話說,一心不能二用,這對計算機也一樣,原則上一個CPU只能分配給一個程序,以便執行這個程序。我們通常使用的計算機中只有一個CPU,也就 是說只有一顆心,要讓它一心多用,同時執行多個程序,就必須使用併發技術。實現併發技術相當複雜,最容易理解的是“時間片輪轉程序排程演算法”,它的思想簡 單介紹如下:在作業系統的管理下,所有正在執行的程序輪流使用CPU,每個程序允許佔用CPU的時間非常短(比如10毫秒),這樣使用者根本感覺不出來 CPU是在輪流為多個程序服務,就好象所有的程序都在不間斷地執行一樣。但實際上在任何一個時間內有且僅有一個程序佔有CPU。 如果一臺計算機有多個CPU,情況就不同了,如果程序數小於CPU數,則不同的程序可以分配給不同的CPU來執行,這樣,多個程序就是真正同時執行的,這 便是並行。但如果程序數大於CPU數,則仍然需要使用併發技術。 進行CPU分配是以執行緒為單位的,一個程序可能由多個執行緒組成,這時情況更加複雜,但簡單地說,有如下關係:

  匯流排程數<= CPU數量:並行執行

  匯流排程數> CPU數量:併發執行

  並行執行的效率顯然高於併發執行,所以在多CPU的計算機中,多工的效率比較高。但是,如果在多CPU計算機中只執行一個程序(執行緒),就不 能發揮多CPU的優勢。 這裡涉及到多工作業系統的問題,多工作業系統(如Windows)的基本原理是:作業系統將CPU的時間片分配給多個執行緒,每個執行緒在作業系統指定的 時間片內完成(注意,這裡的多個執行緒是分屬於不同程序的).作業系統不斷的從一個執行緒的執行切換到另一個執行緒的執行,如此往復,巨集觀上看來,就好像是多個 執行緒在一起執行.由於這多個執行緒分屬於不同的程序,因此在我們看來,就好像是多個程序在同時執行,這樣就實現了多工

  多執行緒:在計算機程式設計中,一個基本的概念就是同時對多個任務加以控制。許多程式設計問題都要求程式能夠停下手頭的工作,改為處理其他一些問題, 再返回主程序。可以通過多種途徑達到這個目的。最開始的時候,那些掌握機器低階語言的程式設計師編寫一些“中斷服務例程”,主程序的暫停是通過硬體級的中斷實 現的。儘管這是一種有用的方法,但編出的程式很難移植,由此造成了另一類的代價高昂問題。中斷對那些實時性很強的任務來說是很有必要的。但對於其他許多問 題,只要求將問題劃分進入獨立執行的程式片斷中,使整個程式能更迅速地響應使用者的請求。

  最開始,執行緒只是用於分配單個處理器的處理時間的一種工具。但假如作業系統本身支援多個處理器,那麼每個執行緒都可分配給一個不同的處理器,真正 進入“並行運算”狀態。從程式設計語言的角度看,多執行緒操作最有價值的特性之一就是程式設計師不必關心到底使用了多少個處理器。程式在邏輯意義上被分割為數個 執行緒;假如機器本身安裝了多個處理器,那麼程式會執行得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺執行緒處理非常簡單。但必須注意一個問 題:共享資源!如果有多個執行緒同時執行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個執行緒不能將資訊同時傳送給一臺印表機。為解決 這個問題,對那些可共享的資源來說(比如印表機),它們在使用期間必須進入鎖定狀態。所以一個執行緒可將資源鎖定,在完成了它的任務後,再解開(釋放)這個 鎖,使其他執行緒可以接著使用同樣的資源。

  多執行緒是為了同步完成多項任務,不是為了提高執行效率,而是為了提高資源使用效率來提高系統的效率。執行緒是在同一時間需要完成多項任務的時候實現的。

  一個採用了多執行緒技術的應用程式可以更好地利用系統資源。其主要優勢在於充分利用了CPU的空閒時間片,可以用盡可能少的時間來對使用者的要求做 出響應,使得程序的整體執行效率得到較大提高,同時增強了應用程式的靈活性。更為重要的是,由於同一程序的所有執行緒是共享同一記憶體,所以不需要特殊的資料 傳送機制,不需要建立共享儲存區或共享檔案,從而使得不同任務之間的協調操作與執行、資料的互動、資源的分配等問題更加易於解決。

程序間通訊(IPC,Inter-Process Communication),指至少兩個程序或執行緒間傳送資料或訊號的一些技術或方法。程序是計算機系統分配資源的最小單位。每個程序都有自己的一部分 獨立的系統資源,彼此是隔離的。為了能使不同的程序互相訪問資源並進行協調工作,才有了程序間通訊。這些程序可以執行在同一計算機上或網路連線的不同計算 機上。

  程序間通訊技術包括訊息傳遞、同步、共享記憶體和遠端過程呼叫。IPC是一種標準的Unix通訊機制。