內核線程與用戶線程


前言

  • linux內核不存在整真正意義上的線程。linux將所有的執行實體都稱之為任務(task),每一個任務在干年上都類似於一個單線程的進程,具有內存空間、執行實體、文件資源等。但是,linux下不同任務之間可以選擇公用內存空間,因而在實際意義上,共享同一個內存空間的多個任務構成了一個進程,而這些任務就成為這個任務里面的線程。

內核線程

  • 內核線程又稱為守護進程,內核線程的調度由內核負責,一個內核線程處於阻塞狀態時不影響其他的內核線程,因為其是調度的基本單位。這與用戶線程是不一樣的。

  • 這些線程可以在全系統內進行資源的競爭。

  • 內核空間內為每一個內核支持線程設置了一個線程控制塊(TCB),內核根據該控制塊,感知線程的存在,並進行控制。在一定程度上類似於進程,只是創建、調度的開銷要比進程小。有的統計是1:10。

  • 內核線程切換由內核控制,當線程進行切換的時候,由用戶態轉化為內核態。切換完畢要從內核態返回用戶態,即存在用戶態和內核態之間的轉換,比如多核cpu,還有win線程的實現

    • 優點:

  1. 在多處理器系統中,內核能夠同時調度同一進程中多個線程並行執行到多個處理器中。
  2. 如果進程中的一個線程被阻塞,內核可以調度同一個進程中的另一個線程。
  3. 內核支持線程具有很小的數據結構和堆棧,線程的切換比較快,切換開銷小。
  4. 內核本身也可以使用多線程的方式來實現。
  • 缺點:

即使CPU在同一個進程的多個線程之間切換,也需要陷入內核,因此其速度和效率不如用戶級線程。

用戶線程

  • 用戶線程在用戶空間中實現,內核並沒有直接對用戶線程進程調度,內核的調度對象和傳統進程一樣,還是進程(用戶進程)本身,內核並不能看到用戶線程,內核並不知道用戶線程的存在。

  • 不需要內核支持而在用戶程序中實現的線程,其不依賴於操作系統核心,應用進程利用線程庫提供創建、同步、調度和管理線程的函數來控制用戶線程。

  • 內核資源的分配仍然是按照進程(用戶進程)進行分配的;各個用戶線程只能在進程內進行資源競爭

  • 用戶級線程內核的切換由用戶態程序自己控制內核切換(通過系統調用來獲得內核提供的服務),不需要內核干涉,少了進出內核態的消耗,但不能很好的利用多核Cpu。目前Linux pthread大體是這么做的

  • 每個用戶線程並不具有自身的線程上下文。因此,就線程的同時執行而言,任意給定時刻每個進程只能夠有一個線程在運行,而且只有一個處理器內核會被分配給該進程。

    • 優點:

線程的切換無需陷入內核,故切換開銷小,速度非常快。

  • 缺點:

系統調用的阻塞問題:對應用程序來講,同一進程中只能同時有一個線程在運行,一個線程的阻塞將導致整個進程中所有線程的阻塞;由於這里的處理器時間片分配是以進程為基本單位,所以每個線程執行的時間相對減少。

用戶級線程和內核級線程的區別:

  • 內核支持:用戶級線程可在一個不支持線程的OS中實現;內核支持線程則需要得到OS內核的支持。亦即內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。

  • 處理器分配: 在多處理機環境下,對用戶級線程而言主,內核一次只為一個進程分配一個處理器,進程無法享用多處理機帶來的好處;在設置有內核支持線程時,內核可調度一個應用中的多個線程同時在多個處理器上並行運行,提高程序的執行速度和效率。

  • 調度和線程執行時間:設置有內核支持線程的系統,其調度方式和算法與進程的調度十分相似,只不過調度單位是線程;對只設置了用戶級線程的系統,調度的單位仍為進程。

  • 用戶級線程執行系統調用指令時將導致其所屬進程被中斷,而內核支持線程執行系統調用指令時,只導致該線程被中斷。

  • 在只有用戶級線程的系統內,CPU調度還是以進程為單位,處於運行狀態的進程中的多個線程,由用戶程序控制線程的輪換運行;在有內核支持線程的系統內,CPU調度則以線程為單位,由OS的線程調度程序負責線程的調度。

內核線程與用戶線程的聯系

一對一模型

  • 特點:

    有了內核線程,每個用戶線程被映射或綁定到一個內核線程。用戶線程在其生命期內都會綁定到該內核線程。一旦用戶線程終止,兩個線程都將離開系統。這被稱作"一對一"線程映射。(反過來,一個內核線程不一定就會對應一個用戶線程)。一般一直使用API或者是系統調用創建的線程均為一對一線程。例如,linux使用clone創建的線程,以及win下使用CreateThread創建的線程。

  • 弊端:

    內核線程數量有限.
    許多操作系統內核線程調用的時候,上下文切換的開銷很大。

混合線程模型

  • 混合線程實現是用戶線程和內核線程的交叉,使得庫和操作系統都可以管理線程。用戶線程由運行時庫調度器管理,內核線程由操作系統調度器管理。在這種實現中,進程有着自己的內核線程池。可運行的用戶線程由運行時庫分派並標記為准備好執行的可用線程。操作系統選擇用戶線程並將它映射到線程池中的可用內核線程。多個用戶線程可以分配給相同的內核線程。

多對一模型

  • 特點:

    多對一的模型將多個用戶線程映射到一個內核線程。
    多對一模型線程的切換速度要快很多(線程之間的切換由用戶代碼來執行)

  • 弊端:

    如果其中一個線程阻塞,那么所有線程將無法執行。

多對多模型

  • 特點:

    將上述兩種模型的特點進行綜合,即將多個用戶線程映射到少數但不只一個內核線程中去。
    多對多模型對用戶線程的數量沒有什么限制,在多處理器系統上也會有一定的性能提升,不過提升的幅度比不上一對一模型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM