1. 程式人生 > >多程序與多執行緒(一)--基本概念(轉)

多程序與多執行緒(一)--基本概念(轉)

程序(英語:Process,中國大陸譯作程序,臺灣譯作行程) 是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,是系統進行資源分配和排程的一個獨立單位。
程式是一組指令的有序集合,它本身沒有任何執行的含義,只是一個靜態實體。程序是程式在某個資料集上的執行,是一個動態實體(程序本身不會執行,是執行緒的容器。)。它因建立而產生,因排程而執行,因等待資源或事件而被處於等待狀態,因完成任務而被撤消,反映了一個程式在一定的資料集上執行的全部動態過程。
若干程序有可能與同一個程式相關係,且每個程序皆可以同步(循序)或不同步(平行)的方式獨立執行。程序為現今分時系統的基本運作單位。


執行緒
(英語:thread

,臺灣譯為執行緒),作業系統技術中的術語,是作業系統能夠進行運算排程的最小單位。它被包涵在程序之中,一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。在Unix System V及SunOS中也被稱為輕量程序(lightweight processes),但輕量程序更多指核心執行緒(kernel thread),而把使用者執行緒(user thread)稱為執行緒。

執行緒是獨立排程和分派的基本單位。執行緒可以作業系統核心排程的核心執行緒,如Win32 執行緒;由使用者程序自行排程的使用者執行緒,如Linux Portable Thread; 或者由核心與使用者程序,如Windows 7的執行緒,進行混合排程。

同一程序中的多條執行緒將共享該程序中的全部系統資源,如虛擬地址空間,檔案描述符和訊號處理等等。但同一程序中的多個執行緒有各自的呼叫棧(call stack),自己的暫存器環境(register context),自己的執行緒本地儲存(thread-local storage)。

一個程序可以有很多執行緒,每條執行緒並行執行不同的任務。

在多核或多CPU,或支援Hyper-threading的CPU上使用多執行緒程式設計的好處是顯而易見,即提高了程式的執行吞吐率。在單CPU單核的計算機上,使用多執行緒技術,也可以把程序中負責IO處理、人機互動而常備阻塞的部分與密集計算的部分分開來執行,編寫專門的workhorse執行緒執行密集計算,從而提高了程式的執行效率。(摘自:http://zh.wikipedia.org/wiki/執行緒)

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

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

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

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

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


多執行緒
:在計算機程式設計中,一個基本的概念就是同時對多個任務加以控制。許多程式設計問題都要求程式能夠停下手頭的工作,改為處理其他一些問題,再返回主程序。可以通過多種途徑達到這個目的。最開始的時候,那些掌握機器低階語言的程式設計師編寫一些“中斷服務例程”,主程序的暫停是通過硬體級的中斷實現的。儘管這是一種有用的方法,但編出的程式很難移植,由此造成了另一類的代價高昂問題。中斷對那些實時性很強的任務來說是很有必要的。但對於其他許多問題,只要求將問題劃分進入獨立執行的程式片斷中,使整個程式能更迅速地響應使用者的請求。  
最開始,執行緒只是用於分配單個處理器的處理時間的一種工具。但假如作業系統本身支援多個處理器,那麼每個執行緒都可分配給一個不同的處理器,真正進入“並行運算”狀態。從程式設計語言的角度看,多執行緒操作最有價值的特性之一就是程式設計師不必關心到底使用了多少個處理器。程式在邏輯意義上被分割為數個執行緒;假如機器本身安裝了多個處理器,那麼程式會執行得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺執行緒處理非常簡單。但必須注意一個問題:共享資源!如果有多個執行緒同時執行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個執行緒不能將資訊同時傳送給一臺印表機。為解決這個問題,對那些可共享的資源來說(比如印表機),它們在使用期間必須進入鎖定狀態。所以一個執行緒可將資源鎖定,在完成了它的任務後,再解開(釋放)這個鎖,使其他執行緒可以接著使用同樣的資源。 
多執行緒是為了同步完成多項任務,不是為了提高執行效率,而是為了提高資源使用效率來提高系統的效率。執行緒是在同一時間需要完成多項任務的時候實現的。
一個採用了多執行緒技術的應用程式可以更好地利用系統資源。其主要優勢在於充分利用了CPU的空閒時間片,可以用盡可能少的時間來對使用者的要求做出響應,使得程序的整體執行效率得到較大提高,同時增強了應用程式的靈活性。更為重要的是,由於同一程序的所有執行緒是共享同一記憶體,所以不需要特殊的資料傳送機制,不需要建立共享儲存區或共享檔案,從而使得不同任務之間的協調操作與執行、資料的互動、資源的分配等問題更加易於解決(摘自:http://baike.baidu.com/view/65706.htm)
通常由作業系統負責多個執行緒的排程和執行。

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

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

使用IPC 的理由:

  • 資訊共享
  • 加速;
  • 模組化;
  • 方便以及
  • 私有權分離.

主要的 IPC 方法

方法

提供方(作業系統或其他環境)

檔案

多數作業系統

訊號

多數作業系統

Socket

多數作業系統

訊息佇列(en:Message queue)

多數作業系統

管道(en:Pipe)

所有的 POSIX systems, Windows.

具名管道(en:Named Pipe)

所有的 POSIX 系統, Windows.

訊號量(en:Semaphore)

所有的 POSIX 系統, Windows.

共享記憶體

所有的 POSIX 系統, Windows.

Message passing(en:Message passing)
(
不共享)

用於 MPI規範,Java RMI, CORBA, MSMQ, MailSlot以及其他.

Memory-mapped file(en:Memory-mapped file)

所有的 POSIX 系統, Windows.

(摘自:http://zh.wikipedia.org/wiki/行程間通訊) 

轉自:http://blog.chinaunix.net/uid-20556054-id-3060696.html