執行緒


一般來說,線是一種非常細的絲線,通常是棉或絲綢織物,用於縫製衣服等。 同樣的術語執行緒也被用於計算機程式設計領域。 現在,我們如何將用於縫製衣服的線與用於計算機程式設計的線相關聯? 這兩個執行緒執行的角色類似。 在衣服中,執行緒將布料放在一起,在另一側,在計算機程式設計中,執行緒持有計算機程式,並允許程式一次執行順序操作或許多操作。

執行緒是作業系統中最小的執行單元。 它本身不是一個程式,而是在程式中執行。 換句話說,執行緒並不相互獨立,並與其他執行緒共用程式碼段,資料段等。 這些執行緒也被稱為輕量級進程。

執行緒狀態

為了深入理解執行緒的功能,我們需要了解執行緒的生命週期或不同的執行緒狀態。 通常,執行緒可以以五種不同的狀態存在。 下面顯示了不同的狀態 -

新執行緒
新執行緒在新狀態下開始其生命週期。 但是,在這個階段,它尚未開始,也沒有分配任何資源。 我們可以說它只是一個物件的範例。

可執行
當新出生的執行緒啟動時,執行緒變為可執行的,即等待執行。 在這種狀態下,它擁有所有資源,但仍然有任務排程程式沒有安排它執行。

執行
在此狀態下,執行緒進行並執行已由任務計劃程式選擇執行的任務。 現在,執行緒可以進入死態或不可執行/等待狀態。

非執行/待機
在這種狀態下,執行緒暫停,因為它要麼等待某個I/O請求的響應,要麼等待其他執行緒執行完成。

死鎖

可執行執行緒在完成其任務或以其他方式終止時進入終止狀態。

下圖顯示了執行緒的完整生命週期 -

執行緒型別

在本節中,我們將看到不同型別的執行緒。 型別如下所述 -

使用者級執行緒
這些是使用者管理的執行緒。

在這種情況下,執行緒管理核心不知道執行緒的存在。 執行緒庫包含用於建立和銷毀執行緒的程式碼,用於線上程之間傳遞訊息和資料,用於排程執行緒執行以及用於儲存和恢復執行緒上下文。 應用程式以單個執行緒開始。

使用者級執行緒的例子是 -

  • Java執行緒
  • POSIX執行緒

使用者級執行緒的優點
以下是使用者級別執行緒的不同優勢 -

  • 執行緒切換不需要核心模式特權。
  • 使用者級執行緒可以在任何作業系統上執行。
  • 排程可以是使用者級別執行緒中特定於應用程式的。
  • 使用者級執行緒可以快速建立和管理。

使用者級別執行緒的缺點
以下是使用者級別執行緒的不同缺點 -

  • 在典型的作業系統中,大多數系統呼叫都是阻塞的。
  • 多執行緒應用程式無法利用多處理。

核心級執行緒
作業系統管理的執行緒在核心上執行,核心是作業系統的核心。

在這種情況下,核心執行執行緒管理。 應用程式區域中沒有執行緒管理程式碼。 核心執行緒直接由作業系統支援。 任何應用程式都可以程式設計為多執行緒。 應用程式中的所有執行緒都在單個進程中受支援。

核心維護整個流程和流程內的各個執行緒的上下文資訊。 核心排程是基於執行緒完成的。 核心在核心空間中執行執行緒建立,排程和管理。 核心執行緒建立和管理通常比使用者執行緒要慢。 核心級執行緒的例子是Windows,Solaris。

核心級執行緒的優點
以下是核心級執行緒的不同優點 -

  • 核心可以同時在多個進程上安排來自同一進程的多個執行緒。
  • 如果進程中的一個執行緒被阻塞,則核心可以排程同一進程的另一個執行緒。
  • 核心例程本身可以是多執行緒的。

核心級執行緒的缺點

  • 核心執行緒建立和管理通常比使用者執行緒要慢。
  • 在同一進程內將控制從一個執行緒轉移到另一個執行緒需要將模式切換到核心。

執行緒控制塊 - TCB

執行緒控制塊(TCB)可以定義為作業系統核心中的資料結構,主要包含有關執行緒的資訊。 儲存在TCB中的執行緒特定資訊將突出顯示有關每個進程的一些重要資訊。

考慮與TCB中包含的執行緒相關的以下幾點 -

  • 執行緒標識 - 它是分配給每個新執行緒的唯一執行緒標識(tid)。
  • 執行緒狀態 - 它包含與執行緒狀態(執行,可執行,不執行,宕機)有關的資訊。
  • 程式計數器(PC) - 它指向執行緒的當前程式指令。
  • 暫存器組 - 它包含分配給它們的執行緒的暫存器值用於計算。
  • 堆疊指標 - 它指向進程中執行緒的堆疊。 它包含執行緒範圍內的區域性變數。
  • 指向PCB的指標 - 它包含指向建立該執行緒的進程的指標。

進程和執行緒之間的關係

在多執行緒中,進程和執行緒是兩個非常緊密相關的術語,具有相同的目標,使計算機能夠一次完成多個任務。 一個進程可以包含一個或多個執行緒,但相反,執行緒不能包含進程。 但是,它們仍然是執行的兩個基本單位。 一個執行一系列指令的程式啟動進程,並啟動兩者。

下表顯示了進程和執行緒之間的比較 -

編號 進程 執行緒
1 進程是重量或資源密集型的。 執行緒是輕量級的,比進程佔用更少的資源。
2 進程切換需要與作業系統進行互動。 執行緒切換不需要與作業系統互動。
3 在多個處理環境中,每個進程執行相同的程式碼,但擁有自己的記憶體和檔案資源。 所有執行緒都可以共用相同的一組開啟檔案,子進程。
4 如果一個進程被阻塞,那麼在第一個進程解除阻塞之前,不能執行其他進程。 當一個執行緒被阻塞並等待時,同一個任務中的第二個執行緒可以執行。
5 不使用執行緒的多進程使用更多的資源。 多執行緒進程使用更少的資源。
6 在多個進程中,每個進程獨立於其他流程運作。 一個執行緒可以讀取,寫入或更改另一個執行緒的資料。
7 如果父進程中有任何更改,則不會影響子進程。 如果主執行緒中有任何更改,則可能會影響該進程的其他執行緒的行為。
8 要與兄弟進程進行通訊,進程必須使用進程間通訊。 執行緒可以直接與該進程的其他執行緒通訊。

多執行緒的概念

正如我們前面討論過的,多執行緒是CPU通過並行執行多個執行緒來管理作業系統使用的能力。 多執行緒的主要思想是通過將進程分成多個執行緒來實現並行性。 以更簡單的方式,多執行緒是通過使用執行緒的概念來實現多工的方式。

以下範例的幫助可以理解多執行緒的概念。

範例

假設我們正在執行一個進程。 這個過程可能是為了寫一些東西而開啟MS詞。 在這樣的過程中,一個執行緒將被分配以開啟MS字,另一個執行緒將被要求寫入。 現在,假設想要編輯某些東西,那麼將需要另一個執行緒來執行編輯任務等等。

下圖解釋記憶體中是否存在多個執行緒 -

我們可以在上面的圖中看到,一個進程中可以存在多個執行緒,其中每個執行緒都包含自己的暫存器集和區域性變數。 除此之外,進程中的所有執行緒共用全域性變數。

多執行緒的優點

現在讓我們看看多執行緒的一些優點。 優點如下 -

  • 通訊速度 - 多執行緒技術提高了計算速度,因為每個核心或處理器可以同時處理單獨的執行緒。
  • 程式保持響應 - 它允許程式保持響應,因為一個執行緒等待輸入,另一個執行緒同時執行GUI。
  • 存取全域性變數 - 在多執行緒中,特定進程的所有執行緒都可以存取全域性變數,如果全域性變數有任何變化,那麼其他執行緒也可以看到它。
  • 資源的利用 - 在每個程式中執行多個執行緒可以更好地使用CPU,並且CPU的空閒時間會變少。
  • 共用資料 - 每個執行緒不需要額外的空間,因為程式中的執行緒可以共用相同的資料。

多執行緒的缺點

現在讓我們看看多執行緒的一些缺點。 缺點如下 -

  • 不適用於單處理器系統 - 與多處理器系統的效能相比,多執行緒技術難以實現單處理器系統的計算速度。
  • 安全性問題 - 由於程式中的所有執行緒共用相同的資料,因此總是存在安全問題,因為任何未知執行緒都可以更改資料。
  • 複雜性增加 - 多執行緒會增加程式的複雜性,偵錯變得困難。
  • 導致死鎖狀態 - 多執行緒會導致程式潛在的達到死鎖狀態的風險。
  • 需要同步 - 需要同步以避免互斥。這導致更多的記憶體和CPU利用率。