天天看點

騰訊面試題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