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

来源:http://www.cnblogs.com/wanglulu/archive/2016/05/24/5522809.html
-Advertisement-
Play Games

1 .內核級線程:切換由內核控制,當線程進行切換的時候,由用戶態轉化為內核態。切換完畢要從內核態返回用戶態;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。 2. 用戶級線程內核的切換由用戶態程式自己控制內核切換,不需要內核干涉,少了進出內核態的消耗,但不能很好的利用多核Cpu ...


 1 .內核級線程:切換由內核控制,當線程進行切換的時候,由用戶態轉化為內核態。切換完畢要從內核態返回用戶態;可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。

 2. 用戶級線程內核的切換由用戶態程式自己控制內核切換,不需要內核干涉,少了進出內核態的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這麼做的。

線 程的實現可以分為兩類:用戶級線程(User-Level Thread)和內核線線程(Kernel-Level Thread),後者又稱為內核支持的線程或輕量級進程。在多線程操作系統中,各個系統的實現方式並不相同,在有的系統中實現了用戶級線程,有的系統中實 現了內核級線程。

用戶線程指不需要內核支持而在用戶程式中實現的線程,其不依賴於操作系統核心,應 用進程利用線程庫提供創建、同步、調度和管理線程的函數來控制用戶線程。不需要用戶態/核心態切換,速度快,操作系統內核不知道多線程的存在,因此一個線 程阻塞將使得整個進程(包括它的所有線程)阻塞。由於這裡的處理器時間片分配是以進程為基本單位,所以每個線程執行的時間相對減少。

內核線程:由操作系統內核創建和撤銷。內核維護進程及線程的上下文信息以及線程切換。一個內核線程由於I/O操作而阻塞,不會影響其它線程的運行。Windows NT和2000/XP支持內核線程。

用戶線程運行在一個中間系統上面。目 前中間系統實現的方式有兩種,即運行時系統(Runtime System)和內核控制線程。“運行時系統”實質上是用於管理和控制線程的函數集合,包括創建、撤銷、線程的同步和通信的函數以及調度的函數。這些函數 都駐留在用戶空間作為用戶線程和內核之間的介面。用戶線程不能使用系統調用,而是當線程需要系統資源時,將請求傳送給運行時,由後者通過相應的系統調用來 獲取系統資源。內核控制線程:系統在分給進程幾個輕型進程(LWP),LWP可以通過系統調用來獲得內核提供的服務,而進程中的用戶線程可通過復用來關聯 到LWP,從而得到內核的服務。

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

(1)內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。

(2)用戶級線程的創建、撤消和調度不需要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持線程的創建、撤消和調度都需OS內核提供支持,而且與進程的創建、撤消和調度大體是相同的。

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

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

(5)用戶級線程的程式實體是運行在用戶態下的程式,而內核支持線程的程式實體則是可以運行在任何狀態下的程式。

內核線程的優點:

(1)當有多個處理機時,一個進程的多個線程可以同時執行。

缺點:

(1)由內核進行調度。

用戶進程的優點:

(1) 線程的調度不需要內核直接參与,控制簡單。

(2) 可以在不支持線程的操作系統中實現。

(3) 創建和銷毀線程、線程切換代價等線程管理的代價比內核線程少得多。

(4) 允許每個進程定製自己的調度演算法,線程管理比較靈活。

(5) 線程能夠利用的表空間和堆棧空間比內核級線程多。

(6) 同一進程中只能同時有一個線程在運行,如果有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。另外,頁面失效也會產生同樣的問題。

缺點:

(1)資源調度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時復用

 

========================================================================================================

 

內核線程

內核線程只運行在內核態,不受用戶態上下文的拖累。

  • 處理器競爭:可以在全系統範圍內競爭處理器資源;
  • 使用資源:唯一使用的資源是內核棧和上下文切換時保持寄存器的空間
  • 調度:調度的開銷可能和進程自身差不多昂貴
  • 同步效率:資源的同步和數據共用比整個進程的數據同步和共用要低一些。

輕量級進程

輕量級進程(LWP)是建立在內核之上並由內核支持的用戶線程,它是內核線程的高度抽象,每一個輕量級進程都與一個特定的內核線程關聯。內核線程只能由內核管理並像普通進程一樣被調度。

輕量級進程由clone()系統調用創建,參數是CLONE_VM,即與父進程是共用進程地址空間和系統資源。

與普通進程區別:LWP只有一個最小的執行上下文和調度程式所需的統計信息。

  • 處理器競爭:因與特定內核線程關聯,因此可以在全系統範圍內競爭處理器資源
  • 使用資源:與父進程共用進程地址空間
  • 調度:像普通進程一樣調度

用戶線程

用戶線程是完全建立在用戶空間的線程庫,用戶線程的創建、調度、同步和銷毀全又庫函數在用戶空間完成,不需要內核的幫助。因此這種線程是極其低消耗和高效的。

  • 處理器競爭:單純的用戶線程是建立在用戶空間,其對內核是透明的,因此其所屬進程單獨參與處理器的競爭,而進程的所有線程參與競爭該進程的資源。
  • 使用資源:與所屬進程共用進程地址空間和系統資源。
  • 調度:由在用戶空間實現的線程庫,在所屬進程內進行調度

Linux使用的線程庫

LinuxThreads是用戶空間的線程庫,所採用的是線程-進程1對1模型(即一個 用戶線程對應一個輕量級進程,而一個輕量級進程對應一個特定 的內核線程),將線程的調度等同於進程的調度,調度交由內核完成,而線程的創建、同步、銷毀由核外線程庫完成(LinuxThtreads已綁定到 GLIBC中發行)。

在LinuxThreads中,由專門的一個管理線程處理所有的線程管理工作。當進程第 一次調用pthread_create()創建線程時就會先 創建(clone())並啟動管理線程。後續進程pthread_create()創建線程時,都是管理線程作為pthread_create()的調用 者的子線程,通過調用clone()來創建用戶線程,並記錄輕量級進程號和線程id的映射關係,因此,用戶線程其實是管理線程的子線程。

LinuxThreads只支持調度範圍為PTHREAD_SCOPE_SYSTEM的調度,預設的調度策略是SCHED_OTHER。

用戶線程調度策略也可修改成SCHED_FIFO或SCHED_RR方式,這兩種方式支持優先順序為0-99,而SCHED_OTHER只支持0。

  • SCHED_OTHER 分時調度策略,
  • SCHED_FIFO   實時調度策略,先到先服務
  • SCHED_RR     實時調度策略,時間片輪轉

SCHED_OTHER是普通進程的,後兩個是實時進程的(一般的進程都是普通進程,系 統中出現實時進程的機會很少)。SCHED_FIFO、 SCHED_RR優先順序高於所有SCHED_OTHER的進程,所以只要他們能夠運行,在他們運行完之前,所有SCHED_OTHER的進程的都沒有得到 執行的機會。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 STM32F1系列晶元算是在STM32中最早的一系列,在實際生活中應用的比較廣泛。因此,彙總一下STM32F1系列晶元常見片內資源,每一篇文章把重點提出來講解,並提供軟體源代碼工程。 彙總常見資源:基本IO、定時器TIM、串口USART、ADC模數轉換、DAC數模轉換、SPI串列通信、EXIT ...
  • 1.利用命令模式 捕獲整個屏幕 : $ gnome-screenshot 截完屏之後我們可以設置自定義圖片存儲位置,如圖: 捕獲當前終端Terminal : $ gnome-screenshot -w 捕獲自定義區域 :$ gnome-screenshot -a 利用-B參數可以去除終端視窗的名稱狀 ...
  • 原文:http://blog.jobbole.com/101322/ 前言 看源代碼是一個程式員必須經歷的事情,也是可以提升能力的一個捷徑.個人認為: 要完全掌握一個軟體的方法只有閱讀源碼。 在Windows下有sourceinsight這個源碼閱讀軟體(雖然我沒用過,但是網上評價還不錯),由於我是 ...
  • 通常我們應用nginx做代理時,用到它的輪訓服務 #設置輪詢名稱 upstream zyy{ server 127.0.0.1:8080 #本機的apache服務 } server { listen 80; server_name test.com; root /test; location / { ...
  • 1. 查看Linux啟動的服務 chkconfig --list 查詢出所有當前運行的服務 chkconfig --list atd 查詢atd服務的當前狀態 2.停止所有服務並且在下次系統啟動時不再啟動,如下所示: chkconfig --levels 12345 NetworkManager o ...
  • 一、問題描述(預設Linux安裝的SSHD服務存在一些漏洞,特此升級) 在曾經手動升級sshd服務後發現了三個後遺症: selinux開啟的狀態下,重啟機器sshd不啟動(原因:庫文件“libcrypto.so.1.0.0”的selinux標記不正確,導致sshd無法調用訪問該文件,使用setrou ...
  • 一、 概念理解 FTP的主動、被動模式讓人很煩,相信你認真看完下麵的描述就不會再煩了! 由於歷史原因,FTP服務預設需要有2個埠20(數據埠),21(控制埠) FTP服務的最初的工作過程是:Client請求Server的21埠建立控制連接,然後Server主動用20埠去連Client建立數 ...
  • 本文是Linux Shell系列教程的第(一)篇,更多shell教程請看:Linux Shell系列教程 想要學習linux,shell知識必不可少,今天就給大家來簡單介紹下shell的基本知識。 Shell簡介 Shell自身是一個用C語言編寫的程式,是用戶來使用Unix或Linux的橋梁,用戶的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...