天天看點

alin的學習之路:使用者級線程和核心級線程alin的學習之路:使用者級線程和核心級線程1. 線程的使用者級線程實作方式2. 核心級線程3. 使用者級線程和核心級線程的差別

alin的學習之路:使用者級線程和核心級線程

轉載:https://blog.csdn.net/gatieme/article/details/51892437

1. 線程的使用者級線程實作方式

在使用者級線程中,

有關線程管理的所有工作都由應用程式完成,核心意識不到線程的存在. 應用程式可以通過使用線程庫設計成多線程程式. 通常,應用程式從單線程起始,在該線程中開始運作,在其運作的任何時刻,可以通過調用線程庫中的派生例程建立一個在相同程序中運作的新線程。

使用者級線程僅存在于使用者空間中,此類線程的建立、撤銷、線程之間的同步與通信功能,都無須利用系統調用來實作。使用者程序利用線程庫來控制使用者線程。由于線程在程序内切換的規則遠比程序排程和切換的規則簡單,不需要使用者态/核心态切換,是以切換速度快。由于這裡的處理器時間片配置設定是以程序為基本機關,是以每個線程執行的時間相對減少為了在作業系統中加入線程支援,采用了在使用者空間增加運作庫來實作線程,這些運作庫被稱為“線程包”,使用者線程是不能被作業系統所感覺的。使用者線程多見于一些曆史悠久的作業系統,例如Unix作業系統

使用者級線程駐留在使用者空間或模式。運作時庫管理這些線程,它也位于使用者空間。它們對于作業系統是不可見的,是以無法被排程到處理器核心。每個線程并不具有自身的線程上下文。是以,就線程的同時執行而言,任意給定時刻每個程序隻能夠有一個線程在運作,而且隻有一個處理器核心會被配置設定給該程序。對于一個程序,可能有成千上萬個使用者級線程,但是它們對系統資源沒有影響。運作時庫排程并分派這些線程。

下圖說明了使用者級線程的實作方式,

alin的學習之路:使用者級線程和核心級線程alin的學習之路:使用者級線程和核心級線程1. 線程的使用者級線程實作方式2. 核心級線程3. 使用者級線程和核心級線程的差別

如同在圖中看到的那樣,庫排程器從程序的多個線程中選擇一個線程,然後該線程和該程序允許的一個核心線程關聯起來。核心線程将被作業系統排程器指派到處理器核心。使用者級線程是一種”多對一”的線程映射。(多指的是使用者線程多,核心線程一)

使用者級線程的特點

核心對線程包一無所知。從核心角度考慮,就是按正常的方式管理,即單線程程序(存在運作時系統)

使用者級線程的優點

使用者線程的優點主要有

  1. 可以在不支援線程的作業系統中實作。
  2. 建立和銷毀線程、線程切換代價等線程管理的代價比核心線程少得多, 因為儲存線程狀态的過程和調用程式都隻是本地過程
  3. 允許每個程序定制自己的排程算法,線程管理比較靈活。這就是必須自己寫管理程式,與核心線程的差別
  4. 線程能夠利用的表空間和堆棧空間比核心級線程多
  5. 不需要陷阱,不需要上下文切換,也不需要對記憶體高速緩存進行重新整理,使得線程調用非常快捷
  6. 線程的排程不需要核心直接參與,控制簡單。

使用者線程的缺點

使用者線程的缺點主要有

  1. 線程發生I/O或頁面故障引起的阻塞時,如果調用阻塞系統調用則核心由于不知道有多線程的存在,而會阻塞整個程序進而阻塞所有線程, 是以同一程序中隻能同時有一個線程在運作
  2. 頁面失效也會産生類似的問題。
  3. 一個單獨的程序内部,沒有時鐘中斷,是以不可能用輪轉排程的方式排程線程
  4. 資源排程按照程序進行,多個處理機下,同一個程序中的線程隻能在同一個處理機下分時複用

補充

在使用者級線程中,每個程序裡的線程表由運作時系統管理。當一個線程轉換到就緒狀态或阻塞狀态時,在該線程表中存放重新啟動該線程所需的資訊,與核心在程序表中存放的程序的資訊完全一樣

2. 核心級線程

在核心級線程中,

核心線程建立和銷毀都是由作業系統負責、通過系統調用完成的。在核心的支援下運作,無論是使用者程序的線程,或者是系統程序的線程,他們的建立、撤銷、切換都是依靠核心實作的。

線程管理的所有工作由核心完成,應用程式沒有進行線程管理的代碼,隻有一個到核心級線程的程式設計接口. 核心為程序及其内部的每個線程維護上下文資訊,排程也是在核心基于線程架構的基礎上完成。如圖說明了核心級線程的實作方式。

核心線程駐留在核心空間,它們是核心對象。有了核心線程,每個使用者線程被映射或綁定到一個核心線程。使用者線程在其生命期内都會綁定到該核心線程。一旦使用者線程終止,兩個線程都将離開系統。這被稱作”一對一”線程映射,

  1. 線程的建立、撤銷和切換等,都需要核心直接實作,即核心了解每一個作為可排程實體的線程
  2. 這些線程可以在全系統内進行資源的競争
  3. 核心空間内為每一個核心支援線程設定了一個線程控制塊(TCB),核心根據該控制塊,感覺線程的存在,并進行控制

如圖所示,即核心級線程的實作方式, 每個使用者線程都直接與一個核心線程相關聯.

alin的學習之路:使用者級線程和核心級線程alin的學習之路:使用者級線程和核心級線程1. 線程的使用者級線程實作方式2. 核心級線程3. 使用者級線程和核心級線程的差別

作業系統排程器管理、排程并分派這些線程。運作時庫為每個使用者級線程請求一個核心級線程。作業系統的記憶體管理和排程子系統必須要考慮到數量巨大的使用者級線程。您必須了解每個程序允許的線程的最大數目是多少。作業系統為每個線程建立上下文。程序的每個線程在資源可用時都可以被指派到處理器核心。

核心線程的特點

當某個線程希望建立一個新線程或撤銷一個已有線程時,它進行一個系統調用

核心線程的優點

核心線程的優點:

  1. 多處理器系統中,核心能夠并行執行同一程序内的多個線程
  2. 如果程序中的一個線程被阻塞,能夠切換同一程序内的其他線程繼續執行(使用者級線程的一個缺點)
  3. 所有能夠阻塞線程的調用都以系統調用的形式實作,代價可觀
  4. 當一個線程阻塞時,核心根據選擇可以運作另一個程序的線程,而使用者空間實作的線程中,運作時系統始終運作自己程序中的線程
  5. 信号是發給程序而不是線程的,當一個信号到達時,應該由哪一個線程處理它?線程可以“注冊”它們感興趣的信号

3. 使用者級線程和核心級線程的差別

  1. 核心支援線程是OS核心可感覺的,而使用者級線程是OS核心不可感覺的。
  2. 使用者級線程的建立、撤消和排程不需要OS核心的支援,是在語言(如Java)這一級處理的;而核心支援線程的建立、撤消和排程都需OS核心提供支援,而且與程序的建立、撤消和排程大體是相同的。
  3. 使用者級線程執行系統調用指令時将導緻其所屬程序被中斷,而核心支援線程執行系統調用指令時,隻導緻該線程被中斷。
  4. 在隻有使用者級線程的系統内,CPU排程還是以程序為機關,處于運作狀态的程序中的多個線程,由使用者程式控制線程的輪換運作;在有核心支援線程的系統内,CPU排程則以線程為機關,由OS的線程排程程式負責線程的排程。
  5. 使用者級線程的程式實體是運作在使用者态下的程式,而核心支援線程的程式實體則是可以運作在任何狀态下的程式。

核心支援線程的系統内,CPU排程則以線程為機關,由OS的線程排程程式負責線程的排程。

  1. 使用者級線程的程式實體是運作在使用者态下的程式,而核心支援線程的程式實體則是可以運作在任何狀态下的程式。
    alin的學習之路:使用者級線程和核心級線程alin的學習之路:使用者級線程和核心級線程1. 線程的使用者級線程實作方式2. 核心級線程3. 使用者級線程和核心級線程的差別

繼續閱讀