用戶態(tài)和內(nèi)核態(tài)
內(nèi)核態(tài)(Kernel Mode):運(yùn)行操作系統(tǒng)程序摆碉,操作硬件 用戶態(tài)(User Mode):運(yùn)行用戶程序
內(nèi)核態(tài)與用戶態(tài)是操作系統(tǒng)的兩種運(yùn)行級別塘匣,當(dāng)程序運(yùn)行在3級特權(quán)級上時(shí),就可以稱之為運(yùn)行在用戶態(tài)巷帝。因?yàn)檫@是最低特權(quán)級忌卤,是普通的用戶進(jìn)程運(yùn)行的特權(quán)級,大部分用戶直接面對的程序都是運(yùn)行在用戶態(tài)楞泼;
當(dāng)程序運(yùn)行在0級特權(quán)級上時(shí)驰徊,就可以稱之為運(yùn)行在內(nèi)核態(tài)。
運(yùn)行在用戶態(tài)下的程序不能直接訪問操作系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)和程序堕阔。當(dāng)我們在系統(tǒng)中執(zhí)行一個(gè)程序時(shí)棍厂,大部分時(shí)間是運(yùn)行在用戶態(tài)下的,在其需要操作系統(tǒng)幫助完成某些它沒有權(quán)力和能力完成的工作時(shí)就會(huì)切換到內(nèi)核態(tài)(比如操作硬件)超陆。
往往我們的系統(tǒng)的資源是固定的牺弹,例如內(nèi)存2G,CPU固定时呀,磁盤2TB张漂,網(wǎng)絡(luò)接口固定。所以就需要操作系統(tǒng)對資源進(jìn)行有效的利用谨娜。假設(shè)某個(gè)應(yīng)用程序過分的訪問這些資源鹃锈,就會(huì)導(dǎo)致整個(gè)系統(tǒng)的資源被占用,如果不對這種行為進(jìn)行限制和區(qū)分瞧预,就會(huì)導(dǎo)致資源訪問的沖突屎债。所以仅政,Linux的設(shè)計(jì)的初衷:給不同的操作給與不同的“權(quán)限”。Linux操作系統(tǒng)就將權(quán)限等級分為了2個(gè)等級盆驹,分別就是內(nèi)核態(tài)和用戶態(tài)圆丹。
各位有沒有發(fā)現(xiàn),前面講了這么多內(nèi)核態(tài)和用戶態(tài)什么不同躯喇,其實(shí)用一句話就能概括:它們權(quán)限不同辫封。用戶態(tài)的進(jìn)程能夠訪問的資源受到了極大的控制,而運(yùn)行在內(nèi)核態(tài)的進(jìn)程可以“為所欲為”廉丽。
從用戶態(tài)到內(nèi)核態(tài)切換可以通過三種方式:
- 系統(tǒng)調(diào)用倦微,這個(gè)上面已經(jīng)講解過了,在我公眾號之前的文章也有講解過正压。其實(shí)系統(tǒng)調(diào)用本身就是中斷欣福,但是軟件中斷,跟硬中斷不同焦履。
- 異常:如果當(dāng)前進(jìn)程運(yùn)行在用戶態(tài)拓劝,如果這個(gè)時(shí)候發(fā)生了異常事件,就會(huì)觸發(fā)切換嘉裤。例如:缺頁異常郑临。
-
- 外設(shè)中斷:當(dāng)外設(shè)完成用戶的請求時(shí),會(huì)向CPU發(fā)送中斷信號屑宠。
image-20200812202318020
cpu占用率
user
(通诚岫矗縮寫為us),代表用戶態(tài)CPU時(shí)間典奉。注意躺翻,它包括下面的nice
時(shí)間,但包括了guest
時(shí)間秋柄。
nice
(通郴裰Γ縮寫為ni)蠢正,代表低優(yōu)先級用戶態(tài)CPU時(shí)間骇笔,也就是進(jìn)程的nice值被調(diào)整為1-19之間是的CPU時(shí)間。
system
(通诚福縮寫為sys)笨触,代表內(nèi)核態(tài)CPU時(shí)間
idle
(通常縮寫為id)雹舀,代表空閑時(shí)間芦劣。注意,它不包括I/O等待時(shí)間(iowait
)
iowait
(通乘涤埽縮寫為wa)虚吟,代表等待I/O的CPU時(shí)間寸认,cpu出于空閑且有未完成的I/O請求
irq
(通常縮寫為hi)串慰,代表處理硬中斷的CPU時(shí)間
softirq
(通称縮寫為si),代表處理軟中斷的CPU時(shí)間邦鲫,系統(tǒng)調(diào)用時(shí)發(fā)生軟中斷
steal
(通尘牡穑縮寫為st),代表當(dāng)系統(tǒng)運(yùn)行在虛擬機(jī)中的時(shí)候庆捺,被其他虛擬機(jī)占用的CPU時(shí)間
guest
(通彻沤瘢縮寫為guest
),代表通過虛擬化運(yùn)行其他操作系統(tǒng)的時(shí)間滔以,也就是運(yùn)行虛擬機(jī)的CPU時(shí)間
理解:
user
+system
+idle
+iowait
=100%捉腥?idle
+iowait
=空閑cpuiowait
: 單純的iowait高不能說明I/O負(fù)載高https://www.linuxprobe.com/understand-iowait.html
sleep() wait()
Thread.sleep()或object.wait()后,都會(huì)釋放cpu資源
Thread.sleep()不會(huì)釋放占用的鎖
object.wait()會(huì)釋放占用的鎖
top使用
在top命令運(yùn)行過程中可以通過top的內(nèi)部命令做顯示方式的控制醉者。
1- 開啟或關(guān)閉顯示所有cpu使用詳細(xì)情況
l - 關(guān)閉或開啟第一部分第一行 top 信息的表示
t - 關(guān)閉或開啟第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m - 關(guān)閉或開啟第一部分第四行 Mem 和 第五行 Swap 信息的表示
N - 以 PID 的大小的順序排列表示進(jìn)程列表(第三部分后述)
P - 以 CPU 占用率大小的順序排列進(jìn)程列表 (第三部分后述)
M - 以內(nèi)存占用率大小的順序排列進(jìn)程列表 (第三部分后述)
h - 顯示幫助
n - 設(shè)置在進(jìn)程列表所顯示進(jìn)程的數(shù)量
q - 退出 top
s - 改變畫面更新頻率(輸入數(shù)字)