程序、進程與線程(二)

在前一章博客(《程序、進程與線程(一)》)中,我們已經瞭解了程序與進程的概念與區別,今天我們再來講講進程與線程。進程用得好好的爲何還要出現線程呢?首先我們來看看進程的一些侷限性。

一、進程的侷限性

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資源,另一方面是爲了優化用戶交互體驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章