鍍金池/ 教程/ Python/ 線程
事件驅動程序
反應式編程
進程池
線程
線程池
Python并發(fā)簡介
并發(fā)vs并行
同步線程
調試線程應用程序
進程間通信
線程通信
Python并發(fā)編程教程
測試線程應用程序
基準和性能分析
系統(tǒng)和內存架構
線程的實現
多進程

線程

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

線程是操作系統(tǒng)中最小的執(zhí)行單元。 它本身不是一個程序,而是在程序中運行。 換句話說,線程并不相互獨立,并與其他線程共享代碼段,數據段等。 這些線程也被稱為輕量級進程。

線程狀態(tài)

為了深入理解線程的功能,我們需要了解線程的生命周期或不同的線程狀態(tài)。 通常,線程可以以五種不同的狀態(tài)存在。 下面顯示了不同的狀態(tài) -

新線程
新線程在新狀態(tài)下開始其生命周期。 但是,在這個階段,它尚未開始,也沒有分配任何資源。 我們可以說它只是一個對象的實例。

可運行
當新出生的線程啟動時,線程變?yōu)榭蛇\行的,即等待運行。 在這種狀態(tài)下,它擁有所有資源,但仍然有任務調度程序沒有安排它運行。

運行
在此狀態(tài)下,線程進行并執(zhí)行已由任務計劃程序選擇運行的任務。 現在,線程可以進入死態(tài)或不可運行/等待狀態(tài)。

非運行/待機
在這種狀態(tài)下,線程暫停,因為它要么等待某個I/O請求的響應,要么等待其他線程執(zhí)行完成。

死鎖

可運行線程在完成其任務或以其他方式終止時進入終止狀態(tài)。

下圖顯示了線程的完整生命周期 -

線程類型

在本節(jié)中,我們將看到不同類型的線程。 類型如下所述 -

用戶級線程
這些是用戶管理的線程。

在這種情況下,線程管理內核不知道線程的存在。 線程庫包含用于創(chuàng)建和銷毀線程的代碼,用于在線程之間傳遞消息和數據,用于調度線程執(zhí)行以及用于保存和恢復線程上下文。 應用程序以單個線程開始。

用戶級線程的例子是 -

  • Java線程
  • POSIX線程

用戶級線程的優(yōu)點
以下是用戶級別線程的不同優(yōu)勢 -

  • 線程切換不需要內核模式特權。
  • 用戶級線程可以在任何操作系統(tǒng)上運行。
  • 調度可以是用戶級別線程中特定于應用程序的。
  • 用戶級線程可以快速創(chuàng)建和管理。

用戶級別線程的缺點
以下是用戶級別線程的不同缺點 -

  • 在典型的操作系統(tǒng)中,大多數系統(tǒng)調用都是阻塞的。
  • 多線程應用程序無法利用多處理。

內核級線程
操作系統(tǒng)管理的線程在內核上運行,內核是操作系統(tǒng)的核心。

在這種情況下,內核執(zhí)行線程管理。 應用程序區(qū)域中沒有線程管理代碼。 內核線程直接由操作系統(tǒng)支持。 任何應用程序都可以編程為多線程。 應用程序中的所有線程都在單個進程中受支持。

內核維護整個流程和流程內的各個線程的上下文信息。 內核調度是基于線程完成的。 內核在內核空間中執(zhí)行線程創(chuàng)建,調度和管理。 內核線程創(chuàng)建和管理通常比用戶線程要慢。 內核級線程的例子是Windows,Solaris。

內核級線程的優(yōu)點
以下是內核級線程的不同優(yōu)點 -

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

內核級線程的缺點

  • 內核線程創(chuàng)建和管理通常比用戶線程要慢。
  • 在同一進程內將控制從一個線程轉移到另一個線程需要將模式切換到內核。

線程控制塊 - TCB

線程控制塊(TCB)可以定義為操作系統(tǒng)內核中的數據結構,主要包含有關線程的信息。 存儲在TCB中的線程特定信息將突出顯示有關每個進程的一些重要信息。

考慮與TCB中包含的線程相關的以下幾點 -

  • 線程標識 - 它是分配給每個新線程的唯一線程標識(tid)。
  • 線程狀態(tài) - 它包含與線程狀態(tài)(運行,可運行,不運行,死機)有關的信息。
  • 程序計數器(PC) - 它指向線程的當前程序指令。
  • 寄存器組 - 它包含分配給它們的線程的寄存器值用于計算。
  • 堆棧指針 - 它指向進程中線程的堆棧。 它包含線程范圍內的局部變量。
  • 指向PCB的指針 - 它包含指向創(chuàng)建該線程的進程的指針。

進程和線程之間的關系

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

下表顯示了進程和線程之間的比較 -

編號 進程 線程
1 進程是重量或資源密集型的。 線程是輕量級的,比進程占用更少的資源。
2 進程切換需要與操作系統(tǒng)進行交互。 線程切換不需要與操作系統(tǒng)交互。
3 在多個處理環(huán)境中,每個進程執(zhí)行相同的代碼,但擁有自己的內存和文件資源。 所有線程都可以共享相同的一組打開文件,子進程。
4 如果一個進程被阻塞,那么在第一個進程解除阻塞之前,不能執(zhí)行其他進程。 當一個線程被阻塞并等待時,同一個任務中的第二個線程可以運行。
5 不使用線程的多進程使用更多的資源。 多線程進程使用更少的資源。
6 在多個進程中,每個進程獨立于其他流程運作。 一個線程可以讀取,寫入或更改另一個線程的數據。
7 如果父進程中有任何更改,則不會影響子進程。 如果主線程中有任何更改,則可能會影響該進程的其他線程的行為。
8 要與兄弟進程進行通信,進程必須使用進程間通信。 線程可以直接與該進程的其他線程通信。

多線程的概念

正如我們前面討論過的,多線程是CPU通過并發(fā)執(zhí)行多個線程來管理操作系統(tǒng)使用的能力。 多線程的主要思想是通過將進程分成多個線程來實現并行性。 以更簡單的方式,多線程是通過使用線程的概念來實現多任務的方式。

以下示例的幫助可以理解多線程的概念。

示例

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

下圖解釋內存中是否存在多個線程 -

我們可以在上面的圖中看到,一個進程中可以存在多個線程,其中每個線程都包含自己的寄存器集和局部變量。 除此之外,進程中的所有線程共享全局變量。

多線程的優(yōu)點

現在讓我們看看多線程的一些優(yōu)點。 優(yōu)點如下 -

  • 通信速度 - 多線程技術提高了計算速度,因為每個核心或處理器可以同時處理單獨的線程。
  • 程序保持響應 - 它允許程序保持響應,因為一個線程等待輸入,另一個線程同時運行GUI。
  • 訪問全局變量 - 在多線程中,特定進程的所有線程都可以訪問全局變量,如果全局變量有任何變化,那么其他線程也可以看到它。
  • 資源的利用 - 在每個程序中運行多個線程可以更好地使用CPU,并且CPU的空閑時間會變少。
  • 共享數據 - 每個線程不需要額外的空間,因為程序中的線程可以共享相同的數據。

多線程的缺點

現在讓我們看看多線程的一些缺點。 缺點如下 -

  • 不適用于單處理器系統(tǒng) - 與多處理器系統(tǒng)的性能相比,多線程技術難以實現單處理器系統(tǒng)的計算速度。
  • 安全性問題 - 由于程序中的所有線程共享相同的數據,因此總是存在安全問題,因為任何未知線程都可以更改數據。
  • 復雜性增加 - 多線程會增加程序的復雜性,調試變得困難。
  • 導致死鎖狀態(tài) - 多線程會導致程序潛在的達到死鎖狀態(tài)的風險。
  • 需要同步 - 需要同步以避免互斥。這導致更多的內存和CPU利用率。

上一篇:同步線程下一篇:進程間通信