1. 程式人生 > >騰訊面試題04.程序和執行緒的區別?

騰訊面試題04.程序和執行緒的區別?

程序和執行緒的區別?

程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。

1) 簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.

2) 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

3) 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

4) 執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

5) 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

執行緒與程序總結:

1.程序和執行緒

1.1 概述:

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.

執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行.

相對程序而言,執行緒是一個更加接近於執行體的概念,它可以與同進程中的其他執行緒共享資料,但擁有自己的棧空間,擁有獨立的執行序列。

在序列程式基礎上引入執行緒和程序是為了提高程式的併發度,從而提高程式執行效率和響應時間。

1.2 區別:

程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。

1) 簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.

2) 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

3) 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

4) 執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

5) 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

1.3 優缺點:

執行緒和程序在使用上各有優缺點:執行緒執行開銷小,但不利於資源的管理和保護;而程序正相反。同時,執行緒適合於在SMP機器上執行,而程序則可以跨機器遷移。

2.多程序,多執行緒

2.1 概述:

程序就是一個程式執行的時候被CPU抽象出來的,一個程式執行後被抽象為一個程序,但是執行緒是從一個程序裡面分割出來的,由於CPU處理程序的時候是採用時間片輪轉的方式,所以要把一個大個程序給分割成多個執行緒,例如:網際快車中檔案分成100部分 10個執行緒 檔案就被分成了10份來同時下載 1-10 佔一個執行緒 11-20佔一個執行緒,依次類推,執行緒越多,檔案就被分的越多,同時下載 當然速度也就越快

程序是程式在計算機上的一次執行活動。當你執行一個程式,你就啟動了一個程序。顯然,程式只是一組指令的有序集合,它本身沒有任何執行的含義,只是一個靜態實體。而程序則不同,它是程式在某個資料集上的執行,是一個動態實體。它因建立而產生,因排程而執行,因等待資源或事件而被處於等待狀態,因完成任務而被撤消,反映了一個程式在一定的資料集上執行的全部動態過程。程序是作業系統分配資源的單位。Windows下,程序又被細化為執行緒,也就是一個程序下有多個能獨立執行的更小的單位。執行緒(Thread)是程序的一個實體,是CPU排程和分派的基本單位。執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

執行緒和程序的關係是:執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊(如程式計數器、一組暫存器和棧)。

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

如果一臺計算機有多個CPU,情況就不同了,如果程序數小於CPU數,則不同的程序可以分配給不同的CPU來執行,這樣,多個程序就是真正同時執行的,這便是並行。但如果程序數大於CPU數,則仍然需要使用併發技術。

Windows中,進行CPU分配是以執行緒為單位的,一個程序可能由多個執行緒組成,這時情況更加複雜,但簡單地說,有如下關係:

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

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

並行執行的效率顯然高於併發執行,所以在多CPU的計算機中,多工的效率比較高。但是,如果在多CPU計算機中只執行一個程序(執行緒),就不能發揮多CPU的優勢。

 多工作業系統(如Windows)的基本原理是:作業系統將CPU的時間片分配給多個執行緒,每個執行緒在作業系統指定的時間片內完成(注意,這裡的多個執行緒是分屬於不同程序的).作業系統不斷的從一個執行緒的執行切換到另一個執行緒的執行,如此往復,巨集觀上看來,就好像是多個執行緒在一起執行.由於這多個執行緒分屬於不同的程序,因此在我們看來,就好像是多個程序在同時執行,這樣就實現了多工.

 2.2 分類

根據程序與執行緒的設定,作業系統大致分為如下型別:

(1) 單程序、單執行緒,MS-DOS大致是這種作業系統;

(2) 多程序、單執行緒,多數UNIX(及類UNIX的LINUX)是這種作業系統;

(3) 多程序、多執行緒,Win32(Windows NT/2000/XP等)、Solaris 2.x和OS/2都是這種作業系統;

(4) 單程序、多執行緒,VxWorks是這種作業系統。

2.3 引入執行緒帶來的主要好處:

(1) 在程序內建立、終止執行緒比建立、終止程序要快;

(2) 同一程序內的執行緒間切換比程序間的切換要快,尤其是使用者級執行緒間的切換。

詳情又可見:http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html