線程-用戶態(tài)(也有叫協(xié)程的)和內核態(tài)的區(qū)別

1.用戶態(tài)和內核態(tài)的概念物咳?

內核態(tài): CPU可以訪問內存所有數(shù)據(jù), 包括外圍設備, 例如硬盤, 網(wǎng)卡. CPU也可以將自己從一個程序切換到另一個程序

用戶態(tài): 只能受限的訪問內存, 且不允許訪問外圍設備. 占用CPU的能力被剝奪, CPU資源可以被其他程序獲取

2.為什么需要用戶態(tài)和內核態(tài)茂缚?

由于需要限制不同的程序之間的訪問能力, 防止他們獲取別的程序的內存數(shù)據(jù), 或者獲取外圍設備的數(shù)據(jù), 并發(fā)送到網(wǎng)絡, CPU劃分出兩個權限等級 :用戶態(tài) 和 內核態(tài)

3.用戶態(tài)與內核態(tài)的切換?

所有用戶程序都是運行在用戶態(tài)的, 但是有時候程序確實需要做一些內核態(tài)的事情, 例如從硬盤讀取數(shù)據(jù), 或者從鍵盤獲取輸入等. 而唯一可以做這些事情的就是操作系統(tǒng), 所以此時程序就需要先操作系統(tǒng)請求以程序的名義來執(zhí)行這些操作.

這時需要一個這樣的機制: 用戶態(tài)程序切換到內核態(tài), 但是不能控制在內核態(tài)中執(zhí)行的指令

這種機制叫系統(tǒng)調用, 在CPU中的實現(xiàn)稱之為陷阱指令(Trap Instruction)

他們的工作流程如下:

用戶態(tài)程序將一些數(shù)據(jù)值放在寄存器中, 或者使用參數(shù)創(chuàng)建一個堆棧(stack frame), 以此表明需要操作系統(tǒng)提供的服務.用戶態(tài)程序執(zhí)行陷阱指令
CPU切換到內核態(tài), 并跳到位于內存指定位置的指令, 這些指令是操作系統(tǒng)的一部分, 他們具有內存保護, 不可被用戶態(tài)程序訪問這些指令稱之為陷阱(trap)或者系統(tǒng)調用處理器(system call handler). 他們會讀取程序放入內存的數(shù)據(jù)參數(shù), 并執(zhí)行程序請求的服務系統(tǒng)調用完成后, 操作系統(tǒng)會重置CPU為用戶態(tài)并返回系統(tǒng)調用的結果

4.用戶態(tài)和內核態(tài)的詳細介紹?

當一個任務(進程)執(zhí)行系統(tǒng)調用而陷入內核代碼中執(zhí)行時,我們就稱進程處于內核運行態(tài)(或簡稱為內核態(tài))况既。此時處理器處于特權級最高的(0級)內核 代碼中執(zhí)行。當進程處于內核態(tài)時,執(zhí)行的內核代碼會使用當前進程的內核棧普办。每個進程都有自己的內核棧。當進程在執(zhí)行用戶自己的代碼時徘钥,則稱其處于用戶運行 態(tài)(用戶態(tài))衔蹲。即此時處理器在特權級最低的(3級)用戶代碼中運行。當正在執(zhí)行用戶程序而突然被中斷程序中斷時呈础,此時用戶程序也可以象征性地稱為處于進程 的內核態(tài)舆驶。因為中斷處理程序將使用當前進程的內核棧。這與處于內核態(tài)的進程的狀態(tài)有些類似而钞。

內核態(tài)與用戶態(tài)是操作系統(tǒng)的兩種運行級別, 跟intel cpu沒有必然的聯(lián)系, intel cpu提供Ring0-Ring3三種級別的運行模式沙廉,Ring0級別最高,Ring3最低臼节。Linux使用了Ring3級別運行用戶態(tài)撬陵,Ring0作為 內核態(tài),沒有使用Ring1和Ring2网缝。Ring3狀態(tài)不能訪問Ring0的地址空間巨税,包括代碼和數(shù)據(jù)。Linux進程的4GB地址空間粉臊,3G-4G部 分大家是共享的草添,是內核態(tài)的地址空間,這里存放在整個內核的代碼和所有的內核模塊扼仲,以及內核所維護的數(shù)據(jù)远寸。用戶運行一個程序促王,該程序所創(chuàng)建的進程開始是運 行在用戶態(tài)的,如果要執(zhí)行文件操作而晒,網(wǎng)絡數(shù)據(jù)發(fā)送等操作蝇狼,必須通過write,send等系統(tǒng)調用倡怎,這些系統(tǒng)調用會調用內核中的代碼來完成操作迅耘,這時,必 須切換到Ring0监署,然后進入3GB-4GB中的內核地址空間去執(zhí)行這些代碼完成操作颤专,完成后,切換回Ring3钠乏,回到用戶態(tài)栖秕。這樣,用戶態(tài)的程序就不能 隨意操作內核地址空間晓避,具有一定的安全保護作用簇捍。
至于說保護模式,是說通過內存頁表操作等機制俏拱,保證進程間的地址空間不會互相沖突暑塑,一個進程的操作不會修改另一個進程的地址空間中的數(shù)據(jù)。

5.用戶態(tài)和內核態(tài)的概念區(qū)別

究竟什么是用戶態(tài)锅必,什么是內核態(tài)事格,這兩個基本概念以前一直理解得不是很清楚,根本原因個人覺得是在于因為大部分時候我們在寫程序時關注的重點和著眼的角度放在了實現(xiàn)的功能和代碼的邏輯性上搞隐,先看一個例子:

例子

void testfork(){
if(0 = = fork()){
   printf(“create new process success!\n”);
}
   printf(“testfork ok\n”);
}

這段代碼很簡單驹愚,從功能的角度來看,就是實際執(zhí)行了一個fork()劣纲,生成一個 新的進程逢捺,從邏輯的角度看,就是判斷了如果fork()返回的是0則打印相關語句味廊,然后函數(shù)最后再打印一句表示執(zhí)行完整個testfork()函數(shù)蒸甜。代碼 的執(zhí)行邏輯和功能上看就是如此簡單棠耕,一共四行代碼余佛,從上到下一句一句執(zhí)行而已,完全看不出來哪里有體現(xiàn)出用戶態(tài)和進程態(tài)的概念窍荧。

如果說前面兩種是靜態(tài)觀察的角度看的話辉巡,我們還可以從動態(tài)的角度來看這段代碼,即它被轉換成CPU執(zhí)行的指令后加載執(zhí)行的過程蕊退,這時這段程序就是一個動態(tài)執(zhí)行的指令序列郊楣。而究竟加載了哪些代碼憔恳,如何加載就是和操作系統(tǒng)密切相關了。

6.特權級

熟悉Unix/Linux系統(tǒng)的人都知道净蚤,fork的工作實際上是以系統(tǒng)調用的 方式完成相應功能的钥组,具體的工作是由sys_fork負責實施。其實無論是不是Unix或者Linux今瀑,對于任何操作系統(tǒng)來說程梦,創(chuàng)建一個新的進程都是屬于 核心功能,因為它要做很多底層細致地工作橘荠,消耗系統(tǒng)的物理資源屿附,比如分配物理內存,從父進程拷貝相關信息哥童,拷貝設置頁目錄頁表等等挺份,這些顯然不能隨便讓哪 個程序就能去做,于是就自然引出特權級別的概念贮懈,顯然匀泊,最關鍵性的權力必須由高特權級的程序來執(zhí)行,這樣才可以做到集中管理朵你,減少有限資源的訪問和使用沖 突探赫。

特權級顯然是非常有效的管理和控制程序執(zhí)行的手段,因此在硬件上對特權級做了很 多支持撬呢,就Intel x86架構的CPU來說一共有0~3四個特權級伦吠,0級最高,3級最低魂拦,硬件上在執(zhí)行每條指令時都會對指令所具有的特權級做相應的檢查毛仪,相關的概念有 CPL、DPL和RPL芯勘,這里不再過多闡述箱靴。硬件已經提供了一套特權級使用的相關機制,軟件自然就是好好利用的問題荷愕,這屬于操作系統(tǒng)要做的事情衡怀,對于 Unix/Linux來說,只使用了0級特權級和3級特權級安疗。也就是說在Unix/Linux系統(tǒng)中抛杨,一條工作在0級特權級的指令具有了CPU能提供的最 高權力,而一條工作在3級特權級的指令具有CPU提供的最低或者說最基本權力荐类。

7.用戶態(tài)和內核態(tài)

現(xiàn)在我們從特權級的調度來理解用戶態(tài)和內核態(tài)就比較好理解了怖现,當程序運行在3級 特權級上時,就可以稱之為運行在用戶態(tài),因為這是最低特權級屈嗤,是普通的用戶進程運行的特權級潘拨,大部分用戶直接面對的程序都是運行在用戶態(tài);反之饶号,當程序運 行在0級特權級上時铁追,就可以稱之為運行在內核態(tài)。

雖然用戶態(tài)下和內核態(tài)下工作的程序有很多差別茫船,但最重要的差別就在于特權級的不 同脂信,即權力的不同。運行在用戶態(tài)下的程序不能直接訪問操作系統(tǒng)內核數(shù)據(jù)結構和程序透硝,比如上面例子中的testfork()就不能直接調用 sys_fork()狰闪,因為前者是工作在用戶態(tài),屬于用戶態(tài)程序濒生,而sys_fork()是工作在內核態(tài)埋泵,屬于內核態(tài)程序。

當我們在系統(tǒng)中執(zhí)行一個程序時罪治,大部分時間是運行在用戶態(tài)下的丽声,在其需要操作系 統(tǒng)幫助完成某些它沒有權力和能力完成的工作時就會切換到內核態(tài),比如testfork()最初運行在用戶態(tài)進程下觉义,當它調用fork()最終觸發(fā) sys_fork()的執(zhí)行時雁社,就切換到了內核態(tài)。

8.用戶態(tài)和內核態(tài)的轉換

用戶態(tài)切換到內核態(tài)的3種方式

系統(tǒng)調用

這是用戶態(tài)進程主動要求切換到內核態(tài)的一種方式晒骇,用戶態(tài)進程通過系統(tǒng)調用申請使 用操作系統(tǒng)提供的服務程序完成工作霉撵,比如前例中fork()實際上就是執(zhí)行了一個創(chuàng)建新進程的系統(tǒng)調用。而系統(tǒng)調用的機制其核心還是使用了操作系統(tǒng)為用戶 特別開放的一個中斷來實現(xiàn)洪囤,例如Linux的int 80h中斷徒坡。

異常

當CPU在執(zhí)行運行在用戶態(tài)下的程序時,發(fā)生了某些事先不可知的異常瘤缩,這時會觸發(fā)由當前運行進程切換到處理此異常的內核相關程序中喇完,也就轉到了內核態(tài),比如缺頁異常剥啤。

外圍設備的中斷

當外圍設備完成用戶請求的操作后锦溪,會向CPU發(fā)出相應的中斷信號,這時CPU會 暫停執(zhí)行下一條即將要執(zhí)行的指令轉而去執(zhí)行與中斷信號對應的處理程序府怯,如果先前執(zhí)行的指令是用戶態(tài)下的程序刻诊,那么這個轉換的過程自然也就發(fā)生了由用戶態(tài)到 內核態(tài)的切換。比如硬盤讀寫操作完成富腊,系統(tǒng)會切換到硬盤讀寫的中斷處理程序中執(zhí)行后續(xù)操作等坏逢。

這3種方式是系統(tǒng)在運行時由用戶態(tài)轉到內核態(tài)的最主要方式域帐,其中系統(tǒng)調用可以認為是用戶進程主動發(fā)起的赘被,異常和外圍設備中斷則是被動的是整。

9.具體的切換操作

從觸發(fā)方式上看,可以認為存在前述3種不同的類型民假,但是從最終實際完成由用戶態(tài) 到內核態(tài)的切換操作上來說浮入,涉及的關鍵步驟是完全一致的,沒有任何區(qū)別羊异,都相當于執(zhí)行了一個中斷響應的過程事秀,因為系統(tǒng)調用實際上最終是中斷機制實現(xiàn)的,而 異常和中斷的處理機制基本上也是一致的野舶,關于它們的具體區(qū)別這里不再贅述易迹。關于中斷處理機制的細節(jié)和步驟這里也不做過多分析,涉及到由用戶態(tài)切換到內核態(tài) 的步驟主要包括:

[1] 從當前進程的描述符中提取其內核棧的ss0及esp0信息平道。

[2] 使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來睹欲,這個

過程也完成了由用戶棧到內核棧的切換過程,同時保存了被暫停執(zhí)行的程序的下一條指令一屋。

[3] 將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應的寄存器窘疮,開始

執(zhí)行中斷處理程序,這時就轉到了內核態(tài)的程序執(zhí)行了冀墨。

10.感謝資源分享

https://www.cnblogs.com/shangxiaofei/p/5567776.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末闸衫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诽嘉,更是在濱河造成了極大的恐慌蔚出,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虫腋,死亡現(xiàn)場離奇詭異身冬,居然都是意外死亡,警方通過查閱死者的電腦和手機岔乔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門酥筝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雏门,你說我怎么就攤上這事嘿歌。” “怎么了茁影?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵宙帝,是天一觀的道長。 經常有香客問我募闲,道長步脓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮靴患,結果婚禮上仍侥,老公的妹妹穿的比我還像新娘。我一直安慰自己鸳君,他們只是感情好农渊,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著或颊,像睡著了一般砸紊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上囱挑,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天醉顽,我揣著相機與錄音,去河邊找鬼平挑。 笑死徽鼎,一個胖子當著我的面吹牛,可吹牛的內容都是我干的弹惦。 我是一名探鬼主播否淤,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棠隐!你這毒婦竟也來了石抡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤助泽,失蹤者是張志新(化名)和其女友劉穎啰扛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗡贺,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡隐解,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诫睬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煞茫。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摄凡,靈堂內的尸體忽然破棺而出续徽,到底是詐尸還是另有隱情,我是刑警寧澤亲澡,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布钦扭,位于F島的核電站,受9級特大地震影響床绪,放射性物質發(fā)生泄漏客情。R本人自食惡果不足惜其弊,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膀斋。 院中可真熱鬧梭伐,春花似錦、人聲如沸概页。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惰匙。三九已至,卻和暖如春铃将,著一層夾襖步出監(jiān)牢的瞬間项鬼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工劲阎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绘盟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓悯仙,卻偏偏與公主長得像龄毡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锡垄,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容