亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

用戶態(tài)和內(nèi)核態(tài)-用戶線程和內(nèi)核態(tài)線程的區(qū)別

 更新時(shí)間:2022年09月08日 09:54:54   作者:會(huì)飛的湯姆貓  
這篇文章主要介紹了用戶態(tài)和內(nèi)核態(tài)-用戶線程和內(nèi)核態(tài)線程的區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

用戶態(tài)和內(nèi)核態(tài):用戶線程和內(nèi)核態(tài)線程有什么區(qū)別?

面試題:用戶態(tài)和內(nèi)核態(tài):用戶線程和內(nèi)核態(tài)線程有什么區(qū)別?

組合型問題:

  • 用戶態(tài)和內(nèi)核態(tài)是什么?
  • 用戶級(jí)線程和內(nèi)核線程是怎樣的對(duì)應(yīng)關(guān)系?
  • 內(nèi)核相應(yīng)系統(tǒng)調(diào)用是怎樣的過程?
  • ......

而且這個(gè)問題還關(guān)聯(lián)到了我們后面要學(xué)習(xí)的多線程、I/O 模型、網(wǎng)絡(luò)優(yōu)化等。 所以這是一道很不錯(cuò)的面試題目,它不是簡(jiǎn)單考某個(gè)概念,而是通過讓求職者比較兩種東西,從而考察你對(duì)知識(shí)整體的認(rèn)知和理解。 今天就請(qǐng)你順著這個(gè)問題,深入學(xué)習(xí)內(nèi)核的工作機(jī)制,和我一起去理解用戶態(tài)和內(nèi)核態(tài)。

一.什么是用戶態(tài)和內(nèi)核態(tài)?

Kernel運(yùn)行在超級(jí)權(quán)限模式(Supervisor Mode)下,所以擁有很高的權(quán)限,按照權(quán)限管理原則,多數(shù)應(yīng)用程序應(yīng)該運(yùn)行在最小權(quán)限下,因此很多操作系統(tǒng)將內(nèi)存分為2個(gè)區(qū)域:

  • 內(nèi)核空間:只有內(nèi)核程序可以訪問
  • 用戶空間:專門給應(yīng)用程序使用

二.用戶態(tài)和內(nèi)核態(tài)

用戶空間中的代碼被限制了只能使用一個(gè)局部的內(nèi)存空間,我們說這些程序在用戶態(tài)(User Mode)執(zhí)行。內(nèi)核空間中的代碼可以訪問所有內(nèi)存,我們稱這些程序在內(nèi)核態(tài)(Kernal Mode) 執(zhí)行。

三.系統(tǒng)調(diào)用過程

如果用戶態(tài)程序需要執(zhí)行系統(tǒng)調(diào)用,就需要切換到內(nèi)核態(tài)執(zhí)行。下面我們來講講這個(gè)過程的原理。

如上圖所示:內(nèi)核程序執(zhí)行在內(nèi)核態(tài)(Kernal Mode),用戶程序執(zhí)行在用戶態(tài)(User Mode)。當(dāng)發(fā)生系統(tǒng)調(diào)用時(shí),用戶態(tài)的程序發(fā)起系統(tǒng)調(diào)用。因?yàn)橄到y(tǒng)調(diào)用中牽扯特權(quán)指令,用戶態(tài)程序權(quán)限不足,因此會(huì)中斷執(zhí)行,也就是 Trap(Trap 是一種中斷)。

發(fā)生中斷后,當(dāng)前 CPU 執(zhí)行的程序會(huì)中斷,跳轉(zhuǎn)到中斷處理程序。內(nèi)核程序開始執(zhí)行,也就是開始處理系統(tǒng)調(diào)用。內(nèi)核處理完成后,主動(dòng)觸發(fā) Trap,這樣會(huì)再次發(fā)生中斷,切換回用戶態(tài)工作。

四.線程模型

上面我們學(xué)習(xí)了用戶態(tài)和內(nèi)核態(tài),接下來我們從進(jìn)程和線程的角度進(jìn)一步思考本課時(shí)開頭拋出的問題。

1.進(jìn)程和線程

一個(gè)應(yīng)用程序啟動(dòng)后會(huì)在內(nèi)存中創(chuàng)建一個(gè)執(zhí)行副本,這就是進(jìn)程。Linux 的內(nèi)核是一個(gè) MonolithicKernel(宏內(nèi)核),因此可以看作一個(gè)進(jìn)程。也就是開機(jī)的時(shí)候,磁盤的內(nèi)核鏡像被導(dǎo)入內(nèi)存作為一個(gè)執(zhí)行副本,成為內(nèi)核進(jìn)程

進(jìn)程可以分成用戶態(tài)進(jìn)程和內(nèi)核態(tài)進(jìn)程兩類。用戶態(tài)進(jìn)程通常是應(yīng)用程序的副本,內(nèi)核態(tài)進(jìn)程就是內(nèi)核本身的進(jìn)程。如果用戶態(tài)進(jìn)程需要申請(qǐng)資源,比如內(nèi)存,可以通過系統(tǒng)調(diào)用向內(nèi)核申請(qǐng)。 那么用戶態(tài)進(jìn)程如果要執(zhí)行程序,是否也要向內(nèi)核申請(qǐng)呢? 程序在現(xiàn)代操作系統(tǒng)中并不是以進(jìn)程為單位在執(zhí)行,而是以一種輕量級(jí)進(jìn)程(Light WeightedProcess),也稱作線程(Thread)的形式執(zhí)行。一個(gè)進(jìn)程可以擁有多個(gè)線程。進(jìn)程創(chuàng)建的時(shí)候,一般會(huì)有一個(gè)主線程隨著進(jìn)程創(chuàng)建而創(chuàng)建

如果進(jìn)程想要?jiǎng)?chuàng)造更多的線程,就需要思考一件事情,這個(gè)線程創(chuàng)建在用戶態(tài)還是內(nèi)核態(tài)。你可能會(huì)問,難道不是用戶態(tài)的進(jìn)程創(chuàng)建用戶態(tài)的線程,內(nèi)核態(tài)的進(jìn)程創(chuàng)建內(nèi)核態(tài)的線程嗎?其實(shí)不是,進(jìn)程可以通過 API 創(chuàng)建用戶態(tài)的線程,也可以通過系統(tǒng)調(diào)用創(chuàng)建內(nèi)核態(tài)的線程,接下來我們說說用戶態(tài)的線程和內(nèi)核態(tài)的線程。

2.用戶態(tài)線程

用戶態(tài)線程也稱作用戶級(jí)線程(User Level Thread)。操作系統(tǒng)內(nèi)核并不知道它的存在,它完全是在用戶空間中創(chuàng)建。 用戶級(jí)線程有很多優(yōu)勢(shì),比如。

  • 管理開銷小:創(chuàng)建、銷毀不需要系統(tǒng)調(diào)用。
  • 切換成本低:用戶空間程序可以自己維護(hù),不需要走操作系統(tǒng)調(diào)度。

但是這種線程也有很多的缺點(diǎn)

  • 與內(nèi)核協(xié)作成本高:比如這種線程完全是用戶空間程序在管理,當(dāng)它進(jìn)行 I/O 的時(shí)候,無法利用到內(nèi)核的優(yōu)勢(shì),需要頻繁進(jìn)行用戶態(tài)到內(nèi)核態(tài)的切換。
  • 線程間協(xié)作成本高:設(shè)想兩個(gè)線程需要通信,通信需要 I/O,I/O 需要系統(tǒng)調(diào)用,因此用戶態(tài)線程需要支付額外的系統(tǒng)調(diào)用成本。
  • 無法利用多核優(yōu)勢(shì):比如操作系統(tǒng)調(diào)度的仍然是這個(gè)線程所屬的進(jìn)程,所以無論每次一個(gè)進(jìn)程有多少用戶態(tài)的線程,都只能并發(fā)執(zhí)行一個(gè)線程,因此一個(gè)進(jìn)程的多個(gè)線程無法利用多核的優(yōu)勢(shì)。
  • 操作系統(tǒng)無法針對(duì)線程調(diào)度進(jìn)行優(yōu)化:當(dāng)一個(gè)進(jìn)程的一個(gè)用戶態(tài)線程阻塞(Block)了,操作系統(tǒng)無法及時(shí)發(fā)現(xiàn)和處理阻塞問題,它不會(huì)更換執(zhí)行其他線程,從而造成資源浪費(fèi)。

3.內(nèi)核態(tài)線程

內(nèi)核態(tài)線程也稱作內(nèi)核級(jí)線程(Kernel Level Thread)。這種線程執(zhí)行在內(nèi)核態(tài),可以通過系統(tǒng)調(diào)用創(chuàng)造一個(gè)內(nèi)核級(jí)線程。 內(nèi)核級(jí)線程有很多優(yōu)勢(shì)。

  • 可以利用多核 CPU 優(yōu)勢(shì):內(nèi)核擁有較高權(quán)限,因此可以在多個(gè) CPU 核心上執(zhí)行內(nèi)核線程。
  • 操作系統(tǒng)級(jí)優(yōu)化:內(nèi)核中的線程操作 I/O 不需要進(jìn)行系統(tǒng)調(diào)用;一個(gè)內(nèi)核線程阻塞了,可以立即讓另一個(gè)執(zhí)行。

當(dāng)然內(nèi)核線程也有一些缺點(diǎn)。

  • 創(chuàng)建成本高:創(chuàng)建的時(shí)候需要系統(tǒng)調(diào)用,也就是切換到內(nèi)核態(tài)。
  • 擴(kuò)展性差:由一個(gè)內(nèi)核程序管理,不可能數(shù)量太多。
  • 切換成本較高:切換的時(shí)候,也同樣存在需要內(nèi)核操作,需要切換內(nèi)核態(tài)。

五.用戶態(tài)線程和內(nèi)核態(tài)線程之間的映射關(guān)系

線程簡(jiǎn)單理解,就是要執(zhí)行一段程序。程序不會(huì)自發(fā)的執(zhí)行,需要操作系統(tǒng)進(jìn)行調(diào)度。我們思考這樣一個(gè)問題,如果有一個(gè)用戶態(tài)的進(jìn)程,它下面有多個(gè)線程。如果這個(gè)進(jìn)程想要執(zhí)行下面的某一個(gè)線程,應(yīng)該如何做呢?

這時(shí),比較常見的一種方式,就是將需要執(zhí)行的程序,讓一個(gè)內(nèi)核線程去執(zhí)行。畢竟,內(nèi)核線程是真正的線程。因?yàn)樗鼤?huì)分配到 CPU 的執(zhí)行資源。

如果一個(gè)進(jìn)程所有的線程都要自己調(diào)度,相當(dāng)于在進(jìn)程的主線程中實(shí)現(xiàn)分時(shí)算法調(diào)度每一個(gè)線程,也就是所有線程都用操作系統(tǒng)分配給主線程的時(shí)間片段執(zhí)行。這種做法,相當(dāng)于操作系統(tǒng)調(diào)度進(jìn)程的主線程;進(jìn)程的主線程進(jìn)行二級(jí)調(diào)度,調(diào)度自己內(nèi)部的線程。 這樣操作劣勢(shì)非常明顯,比如無法利用多核優(yōu)勢(shì),每個(gè)線程調(diào)度分配到的時(shí)間較少,而且這種線程在阻塞場(chǎng)景下會(huì)直接交出整個(gè)進(jìn)程的執(zhí)行權(quán)限。 由此可見,用戶態(tài)線程創(chuàng)建成本低,問題明顯,不可以利用多核。內(nèi)核態(tài)線程,創(chuàng)建成本高,可以利用多核,切換速度慢。因此通常我們會(huì)在內(nèi)核中預(yù)先創(chuàng)建一些線程,并反復(fù)利用這些線程。這樣,用戶態(tài)線程和內(nèi)核態(tài)線程之間就構(gòu)成了下面 4 種可能的關(guān)系:

1.多對(duì)一(Many to One)

用戶態(tài)進(jìn)程中的多線程復(fù)用一個(gè)內(nèi)核態(tài)線程。這樣,極大地減少了創(chuàng)建內(nèi)核態(tài)線程的成本,但是線程不可以并發(fā)。因此,這種模型現(xiàn)在基本上用的很少。我再多說一句,這里你可能會(huì)有疑問,比如:用戶態(tài)線程怎么用內(nèi)核態(tài)線程執(zhí)行程序? 程序是存儲(chǔ)在內(nèi)存中的指令,用戶態(tài)線程是可以準(zhǔn)備好程序讓內(nèi)核態(tài)線程執(zhí)行的。后面的幾種方式也是利用這樣的方法。

2.一對(duì)一(One to One)

該模型為每個(gè)用戶態(tài)的線程分配一個(gè)單獨(dú)的內(nèi)核態(tài)線程,在這種情況下,每個(gè)用戶態(tài)都需要通過系統(tǒng)調(diào)用創(chuàng)建一個(gè)綁定的內(nèi)核線程,并附加在上面執(zhí)行。 這種模型允許所有線程并發(fā)執(zhí)行,能夠充分利用多核優(yōu)勢(shì),Windows NT 內(nèi)核采取的就是這種模型。但是因?yàn)榫€程較多,對(duì)內(nèi)核調(diào)度的壓力會(huì)明顯增加。

3.多對(duì)多(Many to Many)

這種模式下會(huì)為 n 個(gè)用戶態(tài)線程分配 m 個(gè)內(nèi)核態(tài)線程。m 通??梢孕∮?n。一種可行的策略是將 m 設(shè)置為核數(shù)。這種多對(duì)多的關(guān)系,減少了內(nèi)核線程,同時(shí)也保證了多核心并發(fā)。Linux 目前采用的就是該模型。

4.兩層設(shè)計(jì)(Two Level)

這種模型混合了多對(duì)多和一對(duì)一的特點(diǎn)。多數(shù)用戶態(tài)線程和內(nèi)核線程是 n 對(duì) m 的關(guān)系,少量用戶線程可以指定成 1 對(duì) 1 的關(guān)系。

上圖所展現(xiàn)的是一個(gè)非常經(jīng)典的設(shè)計(jì)。

六.總結(jié)

我們這節(jié)課講解的問題、考慮到的情況以及解決方法,將為你今后解決實(shí)際工作場(chǎng)景中的問題打下堅(jiān)實(shí)的基礎(chǔ)。比如處理并發(fā)問題、I/O 性能瓶頸、思考數(shù)據(jù)庫(kù)連接池的配置等,要想完美地解決問題,就必須掌握這些模型,了解問題的本質(zhì)上才能更好地思考問題衍生出來的問題。

這節(jié)課我們學(xué)習(xí)了用戶態(tài)和內(nèi)核態(tài),然后我們簡(jiǎn)單學(xué)習(xí)了進(jìn)程和線程的基礎(chǔ)知識(shí)。 最后,我們還討論了用戶線程和內(nèi)核線程的映射關(guān)系,這是一種非常經(jīng)典的設(shè)計(jì)和思考方式。關(guān)于這個(gè)場(chǎng)景我們討論了 1 對(duì) 1、1 對(duì)多以及多對(duì) 1,兩層模型 4 種方法。日后你在處理線程池對(duì)接;遠(yuǎn)程 RPC調(diào)用;消息隊(duì)列時(shí),還會(huì)反復(fù)用到今天的方法。 那么通過這節(jié)課的學(xué)習(xí),你現(xiàn)在是否可以來回答本節(jié)關(guān)聯(lián)的面試題目?用戶態(tài)線程和內(nèi)核態(tài)線程的區(qū)別?老規(guī)矩,請(qǐng)你先在腦海里構(gòu)思下給面試官的表述,并把你的思考寫在留言區(qū),然后再來看我接下來的分析。 【解析】 用戶態(tài)線程工作在用戶空間,內(nèi)核態(tài)線程工作在內(nèi)核空間。用戶態(tài)線程調(diào)度完全由進(jìn)程負(fù)責(zé),通常就是由進(jìn)程的主線程負(fù)責(zé)。相當(dāng)于進(jìn)程主線程的延展,使用的是操作系統(tǒng)分配給進(jìn)程主線程的時(shí)間片段。內(nèi)核線程由內(nèi)核維護(hù),由操作系統(tǒng)調(diào)度。 用戶態(tài)線程無法跨核心,一個(gè)進(jìn)程的多個(gè)用戶態(tài)線程不能并發(fā),阻塞一個(gè)用戶態(tài)線程會(huì)導(dǎo)致進(jìn)程的主線程阻塞,直接交出執(zhí)行權(quán)限。這些都是用戶態(tài)線程的劣勢(shì)。內(nèi)核線程可以獨(dú)立執(zhí)行,操作系統(tǒng)會(huì)分配時(shí)間片段。因此內(nèi)核態(tài)線程更完整,也稱作輕量級(jí)進(jìn)程。內(nèi)核態(tài)線程創(chuàng)建成本高,切換成本高,創(chuàng)建太多還會(huì)給調(diào)度算法增加壓力,因此不會(huì)太多。 實(shí)際操作中,往往結(jié)合兩者優(yōu)勢(shì),將用戶態(tài)線程附著在內(nèi)核態(tài)線程中執(zhí)行。

七.思考題

最后我再給你出一道需要查資料的思考題:JVM 的線程是用戶態(tài)線程還是內(nèi)核態(tài)線程?

到此這篇關(guān)于用戶態(tài)和內(nèi)核態(tài)-用戶線程和內(nèi)核態(tài)線程的區(qū)別的文章就介紹到這了,更多相關(guān)用戶線程和內(nèi)核態(tài)線程區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Windows 10系統(tǒng)安裝虛擬專用網(wǎng)客戶端工具(圖文教程)

    Windows 10系統(tǒng)安裝虛擬專用網(wǎng)客戶端工具(圖文教程)

    本文通過圖文并茂的形式給大家介紹了Windows 10系統(tǒng)安裝虛擬專用網(wǎng)客戶端工具,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2019-11-11
  • windows 系統(tǒng)防火墻 添加端口號(hào)方法

    windows 系統(tǒng)防火墻 添加端口號(hào)方法

    這篇文章主要介紹了windows 系統(tǒng)防火墻 添加端口號(hào)方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 鴻蒙OS運(yùn)行第一個(gè)“hello world”

    鴻蒙OS運(yùn)行第一個(gè)“hello world”

    這篇文章主要介紹了鴻蒙OS運(yùn)行第一個(gè)“hello world”,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 華為鴻蒙DevEco studio2.0的安裝和hello world運(yùn)行教程

    華為鴻蒙DevEco studio2.0的安裝和hello world運(yùn)行教程

    這篇文章主要介紹了關(guān)于華為鴻蒙DevEco studio2.0的安裝和運(yùn)行第一個(gè)hello world的文章教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • man -f/-k [keyword]在fedora 29 中報(bào)錯(cuò)nothing appropriate

    man -f/-k [keyword]在fedora 29 中報(bào)錯(cuò)nothing appropriate

    這篇文章主要介紹了man -f/-k [keyword]在fedora 29 中報(bào)錯(cuò)nothing appropriate ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • windows下使用Xshell時(shí)出現(xiàn)丟失msvcr110.dll等dll問題

    windows下使用Xshell時(shí)出現(xiàn)丟失msvcr110.dll等dll問題

    這篇文章主要介紹了windows下使用Xshell時(shí)出現(xiàn)丟失msvcr110.dll等dll問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • windows通過秘鑰使用ssh和scp的方法

    windows通過秘鑰使用ssh和scp的方法

    這篇文章主要介紹了windows通過秘鑰使用ssh和scp的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • windows環(huán)境下修改pip鏡像源的方法詳解

    windows環(huán)境下修改pip鏡像源的方法詳解

    這篇文章主要介紹了windows環(huán)境下修改pip鏡像源的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Win10專業(yè)版激活方法步驟詳解

    Win10專業(yè)版激活方法步驟詳解

    這篇文章主要介紹了Win10專業(yè)版激活方法步驟詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 鴻蒙OS如何開發(fā)一個(gè)前端應(yīng)用詳解

    鴻蒙OS如何開發(fā)一個(gè)前端應(yīng)用詳解

    以前一個(gè)前端開發(fā)人員,能開發(fā)網(wǎng)頁(yè)、能開發(fā)安卓系統(tǒng)和 IOS 系統(tǒng),就可以說是一個(gè)合格的前端程序員了,但是鴻蒙的出現(xiàn),也逼著你需要再掌握一門新系統(tǒng)的開發(fā),這篇文章主要給大家介紹了關(guān)于鴻蒙OS如何開發(fā)一個(gè)前端應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評(píng)論