1. 程式人生 > >程式、程序與執行緒(二)

程式、程序與執行緒(二)

在前一章部落格(《程式、程序與執行緒(一)》)中,我們已經瞭解了程式與程序的概念與區別,今天我們再來講講程序與執行緒。程序用得好好的為何還要出現執行緒呢?首先我們來看看程序的一些侷限性。

一、程序的侷限性

1、建立子程序時每次都要把父程序的資料都copy一份,造成資源空間的冗餘浪費。

2、子程序和父程序的資料互動比較麻煩。不同的程序位於不同的地址空間,必須通過共享記憶體或者通訊機制。

3、系統在進行程序的排程時還涉及到資源的分配與狀態轉換等一系列動作,開銷大。

二、執行緒

1、優勢

同一程序的不同執行緒共享程式碼段、資料和檔案——程序間通訊較方便,但它們有著自己的執行緒ID、程式計數器、暫存器和棧。

程序在建立執行緒時的開銷大大減少,不再需要copy資料和檔案。

執行緒是CPU使用的基本單位。

2、程序與執行緒之間的比較

#同一程序的多執行緒間排程時不引起程序的切換,不同程序的執行緒間排程,需要進行程序的切換

執行緒上下文切換時的虛擬地址空間是相同的,但是程序是不同的。因此程序間的切換需要切換頁目錄以及使用新的地址空間,而執行緒不需要。

#併發性

一個程序的多個執行緒可併發執行(多個程序可併發執行)

#資源的擁有

程序獨佔資源,而執行緒不佔有資源。也就是執行緒不擁有系統資源、程式碼段和資料段。(它只是去使用所處程序所擁有的程式碼段和資料段)

#記憶體空間的佔用

不同程序各自佔有4GB的記憶體空間,同一程序的不同執行緒間共同使用4GB的記憶體空間。(涉及到虛擬記憶體的知識)

3、特點

執行緒是程序的一個屬性(排程屬性),是被系統獨立排程的基本單位。

#一個程序可以建立多個執行緒,這些執行緒共享程序擁有的全部資源

#多個執行緒之間併發執行,切換時快速簡便

4、單執行緒與多執行緒的記憶體空間構成

三、兩種執行緒

1、使用者執行緒與核心執行緒

A、使用者執行緒:對使用者執行緒的支援通常位於核心之上,通過一個使用者級執行緒庫來實現。執行緒庫提供了對執行緒的建立、排程和管理的支援,這無需來自核心的支援。

B、核心執行緒:核心執行緒由作業系統直接支援,核心在內和空間內實現了執行緒的建立、排程和管理。

2、使用者執行緒的優缺點

A、優點:

#效能好:低成本的執行緒操作

#靈活度高:排程是可以應用於特定的排程程式的

#易移植的:使用者執行緒庫易於移植

B、缺點:

#如果一個使用者級的執行緒阻塞在核心中,那麼這整個程序都會阻塞掉。

#無法使用多處理器進行並行處理。

3、兩種執行緒的結構

A、使用者執行緒(多對一的模式)

也就是核心中建立一個執行緒,再由這個執行緒與使用者層面上某個程序中的多個執行緒向對應。這就是所謂的“多對一”模式。這種模式下每個程序只分配到了一個核心執行緒,一旦該程序中某個使用者執行緒發生阻塞,它會佔據該程序所擁有的唯一一個核心執行緒,自然其他執行緒也就沒法執行,整個程序都會被阻塞。

B、核心執行緒(一對一的模式)

每個程序的所有執行緒都與核心中的某個核心執行緒相對應。因此程序不會因為某個執行緒的阻塞而導致整個程序都被阻塞。但是核心執行緒的開闢開銷比較大,這種模式下可開啟的程序數量更加有限,容易過多地增加作業系統的負擔。

C、使用者執行緒+核心執行緒(多對多的模式)

這種模式下,一個程序中分配了多個核心執行緒。比如程序A中的使用者執行緒2發生了阻塞,那麼只有使用者執行緒2和3會被阻塞,程序A中的使用者執行緒1還是可以繼續執行。

優點:開發者能夠建立所需的使用者執行緒,而且相應的核心執行緒能夠在多處理機環境中並行執行。而且當一個執行緒執行導致阻塞的系統呼叫時,核心能夠排程該程序中的其它執行緒執行。

四、執行緒的狀態轉換圖

小結:程序是資源分配的基本單位,而執行緒是CPU排程的基本單位。因此,某種意義上可以說在支援執行緒的作業系統中沒有真正意義上的程序排程,而都是執行緒排程。執行緒的出現主要是為了彌補程序各種操作開銷大的問題,除這點外,執行緒和程序是差不多的。多執行緒和多程序一樣,一方面為了充分利用CPU資源,另一方面是為了優化使用者互動體驗。