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

Java線程中的用戶態(tài)和內(nèi)核態(tài)解讀

 更新時(shí)間:2023年06月12日 14:35:21   作者:梨瓜  
這篇文章主要介紹了Java線程中的用戶態(tài)和內(nèi)核態(tài)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java線程中用戶態(tài)和內(nèi)核態(tài)

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

操作系統(tǒng)對(duì)程序的執(zhí)行權(quán)限進(jìn)行分級(jí),分別為用戶態(tài)和內(nèi)核態(tài)。用戶態(tài)相比內(nèi)核態(tài)有較低的執(zhí)行權(quán)限,很多操作是不被操作系統(tǒng)允許的,簡(jiǎn)單來(lái)說(shuō)就是用戶態(tài)只能訪問(wèn)內(nèi)存,防止程序錯(cuò)誤影響到其他程序,而內(nèi)核態(tài)則是可以操作系統(tǒng)的程序和普通用戶程序

內(nèi)核態(tài): cpu可以訪問(wèn)計(jì)算機(jī)所有的軟硬件資源

用戶態(tài): cpu權(quán)限受限,只能訪問(wèn)到自己內(nèi)存中的數(shù)據(jù),無(wú)法訪問(wèn)其他資源

為什么要有用戶態(tài)和內(nèi)核態(tài)?

系統(tǒng)需要限制不同的程序之間的訪問(wèn)能力,防止程序獲取不相同程序的內(nèi)存數(shù)據(jù),或者外圍設(shè)備的數(shù)據(jù),并發(fā)送到網(wǎng)絡(luò),所有cpu劃分出兩個(gè)權(quán)限等級(jí)用戶態(tài)和內(nèi)核態(tài)

用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換

用戶應(yīng)用程序在用戶態(tài)下,但是如果需要執(zhí)行一些操作例如申請(qǐng)內(nèi)存,網(wǎng)絡(luò)讀寫(xiě)時(shí),自己的權(quán)限不夠,就需要轉(zhuǎn)換到內(nèi)核態(tài)去讓內(nèi)核去幫忙干一些事情,下面三個(gè)方式會(huì)進(jìn)行轉(zhuǎn)換

1.系統(tǒng)調(diào)用

這是用戶態(tài)主動(dòng)要求切換到內(nèi)核態(tài)的一種方式,用戶進(jìn)程通過(guò)系統(tǒng)調(diào)用申請(qǐng)使用操作系統(tǒng)提供的服務(wù)程序完成工作,比如前列中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用的機(jī)制其核心還是使用了操作系統(tǒng)為用戶特別開(kāi)發(fā)的一個(gè)中斷來(lái)實(shí)現(xiàn),列表liunx的int 80h中斷

2.異常

當(dāng)cpu在運(yùn)行在用戶態(tài)下的程序時(shí),發(fā)生了些某些事先不可知的異常,這時(shí)會(huì)觸發(fā)由當(dāng)前運(yùn)行進(jìn)程切換此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài)

3.外圍設(shè)備的中斷

當(dāng)外圍設(shè)備完成用戶請(qǐng)求的操作后,會(huì)向CPU發(fā)出相應(yīng)的中斷信息,這時(shí)CPU會(huì)暫停執(zhí)行下一條即將執(zhí)行的指令而去執(zhí)行與中斷信號(hào)對(duì)應(yīng)的處理程序,如果先前執(zhí)行的指令時(shí)用戶態(tài)下的程序,那么這個(gè)轉(zhuǎn)換的過(guò)程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換,比如硬盤(pán)讀寫(xiě)操作完成,系統(tǒng)會(huì)切換到硬盤(pán)讀寫(xiě)的中斷處理程序中執(zhí)行后續(xù)操作等

Java線程是用戶態(tài)還是內(nèi)核態(tài)

Java線程在jdk1.2之前,是基于稱為"綠色線程"的用戶線程實(shí)現(xiàn),但從JDK1.3起,主流平臺(tái)上的"主流"商用Java虛擬機(jī)的線程模型普遍都被替換為基于操作系統(tǒng)原生原生線程模型來(lái)實(shí)現(xiàn),即采用1:1的線程模型

操作系統(tǒng)支持怎么樣的線程模型,在很大程度想回影響上面的Java虛擬機(jī)的線程是怎么映射的,這一點(diǎn)在不同的平臺(tái)上很難達(dá)成一致,因此《Java虛擬機(jī)規(guī)范》中才不去限定Java線程需要使用哪種線程模型來(lái)實(shí)現(xiàn)。

1.證明java線程不是純粹用戶級(jí)線程:java中有個(gè)fork join框架,這個(gè)框架是利用多處理技術(shù)進(jìn)行maprudce的工作,也就證明了內(nèi)核是可以感知到用戶線程的存在,因此才會(huì)將多個(gè)線程調(diào)度到多個(gè)處理器中。還有,java應(yīng)用程序中的某個(gè)線程阻塞,是不會(huì)引起整個(gè)進(jìn)程的阻塞,從這兩點(diǎn)看,java線程絕不是純粹的用戶級(jí)線程。

2.再來(lái)證明java線程不是純粹內(nèi)核級(jí)線程:如果使用純粹的內(nèi)核級(jí)線程,那么有關(guān)線程的所有管理工作都是內(nèi)核完成的,用戶程序中沒(méi)有管理線程的代碼。顯然,java線程庫(kù)提供了大量的線程管理機(jī)制,因此java線程絕不是純粹的內(nèi)核級(jí)線程。 綜上,java線程是混合型的線程模型,一般而言是通過(guò)lwp將用戶級(jí)線程映射到內(nèi)核線程中

Java線程用戶態(tài)內(nèi)核態(tài)切換

cpu采用時(shí)間輪片機(jī)制給每個(gè)線程分發(fā)執(zhí)行時(shí)間片來(lái)讓線程執(zhí)行如果線程在進(jìn)行上下文切換,堵塞,時(shí)間片用完,睡眠,\等情況,就會(huì)發(fā)生用戶態(tài)和內(nèi)核態(tài)的切換

線程切換的調(diào)度器存放于內(nèi)核中,中斷處理也在內(nèi)核。,從這個(gè)角度來(lái)說(shuō),如果線程當(dāng)前處于用戶態(tài),若要發(fā)生線程切換,必然是要先進(jìn)入內(nèi)核態(tài),發(fā)生狀態(tài)切換的。線程切換的原因還可能是其他類型的中斷,或者線程自身主動(dòng)進(jìn)入等待和睡眠.這些情況無(wú)一例外會(huì)進(jìn)入內(nèi)核。

但是線程當(dāng)前就處于內(nèi)核態(tài),也可能一樣中斷,或者主動(dòng)進(jìn)入等待或者睡眠,這也是一樣會(huì)發(fā)送的,但就是沒(méi)有了用戶態(tài)和內(nèi)核態(tài)的狀態(tài)切換了

總而言之線程切換和狀態(tài)切換沒(méi)有直接的關(guān)聯(lián),,只不過(guò)線程切換一般都放到內(nèi)核實(shí)現(xiàn)而已,當(dāng)然也還有所謂的用戶級(jí)線程,也就是在用戶態(tài)直接切換線程的棧和寄存器而已,這也無(wú)需切換到內(nèi)核態(tài)

用戶態(tài)和內(nèi)核態(tài)切換性能問(wèn)題

當(dāng)發(fā)生用戶態(tài)到內(nèi)核態(tài)的切換時(shí),會(huì)發(fā)生如下過(guò)程:

  • 設(shè)置處理器至內(nèi)核態(tài)。
  • 保存當(dāng)前寄存器(棧指針、程序計(jì)數(shù)器、通用寄存器)。
  • 將棧指針設(shè)置指向內(nèi)核棧地址。
  • 將程序計(jì)數(shù)器設(shè)置為一個(gè)事先約定的地址上,該地址上存放的是系統(tǒng)調(diào)用處理程序的起始地址。
  • 而之后從內(nèi)核態(tài)返回用戶態(tài)時(shí),又會(huì)進(jìn)行類似的工作。

用戶態(tài)和內(nèi)核態(tài)之間的切換有一定的開(kāi)銷,如果頻繁發(fā)生切換勢(shì)必會(huì)帶來(lái)很大的開(kāi)銷,所以要想盡一切辦法來(lái)減少切換

避免頻繁切換

因?yàn)榫€程的切換會(huì)導(dǎo)致用戶態(tài)和內(nèi)核態(tài)之間的切換,所以減少線程切換也會(huì)減少用戶態(tài)和內(nèi)核態(tài)之間的切換。那么如何減少線程切換呢?

  • 無(wú)鎖并發(fā)編程。多線程競(jìng)爭(zhēng)鎖時(shí),加鎖、釋放鎖會(huì)導(dǎo)致比較多的上下文切換
  • CAS算法。使用CAS避免加鎖,避免阻塞線程
  • 使用最少的線程。避免創(chuàng)建不需要的線程協(xié)程。在單線程里實(shí)現(xiàn)多任務(wù)的調(diào)度,并在單線程里維持多個(gè)任務(wù)間的切換

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

操作系統(tǒng)需要兩種CPU狀態(tài)

  • 內(nèi)核態(tài)(Kernel Mode):運(yùn)行操作系統(tǒng)程序,操作硬件
  • 用戶態(tài)(User Mode):運(yùn)行用戶程序

指令劃分

  • 特權(quán)指令:只能由操作系統(tǒng)使用、用戶程序不能使用的指令。 舉例:?jiǎn)?dòng)I/O 內(nèi)存清零 修改程序狀態(tài)字 設(shè)置時(shí)鐘 允許/禁止終端 停機(jī)
  • 非特權(quán)指令:用戶程序可以使用的指令。 舉例:控制轉(zhuǎn)移 算數(shù)運(yùn)算 取數(shù)指令 訪管指令(使用戶程序從用戶態(tài)陷入內(nèi)核態(tài))

特權(quán)級(jí)別

  • 特權(quán)環(huán):R0、R1、R2和R3
  • R0相當(dāng)于內(nèi)核態(tài),R3相當(dāng)于用戶態(tài);
  • 不同級(jí)別能夠運(yùn)行不同的指令集合;

CPU狀態(tài)之間的轉(zhuǎn)換

  • 用戶態(tài)--->內(nèi)核態(tài):唯一途徑是通過(guò)中斷、異常、陷入機(jī)制(訪管指令)
  • 內(nèi)核態(tài)--->用戶態(tài):設(shè)置程序狀態(tài)字PSW

內(nèi)核態(tài)與用戶態(tài)的區(qū)別

內(nèi)核態(tài)與用戶態(tài)是操作系統(tǒng)的兩種運(yùn)行級(jí)別,當(dāng)程序運(yùn)行在3級(jí)特權(quán)級(jí)上時(shí),就可以稱之為運(yùn)行在用戶態(tài)。因?yàn)檫@是最低特權(quán)級(jí),是普通的用戶進(jìn)程運(yùn)行的特權(quán)級(jí),大部分用戶直接面對(duì)的程序都是運(yùn)行在用戶態(tài);

當(dāng)程序運(yùn)行在0級(jí)特權(quán)級(jí)上時(shí),就可以稱之為運(yùn)行在內(nèi)核態(tài)。

運(yùn)行在用戶態(tài)下的程序不能直接訪問(wèn)操作系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)和程序。當(dāng)我們?cè)谙到y(tǒng)中執(zhí)行一個(gè)程序時(shí),大部分時(shí)間是運(yùn)行在用戶態(tài)下的,在其需要操作系統(tǒng)幫助完成某些它沒(méi)有權(quán)力和能力完成的工作時(shí)就會(huì)切換到內(nèi)核態(tài)(比如操作硬件)。

這兩種狀態(tài)的主要差別是:

  • 處于用戶態(tài)執(zhí)行時(shí),進(jìn)程所能訪問(wèn)的內(nèi)存空間和對(duì)象受到限制,其所處于占有的處理器是可被搶占的
  • 處于內(nèi)核態(tài)執(zhí)行時(shí),則能訪問(wèn)所有的內(nèi)存空間和對(duì)象,且所占有的處理器是不允許被搶占的。

通常來(lái)說(shuō),以下三種情況會(huì)導(dǎo)致用戶態(tài)到內(nèi)核態(tài)的切換

1、系統(tǒng)調(diào)用

這是用戶態(tài)進(jìn)程主動(dòng)要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進(jìn)程通過(guò)系統(tǒng)調(diào)用申請(qǐng)使用操作系統(tǒng)提供的服務(wù)程序完成工作。比如前例中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。

而系統(tǒng)調(diào)用的機(jī)制其核心還是使用了操作系統(tǒng)為用戶特別開(kāi)放的一個(gè)中斷來(lái)實(shí)現(xiàn),例如Linux的int 80h中斷。

用戶程序通常調(diào)用庫(kù)函數(shù),由庫(kù)函數(shù)再調(diào)用系統(tǒng)調(diào)用,因此有的庫(kù)函數(shù)會(huì)使用戶程序進(jìn)入內(nèi)核態(tài)(只要庫(kù)函數(shù)中某處調(diào)用了系統(tǒng)調(diào)用),有的則不會(huì)。

2、異常

當(dāng)CPU在執(zhí)行運(yùn)行在用戶態(tài)下的程序時(shí),發(fā)生了某些事先不可知的異常,這時(shí)會(huì)觸發(fā)由當(dāng)前運(yùn)行進(jìn)程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁(yè)異常。

3、外圍設(shè)備的中斷

當(dāng)外圍設(shè)備完成用戶請(qǐng)求的操作后,會(huì)向CPU發(fā)出相應(yīng)的中斷信號(hào),這時(shí)CPU會(huì)暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號(hào)對(duì)應(yīng)的處理程序,

如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個(gè)轉(zhuǎn)換的過(guò)程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤(pán)讀寫(xiě)操作完成,系統(tǒng)會(huì)切換到硬盤(pán)讀寫(xiě)的中斷處理程序中執(zhí)行后續(xù)操作等。

這3種方式是系統(tǒng)在運(yùn)行時(shí)由用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的最主要方式,其中系統(tǒng)調(diào)用可以認(rèn)為是用戶進(jìn)程主動(dòng)發(fā)起的,異常和外圍設(shè)備中斷則是被動(dòng)的。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot和Redis實(shí)現(xiàn)Token權(quán)限認(rèn)證的實(shí)例講解

    SpringBoot和Redis實(shí)現(xiàn)Token權(quán)限認(rèn)證的實(shí)例講解

    這篇文章主要介紹了SpringBoot和Redis實(shí)現(xiàn)Token權(quán)限認(rèn)證的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java發(fā)送郵件及打開(kāi)狀態(tài)判斷分析實(shí)例

    java發(fā)送郵件及打開(kāi)狀態(tài)判斷分析實(shí)例

    這篇文章主要為大家介紹了java發(fā)送郵件及打開(kāi)狀態(tài)判斷分析實(shí)例
    2023-12-12
  • Java實(shí)現(xiàn)系統(tǒng)限流的示例代碼

    Java實(shí)現(xiàn)系統(tǒng)限流的示例代碼

    限流是保障系統(tǒng)高可用的方式之一,也是大廠高頻面試題,它在微服務(wù)系統(tǒng)中,緩存、限流、熔斷是保證系統(tǒng)高可用的三板斧,所以本文我們就來(lái)聊聊如何實(shí)現(xiàn)系統(tǒng)限流吧
    2023-09-09
  • Java實(shí)戰(zhàn)個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程

    Java實(shí)戰(zhàn)個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+mybatis+redis+vue+elementui+Mysql實(shí)現(xiàn)一個(gè)個(gè)人博客系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • MapReduce2框架的原理解析

    MapReduce2框架的原理解析

    這篇文章主要圍繞MapReduce2框架原理介紹的,文中有詳細(xì)的代碼示例,對(duì)學(xué)習(xí)有一定的幫助,需要的朋友可以借鑒參考
    2023-04-04
  • Java開(kāi)發(fā)崗位面試被問(wèn)到反射怎么辦

    Java開(kāi)發(fā)崗位面試被問(wèn)到反射怎么辦

    這篇文章主要介紹了java 面向?qū)ο竺嬖嚰\的相關(guān)資料,這里整理了面向?qū)ο蟮幕A(chǔ)知識(shí),幫助大家學(xué)習(xí)理解此部分的知識(shí),需要的朋友可以參考下
    2021-07-07
  • 利用JavaFX工具構(gòu)建Reactive系統(tǒng)

    利用JavaFX工具構(gòu)建Reactive系統(tǒng)

    這篇文章主要介紹了使用JavaFX構(gòu)建Reactive系統(tǒng),利用JavaFX工具集中的新的超棒特性來(lái)構(gòu)建響應(yīng)式的快速應(yīng)用程序,感興趣的小伙伴們可以參考一下
    2016-02-02
  • springboot集成redis哨兵集群的實(shí)現(xiàn)示例

    springboot集成redis哨兵集群的實(shí)現(xiàn)示例

    本文主要介紹了springboot集成redis哨兵集群的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java使用JSONObject需要的6個(gè)jar包下載地址

    Java使用JSONObject需要的6個(gè)jar包下載地址

    這篇文章主要介紹了Java使用JSONObject需要的6個(gè)jar包下載地址,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringSecurity中內(nèi)置過(guò)濾器的使用小結(jié)

    SpringSecurity中內(nèi)置過(guò)濾器的使用小結(jié)

    SpringSecurity通過(guò)其復(fù)雜的過(guò)濾器鏈機(jī)制,為Java應(yīng)用提供了全面的安全防護(hù),本文主要介紹了SpringSecurity中內(nèi)置過(guò)濾器的使用小結(jié),感性的可以了解一下
    2025-03-03

最新評(píng)論