程式和執行緒的區別

哎呀我的天吶發表於2015-12-28
我等學渣怎麼會知道這個事情呢?還是默默的複製下別人的文章吧~

這問題,估計計算機專業的同學在找研發等工作的時候都會遇到過。前幾天某老牌軟體廠商的電話面試就提到了這一經典問題,今天招聘會上又有不少同學說在面試的時候被問到這點。在這裡我就起個頭,大家有啥想法意見等都歡迎回帖交流。

    要了解二者的區別與聯絡,首先得對程式與執行緒有一個宏觀上的瞭解。

    程式,是併發執行的程式在執行過程中分配和管理資源的基本單位,是一個動態概念,竟爭計算機系統資源的基本單位。每一個程式都有一個自己的地址空間,即程式空間或(虛空間)。程式空間的大小 只與處理機的位數有關,一個 16 位長處理機的程式空間大小為 216 ,而 32 位處理機的程式空間大小為 232 。程式至少有 5 種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。

    執行緒,在網路或多使用者環境下,一個伺服器通常需要接收大量且不確定數量使用者的併發請求,為每一個請求都建立一個程式顯然是行不通的,——無論是從系統資源開銷方面或是響應使用者請求的效率方面來看。因此,作業系統中執行緒的概念便被引進了。執行緒,是程式的一部分,一個沒有執行緒的程式可以被看作是單執行緒的。執行緒有時又被稱為輕權程式或輕量級程式,也是 CPU 排程的一個基本單位。

    說到這裡,我們對程式與執行緒都有了一個大體上的印象,現在開始說說二者大致的區別。

    程式的執行過程是線狀的,儘管中間會發生中斷或暫停,但該程式所擁有的資源只為該線狀執行過程服務。一旦發生程式上下文切換,這些資源都是要被保護起來的。這是程式宏觀上的執行過程。而程式又可有單執行緒程式與多執行緒程式兩種。我們知道,程式有 一個程式控制塊 PCB ,相關程式段 和 該程式段對其進行操作的資料結構集 這三部分,單執行緒程式的執行過程在宏觀上是線性的,微觀上也只有單一的執行過程;而多執行緒程式在宏觀上的執行過程同樣為線性的,但微觀上卻可以有多個執行操作(執行緒),如不同程式碼片段以及相關的資料結構集。執行緒的改變只代表了 CPU 執行過程的改變,而沒有發生程式所擁有的資源變化。出了 CPU 之外,計算機內的軟硬體資源的分配與執行緒無關,執行緒只能共享它所屬程式的資源。與程式控制表和 PCB 相似,每個執行緒也有自己的執行緒控制表 TCB ,而這個 TCB 中所儲存的執行緒狀態資訊則要比 PCB 表少得多,這些資訊主要是相關指標用堆疊(系統棧和使用者棧),暫存器中的狀態資料。程式擁有一個完整的虛擬地址空間,不依賴於執行緒而獨立存在;反之,執行緒是程式的一部分,沒有自己的地址空間,與程式內的其他執行緒一起共享分配給該程式的所有資源

    執行緒可以有效地提高系統的執行效率,但並不是在所有計算機系統中都是適用的,如某些很少做程式排程和切換的實時系統。使用執行緒的好處是有多個任務需要處理機處理時,減少處理機的切換時間;而且,執行緒的建立和結束所需要的系統開銷也比程式的建立和結束要小得多。最適用使用執行緒的系統是多處理機系統和網路系統或分散式系統。

----------------------------------

1. 執行緒的執行特性。

    執行緒只有 3 個基本狀態:就緒,執行,阻塞。

    執行緒存在 5 種基本操作來切換執行緒的狀態:派生,阻塞,啟用,排程,結束。

2. 程式通訊。

    單機系統中程式通訊有 4 種形式:主從式,會話式,訊息或郵箱機制,共享儲存區方式。

        主從式典型例子:終端控制程式和終端程式。

        會話式典型例子:使用者程式與磁碟管理程式之間的通訊。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29990276/viewspace-1965767/,如需轉載,請註明出處,否則將追究法律責任。

相關文章