天天看點

線程及與程序的對比

一、為什麼要引入線程

  程序是為了提高CPU的執行效率,減少因程式等待帶來的CPU空轉以及其他計算機軟硬體資源而提出來的。程序是一個資源擁有者,因而在程序的建立、撤消和切換中,系統必須為之付出較大的時空開銷。也正因為如此,在系統中所設定的程序數目不宜過多,程序切換的頻率也不宜太高,但這也就限制了并發程度的進一步提高。如何能使多個程式更好地并發執行,同時又盡量減少系統的開銷,已成為近年來設計作業系統時所追求的重要目标。于是,有不少作業系統的學者們想到,可否将進 程的上述屬性分開,由作業系統分開來進行處理。即對作為排程和分派的基本機關,不同時作為獨立配置設定資源的機關,以使之輕裝運作;而對擁有資源的基本機關, 又不頻繁地對之進行切換。正是在這種思想的指導下,産生了線程概念。即,為了減少程序切換和建立的開銷,提高執行效率和節省資源,人們在開始作業系統中引入“線程”(thread)的概念。

二、線程

1、線程的基本概念

線程是程序的一部分,有時候也被稱為輕量級程序(light weight process)。線程是程序中執行運算的最小機關,亦即執行處理機排程的基本機關。如果把程序了解為在邏輯上作業系統所完成的任務,那麼線程表示完成該任務的許多可能的子任務之一。

2、引入線程的好處

(1)易于排程。

(2)提高并發性。通過線程可友善有效地實作并發性。程序可建立多個線程來執行同一程式的不同部分。

(3)開銷少。建立線程比建立程序要快,所需開銷很少。。

(4)利于充分發揮多處理器的功能。通過建立多線程程序(即一個程序可具有兩個或更多個線程),每個線程在一個處理器上運作,進而實作應用程式的并發性,使每個處理器都得到充分運作。

3、線程的适用範圍

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

4、線程分類與執行

線程的兩個基本類型是使用者級線程和核心級線程(系統級線程)。

1、使用者級線程

 使用者級線程的管理過程全部由使用者程式完成,為了對使用者級線程進行管理,作業系統提供一個在使用者空間執行的線程庫。該線程庫提供建立、排程和撤銷線程功能。同時,該線程庫也提供線程見的通信、線程的執行以及存儲線程上下文的功能。使用者級線程隻使用使用者堆棧和配置設定給所屬程序的使用者寄存器。

 (1)使用者級線程的排程算法和排程過程全部由使用者自行選擇和确定,與作業系統核心無關。

 (2)使用者級線程的排程算法隻進行線程上下文切換而不進行處理機切換。

 (3)因,使用者級線程的上下文切換和核心無關,是以可能出現,盡管相關程序的狀态是阻塞的或等待的,但所屬線程的狀态卻是執行的

2、核心級線程

由操作形同核心進行管理。作業系統核心給應用程式提供相應地系統調用和應用程式接口,以使使用者可以建立、執行和撤銷線程。作業系統核心既負責程序的排程,也負責程序内不同線程的排程,故,核心級線程不會出現程序出于阻塞或等待狀态,而線程處于執行狀态的情況。

系統開銷:使用者級線程<核心級程序<程序

3、執行

線程有3個基本狀态:執行、就緒和阻塞。有五種基本操作:派生、阻塞、激活、排程和結束。

三、程序與線程

1、程序和線程的關系

(1)一個線程隻能屬于一個程序,而一個程序可以有多個線程。線程是作業系統可識别的最小執行和排程機關。一個沒有線程的程序可以被看作是單線程。

(2)資源配置設定給程序,同一程序的所有線程共享該程序的所有資源。

2、線程與程序的差別

(1)線程的改變隻代表了CPU執行過程的改變,而程序所擁有的資源都沒有發生改變。或者說,除了CPU之外,計算機内的軟硬體資源的配置設定與線程無關,線程隻能共享它所屬程序的資源。

(2)與程序控制表和 PCB 相似,每個線程也有自己的線程控制表 TCB ,而這個 TCB 中所儲存的線程狀态資訊則要比 PCB 表少得多,這些資訊主要是相關指針用堆棧(系統棧和使用者棧),寄存器中的狀态資料。

(3)程序擁有一個完整的虛拟位址空間,不依賴于線程而獨立存在;反之,線程是程序的一部分,沒有自己的位址空間,與程序内的其他線程一起共享配置設定給該程序的所有資源。

3、線程與程序對比(來自L_free的博文程序與線程的差別和聯系)

我們從排程、并發性、 系統開銷、擁有資源等方面,來比較線程與程序。

1.排程

在傳統的作業系統中,擁有資源的基本機關和獨立排程、分派的基本機關都是程序。而在引入線程的作業系統中,則把線程作為排程和分派的基本機關。而把程序作 為資源擁有的基本機關,使傳統程序的兩個屬性分開,線程便能輕裝運作,進而可顯著地提高系統的并發程度。在同一程序中,線程的切換不會引起程序的切換,在 由一個程序中的線程切換到另一個程序中的線程時,将會引起程序的切換。

2.并發性

在引入線程的作業系統中,不僅程序之間可以并發執行,而且在一個程序中的多個線程之間,亦可并發執行,因而使作業系統具有更好的并發性,進而能更有效地使 用系統資源和提高系統吞吐量。例如,在一個未引入線程的單CPU作業系統中,若僅設定一個檔案服務程序,當它由于某種原因而被阻塞時,便沒有其它的檔案服 務程序來提供服務。在引入了線程的作業系統中,可以在一個檔案服務程序中,設定多個服務線程,當第一個線程等待時,檔案服務程序中的第二個線程可以繼續運 行;當第二個線程阻塞時,第三個線程可以繼續執行,進而顯著地提高了檔案服務的品質以及系統吞吐量。

3.擁有資源

不論是傳統的作業系統,還是設有線程的作業系統,程序都是擁有資源的一個獨立機關,它可以擁有自己的資源。一般地說,線程自己不擁有系統資源(也有一點必 不可少的資源),但它可以通路其隸屬程序的資源。亦即,一個程序的代碼段、資料段以及系統資源,如已打開的檔案、I/O裝置等,可供問一程序的其它所有線 程共享。

4.系統開銷

由于在建立或撤消程序時,系統都要為之配置設定或回收資源,如記憶體空間、I/o裝置等。是以,作業系統所付出的開銷将顯著地大于在建立或撤消線程時的開銷。類 似地,在進行程序切換時,涉及到整個目前程序CPU環境的儲存以及新被排程運作的程序的CPU環境的設定。而線程切換隻須儲存和設定少量寄存器的内容,并 不涉及存儲器管理方面的操作。可見,程序切換的開銷也遠大于線程切換的開銷。此外,由于同一程序中的多個線程具有相同的位址空間,緻使它們之間的同步和通信的實作,也變得比較容易。在有的系統中,線程的切換、同步和通信都無須

另外,

Linux下,從函數調用上來說,程序建立使用fork()操作;線程建立使用clone()操作。

Ref:

程序與線程的差別和聯系

應屆生經典面試題:說說程序與線程的差別與聯系

 張堯學老師編著《計算機作業系統教程(第4版)》

轉載于:https://www.cnblogs.com/love-yh/p/7282482.html

繼續閱讀