您好,登錄后才能下訂單哦!
進(jìn)程的基本概念:
進(jìn)程可以理解成運(yùn)行中的程序的一個(gè)副本。程序通過(guò)內(nèi)核調(diào)度運(yùn)行起來(lái)成為一個(gè)進(jìn)程,并由內(nèi)核負(fù)責(zé)調(diào)度其運(yùn)行于CPU之上以執(zhí)行程序中的一部分或全部代碼,因此進(jìn)程是運(yùn)行中的動(dòng)態(tài)實(shí)體。而程序是放在文件系統(tǒng)上的一個(gè)文件,只要不刪除將永久存在,而進(jìn)程是有生命周期的,每個(gè)進(jìn)程都有創(chuàng)建、運(yùn)行、結(jié)束這一時(shí)間段。同一個(gè)程序的代碼可以被復(fù)制多份并由內(nèi)核調(diào)度成多個(gè)進(jìn)程運(yùn)行,因此可稱(chēng)為運(yùn)行中的程序的一個(gè)副本。
進(jìn)程調(diào)度:
進(jìn)程管理中最重要的一部分是進(jìn)程調(diào)度,可理解成對(duì)各個(gè)進(jìn)程運(yùn)行時(shí)的各種細(xì)節(jié)的安排和管理。當(dāng)文件系統(tǒng)上一個(gè)可執(zhí)行程序文件被觸發(fā)并通過(guò)內(nèi)核調(diào)度運(yùn)行為一個(gè)進(jìn)程時(shí),進(jìn)程中的指令、數(shù)據(jù)以及進(jìn)程相關(guān)的屬性信息(例如進(jìn)程的屬主、屬組、PID等)被內(nèi)核加載至內(nèi)存空間中,而指令需要運(yùn)行在CPU之上,此時(shí)CPU中的寄存器可記錄正在運(yùn)行中的指令的狀態(tài),例如正在取指令、執(zhí)行指令、加工數(shù)據(jù)、取數(shù)據(jù)...,其中指令指針寄存器IP用于存放下一條要執(zhí)行的指令的內(nèi)存地址。
但是需要CPU運(yùn)行的有眾多進(jìn)程而不只有一個(gè)進(jìn)程,因此內(nèi)核將CPU切分為多個(gè)時(shí)間片,并負(fù)責(zé)將這多個(gè)時(shí)間片按照優(yōu)先級(jí)分配給各個(gè)進(jìn)程。當(dāng)一個(gè)進(jìn)程在某一時(shí)間片運(yùn)行與CPU上時(shí),這個(gè)時(shí)間片就是該進(jìn)程允許運(yùn)行的時(shí)間,一旦過(guò)了這個(gè)時(shí)間片,該進(jìn)程將被中斷,這時(shí)內(nèi)核把這個(gè)進(jìn)程的中間狀態(tài)信息按照固定的格式存儲(chǔ)于內(nèi)存中,重新調(diào)度另一個(gè)進(jìn)程運(yùn)行于CPU之上,接著,CPU中用于存放進(jìn)程狀態(tài)相關(guān)數(shù)據(jù)將被下一個(gè)進(jìn)程所覆蓋。其中,將進(jìn)程的相關(guān)狀態(tài)信息存儲(chǔ)于內(nèi)存中這一過(guò)程稱(chēng)為保存現(xiàn)場(chǎng),而Linux內(nèi)核存儲(chǔ)進(jìn)程狀態(tài)信息是存儲(chǔ)進(jìn)具有固定格式的結(jié)構(gòu)體的,這個(gè)結(jié)構(gòu)體就是task struct,多個(gè)任務(wù)(進(jìn)程)的結(jié)構(gòu)體(task struct)組成鏈表結(jié)構(gòu)(task list),根據(jù)組成方式的不同有單向鏈表結(jié)構(gòu)、雙向鏈表結(jié)構(gòu)、循環(huán)鏈表結(jié)構(gòu)、雙向循環(huán)列表結(jié)構(gòu)等。打個(gè)比方,我們盛酒水需要用壇子,而這個(gè)固定結(jié)構(gòu)的容器--壇子,就是結(jié)構(gòu)體,總不能用地板裝酒水吧?而這些壇子按照一定的組織排列起來(lái)的結(jié)構(gòu)可類(lèi)比為鏈表結(jié)構(gòu)。
需要注意的是,當(dāng)CPU上的某一時(shí)間片結(jié)束后,內(nèi)核會(huì)調(diào)度另一個(gè)進(jìn)程運(yùn)行于CPU之上,而問(wèn)題是內(nèi)核該如何從眾多等待運(yùn)行的進(jìn)程中挑選出一個(gè)進(jìn)程并使其運(yùn)行于CPU上呢?為了在調(diào)度進(jìn)程時(shí)明確哪個(gè)進(jìn)程優(yōu)先執(zhí)行,哪個(gè)進(jìn)程后執(zhí)行,需要用進(jìn)程優(yōu)先級(jí)來(lái)做判斷。進(jìn)程優(yōu)先級(jí)范圍是0-139,分為實(shí)時(shí)優(yōu)先級(jí)(1-99)和靜態(tài)優(yōu)先級(jí)(100-139),其中實(shí)時(shí)優(yōu)先級(jí)與內(nèi)核執(zhí)行的系統(tǒng)管理操作有關(guān),用戶不可對(duì)實(shí)時(shí)優(yōu)先級(jí)進(jìn)行調(diào)整;而用戶可以調(diào)整的是靜態(tài)優(yōu)先級(jí)(可通過(guò)nice值進(jìn)行調(diào)整),普通用戶只可調(diào)低不可調(diào)高,只有系統(tǒng)管理員才可隨意調(diào)整。因此,內(nèi)核是將進(jìn)程優(yōu)先級(jí)來(lái)作為調(diào)度進(jìn)程次序的依據(jù)的,但由此內(nèi)核首先必須知道各個(gè)進(jìn)程的屬性(優(yōu)先級(jí)),因此在每次調(diào)度進(jìn)程執(zhí)行時(shí)總得遍歷內(nèi)存上所有結(jié)構(gòu)體中的信息,這將會(huì)消耗掉大量的時(shí)間。
Linux的2.6版本內(nèi)核通過(guò)精巧的設(shè)計(jì)解決了這一問(wèn)題:將所有進(jìn)程排成140個(gè)隊(duì)列,每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)優(yōu)先級(jí),每個(gè)進(jìn)程歸屬至其優(yōu)先級(jí)的隊(duì)列中。而每次內(nèi)核調(diào)度進(jìn)程執(zhí)行時(shí)只需掃描這140個(gè)隊(duì)列的首部,并從這些隊(duì)列中挑選出一個(gè)進(jìn)程出來(lái)執(zhí)行即可。這樣一來(lái),無(wú)論進(jìn)程有多少個(gè),內(nèi)核都是通過(guò)掃描140個(gè)隊(duì)列首部來(lái)實(shí)現(xiàn)快速明確調(diào)度哪個(gè)進(jìn)程執(zhí)行于CPU上,因此調(diào)度時(shí)間不會(huì)隨進(jìn)程數(shù)量而改變。內(nèi)核的這種工作模式基于的算法符合程序界的Big O中的O(1)理想模型,即意味著隨著算法復(fù)雜度的增加,算法解決問(wèn)題(這里是進(jìn)程調(diào)度速度問(wèn)題)的時(shí)間不會(huì)變化。
但這樣一來(lái)又有一個(gè)問(wèn)題,當(dāng)一個(gè)進(jìn)程在一個(gè)時(shí)間片執(zhí)行完之后應(yīng)該如何歸隊(duì)呢?在Linux中,進(jìn)程按照優(yōu)先級(jí)排出隊(duì)列,而每個(gè)隊(duì)列內(nèi)部又分為運(yùn)行隊(duì)列和過(guò)期隊(duì)列,實(shí)際上內(nèi)核就是通過(guò)掃描各個(gè)運(yùn)行隊(duì)列首部來(lái)做判斷的,而進(jìn)程在CPU執(zhí)行之后返回過(guò)期隊(duì)列中,而運(yùn)行隊(duì)列繼續(xù)等待內(nèi)核的調(diào)度;一旦運(yùn)行隊(duì)列中的進(jìn)程全部執(zhí)行完畢(每個(gè)進(jìn)程都在CPU上輪流執(zhí)行了一遍),這時(shí)運(yùn)行隊(duì)列將轉(zhuǎn)變?yōu)檫^(guò)期隊(duì)列,而原來(lái)的過(guò)期隊(duì)列則轉(zhuǎn)變?yōu)檫\(yùn)行隊(duì)列等待內(nèi)核再次調(diào)度,重復(fù)上述邏輯。
進(jìn)程創(chuàng)建:
主機(jī)開(kāi)機(jī)后,首先將內(nèi)核加載至內(nèi)存中,在CPU上開(kāi)始運(yùn)行內(nèi)核代碼。接著由進(jìn)程開(kāi)始創(chuàng)建初始化進(jìn)程init,并將用戶空間的管理事務(wù)交給init這個(gè)進(jìn)程管理。接著init會(huì)創(chuàng)建出子進(jìn)程,而這些子進(jìn)程可以分別創(chuàng)建出各自的子進(jìn)程,因此除了init進(jìn)程之外,其他的進(jìn)程都由其父進(jìn)程創(chuàng)建;init進(jìn)程可視為內(nèi)核的代理,負(fù)責(zé)管理用戶空間進(jìn)程的創(chuàng)建和關(guān)閉,并向內(nèi)核提交相應(yīng)的請(qǐng)求,但init不能代替內(nèi)核執(zhí)行特權(quán)指令。
那么,在什么情況下父進(jìn)程需要?jiǎng)?chuàng)建子進(jìn)程呢?當(dāng)一個(gè)父進(jìn)程需要借助于某些程序完成復(fù)雜任務(wù)時(shí),通常需要調(diào)用系統(tǒng)上某個(gè)可執(zhí)行程序文件,將其創(chuàng)建為進(jìn)程,而創(chuàng)建子進(jìn)程需要通過(guò)fork()這個(gè)系統(tǒng)調(diào)用接口向內(nèi)核申請(qǐng)?zhí)峤灰獎(jiǎng)?chuàng)建的進(jìn)程,而后再通過(guò)clone()接口將自身的數(shù)據(jù)復(fù)制一份給子進(jìn)程;需要注意的是,此時(shí)父進(jìn)程和子進(jìn)程在內(nèi)存中占據(jù)相同的空間,而一旦子進(jìn)程需要修改數(shù)據(jù)時(shí),父進(jìn)程會(huì)重新開(kāi)辟一個(gè)相同的內(nèi)存空間給子進(jìn)程,這是父進(jìn)程和子進(jìn)程不在占據(jù)同一內(nèi)存空間,這種機(jī)制稱(chēng)為寫(xiě)時(shí)復(fù)制機(jī)制(CoW)。
當(dāng)子進(jìn)程完成復(fù)雜任務(wù)時(shí),其父進(jìn)程會(huì)關(guān)閉該子進(jìn)程,內(nèi)核將內(nèi)存收回。
init程序在不同版本的體現(xiàn): CentOS 5: SysV init,經(jīng)典版本,缺陷是在系統(tǒng)啟動(dòng)和引導(dǎo)時(shí),它創(chuàng)建各子進(jìn)程是通過(guò)寫(xiě)腳本方式借助于 shell來(lái)實(shí)現(xiàn)的,因?yàn)閟hell腳本是大量命令的堆砌,每個(gè)命令運(yùn)行時(shí)會(huì)創(chuàng)建進(jìn)程,因此每啟動(dòng)一 次就需要?jiǎng)?chuàng)建上千個(gè)進(jìn)程,因此執(zhí)行速度非常慢。 CentOS 6: upstart,基于dbus方式進(jìn)行通信,同SysV init是通過(guò)運(yùn)行很多命令創(chuàng)建很多進(jìn)程來(lái)完成的,但 不同的是upstart能夠并行啟動(dòng)具有關(guān)聯(lián)性的服務(wù)程序,實(shí)現(xiàn)多線創(chuàng)建進(jìn)程,如果CPU有多個(gè)時(shí)會(huì) 快很多,而SysV init僅能以串行方式實(shí)現(xiàn)啟動(dòng)程序。 CentOS 7: systemd,以一個(gè)程序完成整個(gè)系統(tǒng)的啟動(dòng)和引導(dǎo),而且需要啟動(dòng)的進(jìn)程總數(shù)僅有10個(gè)左右,因此 系統(tǒng)啟動(dòng)和引導(dǎo)非常快。CentOS7上啟動(dòng)或關(guān)閉服務(wù)程序時(shí)需要通過(guò)systemctl實(shí)現(xiàn),因?yàn)檫@些服 務(wù)統(tǒng)一由systemd控制; #不同版本的init程序文件名都為init。
進(jìn)程內(nèi)存:
承接上述,當(dāng)內(nèi)核運(yùn)行起來(lái)之后,會(huì)占據(jù)一定的內(nèi)存空間,例如對(duì)于Linux來(lái)講一般是1G。其他進(jìn)程運(yùn)行起來(lái)之后,內(nèi)核會(huì)將內(nèi)存按空間分成多片分配給各個(gè)進(jìn)程使用,這里的每個(gè)“片”指的是頁(yè)框(page frame),頁(yè)框就是用來(lái)存儲(chǔ)頁(yè)面數(shù)據(jù)(內(nèi)存進(jìn)程信息)的,一個(gè)頁(yè)框就是4K大小的內(nèi)存空間塊。而將真實(shí)的物理內(nèi)存空間連續(xù)地分配給各進(jìn)程使用明顯不合適,因?yàn)橥臻e的內(nèi)存空間是離散分布的,而且各個(gè)進(jìn)程在運(yùn)行過(guò)程中會(huì)產(chǎn)生各種中間數(shù)據(jù),這也會(huì)導(dǎo)致進(jìn)程占據(jù)的內(nèi)存空間加大。因此,內(nèi)核將底層的物理內(nèi)存上的空閑的碎片(頁(yè)框)收集起來(lái),并為上層運(yùn)行的進(jìn)程虛擬出連續(xù)的內(nèi)存空間,這個(gè)虛擬的內(nèi)存地址也稱(chēng)為邏輯地址,讓每個(gè)進(jìn)程“以為”其占據(jù)的內(nèi)存空間是連續(xù)分布的,這個(gè)連續(xù)的邏輯地址稱(chēng)為線性地址空間。內(nèi)核會(huì)為每個(gè)進(jìn)程虛擬出一個(gè)“假象”,即主機(jī)上只運(yùn)行兩個(gè)程序:內(nèi)核和進(jìn)程自己,并且“以為”線性地址空間中除了1G內(nèi)存分配給內(nèi)核使用,其余的內(nèi)存空間均可由進(jìn)程自己使用。事實(shí)上,進(jìn)程真正只用到一小部分內(nèi)存空間,并映射到真實(shí)的物理內(nèi)存上連續(xù)或離散的內(nèi)存空間。邏輯地址和物理地址之間映射關(guān)系則存儲(chǔ)于task struct。當(dāng)進(jìn)程執(zhí)行時(shí),CPU中有專(zhuān)門(mén)用于將邏輯地址轉(zhuǎn)換為物理內(nèi)存地址的電路,即內(nèi)存管理單元(MMU, Memory Management Unit),因此需要內(nèi)核將內(nèi)存的映射關(guān)系加載至MMU中。
當(dāng)進(jìn)程被分配好內(nèi)存后,其指令、數(shù)據(jù)以及進(jìn)程相關(guān)的屬性信息會(huì)加載至內(nèi)存中,在內(nèi)存低地址的地方存放指令(code),而數(shù)據(jù)可以由變量等數(shù)據(jù)結(jié)構(gòu)組織存放于內(nèi)存中,當(dāng)然也可以是普通數(shù)據(jù);進(jìn)程還會(huì)將一部分空間作為堆(heap)內(nèi)存和棧(stack)內(nèi)存;當(dāng)進(jìn)程運(yùn)行的中間數(shù)據(jù)增加時(shí),或者需要加載磁盤(pán)上更多數(shù)據(jù)至內(nèi)存時(shí),存放于堆內(nèi)存和棧內(nèi)存中的數(shù)據(jù)量增大,堆內(nèi)存空間向棧頂?shù)姆较驍U(kuò)展,而棧內(nèi)存空間向堆的方向擴(kuò)展;一旦兩者在擴(kuò)展時(shí)相遇,則說(shuō)明物理內(nèi)存空間不足;這時(shí)交換空間(swap)就出場(chǎng)了,swap可通過(guò)近期最少使用算法(LRU, Least Recently Used)掃描出內(nèi)存上內(nèi)存上最近不常用的數(shù)據(jù),將其暫存于swap中,而騰挪出來(lái)的內(nèi)存空間可供進(jìn)程使用。
當(dāng)然,并非所有內(nèi)存空間中的數(shù)據(jù)都可交換至swap中,關(guān)鍵性數(shù)據(jù)(如程序指令code)就不可交換,但非關(guān)鍵性數(shù)據(jù)(例如程序中的一些不常用數(shù)據(jù)data);我們把不能用于交換的內(nèi)存空間稱(chēng)為常駐內(nèi)存集,而能夠交換的內(nèi)存空間稱(chēng)為虛擬內(nèi)存集。不過(guò),如果交換了內(nèi)存空間,那么線性地址空間中映射的物理內(nèi)存空間地址也會(huì)發(fā)生改變,因此當(dāng)進(jìn)程需要重新訪問(wèn)被交換至磁盤(pán)上的swap或加載磁盤(pán)上其他空間的數(shù)據(jù)至內(nèi)存時(shí),需要先請(qǐng)求內(nèi)核調(diào)用,內(nèi)核將磁盤(pán)上的數(shù)據(jù)先加載至內(nèi)核內(nèi)存中,再?gòu)?fù)制一份給進(jìn)程內(nèi)存。并且,當(dāng)進(jìn)程在CPU上執(zhí)行時(shí)需要更新MMU上的映射關(guān)系。
進(jìn)程間通信:
雖說(shuō)進(jìn)程“以為”主機(jī)上只運(yùn)行內(nèi)核和進(jìn)程自己,但進(jìn)程間是可以通過(guò)IPC(Inter-Process Communication)技術(shù)實(shí)現(xiàn)通信的。而進(jìn)程間通信在同一主機(jī)上和不同主機(jī)上是各不相同的。
IPC(Inter-Process Communication):
同一主機(jī)上:
signal:通過(guò)發(fā)送信號(hào)方式通信; shm:通過(guò)共享內(nèi)存方式通信; semerphor:旗語(yǔ),通過(guò)類(lèi)似“打手勢(shì)”方式通信;
不同主機(jī)上上:
rpc:remote procecure call,即遠(yuǎn)程過(guò)程調(diào)用,進(jìn)程通過(guò)調(diào)用遠(yuǎn)程主機(jī)上的庫(kù)函數(shù)或數(shù)據(jù)加工處理 的結(jié)果實(shí)現(xiàn)通信;rpc是基于socket實(shí)現(xiàn),但比socket更為抽象的一種通信方式; socket:通過(guò)進(jìn)程監(jiān)聽(tīng)的方式實(shí)現(xiàn)通信,通信雙方事先需要建立虛鏈路(tcp連接);在用戶空間表現(xiàn)為 socket文件,雙方主機(jī)上的socket文件都保存本地主機(jī)的IP/Port以及對(duì)方主機(jī)的IP/Port,一方用戶 可通過(guò)向socket文件寫(xiě)數(shù)據(jù),另一方用戶則可通過(guò)讀取socket文件獲取數(shù)據(jù);
進(jìn)程類(lèi)型:
根據(jù)是否與終端相關(guān)分類(lèi):
守護(hù)進(jìn)程:在系統(tǒng)引導(dǎo)過(guò)程中啟動(dòng)的進(jìn)程,跟終端無(wú)關(guān); 前臺(tái)進(jìn)程:通過(guò)終端啟動(dòng)的進(jìn)程,跟終端相關(guān); #注意:也可以把在前臺(tái)啟動(dòng)的進(jìn)程送往后臺(tái),以守護(hù)模式運(yùn)行;
根據(jù)進(jìn)程占用CPU多還是IO多分類(lèi):
CPU-bound:一般非交互式進(jìn)程屬于CPU密集型; IO-bound:一般交互式進(jìn)程屬于IO密集型;IO密集型進(jìn)程的優(yōu)先級(jí)應(yīng)比CPU密集型進(jìn)程高; #根據(jù)Linux哲學(xué)思想之一:程序啟動(dòng)之后應(yīng)盡量避免與用戶交互,可知CPU-bound這一類(lèi)進(jìn)程應(yīng)該多 分配一些CPU資源。
進(jìn)程狀態(tài):
(1)運(yùn)行態(tài):running; (2)就緒態(tài):ready,可以運(yùn)行但沒(méi)在CPU上運(yùn)行;也可以稱(chēng)為睡眠態(tài); (3)睡眠態(tài):分為可中斷睡眠和不可中斷睡眠; 可中斷睡眠:interruptable,任何時(shí)候都可喚醒并運(yùn)行; 不可中斷睡眠:uninterruptable,例如等待IO過(guò)程; (4)停止態(tài):stopped,即暫停于內(nèi)存中,不會(huì)別調(diào)度,除非手動(dòng)啟動(dòng)之; (5)僵死態(tài):zombie,子進(jìn)程運(yùn)行結(jié)束之后需要等待其父進(jìn)程關(guān)閉,但若其父進(jìn)程意外事先關(guān)閉,則 子進(jìn)程會(huì)一直等待下去,此時(shí)該子進(jìn)程即為僵尸進(jìn)程,或者說(shuō)處于僵死態(tài); #等待IO過(guò)程: 當(dāng)進(jìn)程執(zhí)行時(shí)需要用到的數(shù)據(jù)不在內(nèi)存中時(shí),需要向內(nèi)核發(fā)起申請(qǐng)(通過(guò)系統(tǒng)調(diào)用接口,進(jìn)程無(wú)法直接 訪問(wèn)硬件),內(nèi)核將磁盤(pán)上的數(shù)據(jù)先加載至內(nèi)核內(nèi)存中,再將內(nèi)核內(nèi)存中加載的數(shù)據(jù)復(fù)制一份給進(jìn)程內(nèi) 存;
線程的基本概念:
一般來(lái)講,每個(gè)程序運(yùn)行時(shí)只能有一個(gè)執(zhí)行流;而如果程序內(nèi)部有很多代碼需要執(zhí)行并且這些代碼彼此之間實(shí)現(xiàn)的功能又比較獨(dú)立,為了讓程序執(zhí)行速度更快,則可通過(guò)并行編程的模式將程序開(kāi)發(fā)成可以互相獨(dú)立并且能單獨(dú)執(zhí)行的執(zhí)行流,而這個(gè)執(zhí)行流就是線程;線程是進(jìn)程的子單位。當(dāng)有多個(gè)CPU時(shí),程序啟動(dòng)后創(chuàng)建出多個(gè)并行執(zhí)行的線程(執(zhí)行流),這些線程可分別運(yùn)行于不同顆CPU之上。不過(guò),當(dāng)主機(jī)只有一個(gè)CPU時(shí),將進(jìn)程分成多個(gè)線程執(zhí)行反而會(huì)降低運(yùn)行速度,因?yàn)閮?nèi)核在切換調(diào)度進(jìn)程(線程)時(shí)會(huì)消耗很多CPU時(shí)間。
關(guān)于服務(wù)類(lèi)程序:
對(duì)于Linux來(lái)講,基本是通過(guò)各個(gè)具有簡(jiǎn)單功能的小程序組合起來(lái)完成復(fù)雜任務(wù)的,因此在Linux上進(jìn)程都是輕量級(jí)的,和線程幾乎沒(méi)差別。雖然現(xiàn)在很多服務(wù)類(lèi)程序都是基于并行編程模式編寫(xiě)的,但當(dāng)服務(wù)器接收到的請(qǐng)求過(guò)多時(shí)響應(yīng)速度仍然會(huì)非常慢,因此現(xiàn)在編程時(shí)可通過(guò)精巧的設(shè)計(jì),使一個(gè)進(jìn)程能同時(shí)響應(yīng)多個(gè)進(jìn)程。
作為一名Linux運(yùn)維人員,需要有鑒定當(dāng)前系統(tǒng)的運(yùn)行狀態(tài)、資源的消耗情況、進(jìn)程啟動(dòng)的數(shù)量和模式等,例如當(dāng)用戶網(wǎng)頁(yè)打開(kāi)速度慢時(shí),我們需要查看當(dāng)前系統(tǒng)上運(yùn)行了哪些進(jìn)程、是否有我們期望運(yùn)行的進(jìn)程、期望運(yùn)行的這個(gè)進(jìn)程占據(jù)了CPU和內(nèi)存多大百分比、是否要調(diào)整進(jìn)程的優(yōu)先級(jí)、以及是否把CPU和內(nèi)存資源占滿......對(duì)于較大型的服務(wù)類(lèi)程序,例如Java編寫(xiě)的程序比較吃?xún)?nèi)存,常常需要運(yùn)維人員查看jvm虛擬機(jī)運(yùn)行是否正常、是否要調(diào)整其垃圾回收策略、是否其內(nèi)存資源使用的上限或下限、是否要再啟動(dòng)一個(gè)jvm進(jìn)程來(lái)實(shí)現(xiàn)并行響應(yīng)......總之,對(duì)于運(yùn)維人員來(lái)講,具有鑒定當(dāng)前系統(tǒng)上的運(yùn)行狀態(tài)的能力非常重要,因?yàn)檫\(yùn)維基本都是服務(wù),而服務(wù)是通過(guò)進(jìn)程來(lái)提供的。
Linux系統(tǒng)上的進(jìn)程查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glances, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup, nice, renice, killall, ...
pstree命令:
display a tree of processes
用于顯示進(jìn)程樹(shù)。
示例:
在CentOS 6上顯示進(jìn)程樹(shù):
[root@osyunwei ~]# pstree init─┬─NetworkManager ├─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─automount───4*[{automount}] ├─bluetoothd ├─certmonger ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─cupsd ├─dbus-daemon───{dbus-daemon} ├─dmeventd───2*[{dmeventd}] ├─gpm ├─hald─┬─hald-runner─┬─hald-addon-acpi │ │ ├─hald-addon-inpu │ │ ├─hald-addon-rfki │ │ └─hald-addon-stor │ └─{hald} ├─2*[iscsid] ├─iscsiuio───2*[{iscsiuio}] ├─ksmtuned───sleep ├─login───bash ├─master─┬─pickup │ └─qmgr ├─5*[mingetty] ├─modem-manager ├─pcscd───{pcscd} ├─polkitd ├─portreserve ├─rpc.statd ├─rpcbind ├─rsyslogd───3*[{rsyslogd}] ├─sshd─┬─sshd───bash │ └─sshd───bash───pstree ├─udevd───2*[udevd] └─wpa_supplicant
在CentOS 7上顯示進(jìn)程樹(shù):
[root@www ~]# pstree systemd─┬─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─abrt-watch-log ├─abrtd ├─anacron ├─atd ├─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─httpd───6*[httpd] ├─irqbalance ├─login───bash ├─lsmd ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─polkitd───5*[{polkitd}] ├─rngd ├─rpcbind ├─rsyslogd───2*[{rsyslogd}] ├─smartd ├─sshd───sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─vmtoolsd───{vmtoolsd}
ps命令:
report a snapshot of the current processes.
顯示ps命令執(zhí)行那一刻系統(tǒng)上進(jìn)程的運(yùn)行狀態(tài)。
ps命令查看內(nèi)核管理進(jìn)程參數(shù)的接口 --> 偽文件系統(tǒng)/proc
進(jìn)程是由內(nèi)核管理的,而內(nèi)核管理進(jìn)程的相關(guān)信息可通過(guò)接口來(lái)查詢(xún),在Linux上這個(gè)接口就是/proc目錄,內(nèi)核參數(shù)是模擬成文件系統(tǒng)類(lèi)型的,每個(gè)文件即為內(nèi)核參數(shù)。/proc文件系統(tǒng)存放于內(nèi)存空間中,用于存放內(nèi)核中的狀態(tài)信息。
內(nèi)核參數(shù)有兩種:
(1)可設(shè)置其值從而調(diào)整內(nèi)核運(yùn)行特性的參數(shù):這些參數(shù)通常存放于/proc/sys/目錄下,但并非位于 /proc/sys目錄下的文件(參數(shù))均可設(shè)置,只能設(shè)置具有寫(xiě)權(quán)限的文件(參數(shù))。 (2)狀態(tài)參數(shù):用于輸出內(nèi)核中的統(tǒng)計(jì)信息和狀態(tài)信息;僅用于查看。
每個(gè)進(jìn)程在/proc目錄下都有一個(gè)與其PID同名的目錄,這個(gè)目錄下的每個(gè)文件都是內(nèi)核參數(shù),用于專(zhuān)門(mén)保存當(dāng)前進(jìn)程的相關(guān)信息。
如下,顯示init進(jìn)程對(duì)應(yīng)的目錄:
通過(guò)參數(shù)comm可查看啟動(dòng)該進(jìn)程的程序文件:
[root@osyunwei ~]# cat /proc/1/comm init
通過(guò)參數(shù)maps可查看邏輯地址和物理內(nèi)存地址的映射關(guān)系:
[root@osyunwei ~]# cat /proc/1/maps 7f10e779e000-7f10e77ab000 r-xp 00000000 fd:01 398008 /lib64/libnss_files-2.12.so #庫(kù)函數(shù) 7f10e77ab000-7f10e79aa000 ---p 0000d000 fd:01 398008 /lib64/libnss_files-2.12.so 7f10e79aa000-7f10e79ab000 r--p 0000c000 fd:01 398008 /lib64/libnss_files-2.12.so 7f10e79ab000-7f10e79ac000 rw-p 0000d000 fd:01 398008 /lib64/libnss_files-2.12.so 7f10e79ac000-7f10e7b36000 r-xp 00000000 fd:01 462418 /lib64/libc-2.12.so 7f10e7b36000-7f10e7d36000 ---p 0018a000 fd:01 462418 /lib64/libc-2.12.so .....(中間省略)..... 7f10e8c01000-7f10e8c24000 r-xp 00000000 fd:01 149577 /sbin/init 7f10e8e23000-7f10e8e25000 r--p 00022000 fd:01 149577 /sbin/init 7f10e8e25000-7f10e8e26000 rw-p 00024000 fd:01 149577 /sbin/init 7f10eaa25000-7f10eaa64000 rw-p 00000000 00:00 0 [heap] #堆內(nèi)存 7ffc9a845000-7ffc9a85a000 rw-p 00000000 00:00 0 [stack] #棧內(nèi)存 7ffc9a8fd000-7ffc9a8fe000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
因?yàn)樵?proc目錄下的內(nèi)核參數(shù)對(duì)于非內(nèi)核級(jí)開(kāi)發(fā)人員來(lái)說(shuō)不便于查看,因此就有諸多查看命令專(zhuān)門(mén)將其中這些內(nèi)核參數(shù)信息收集起來(lái)并以一種直觀的方式顯示出來(lái),ps命令就是其中一個(gè)比較經(jīng)典的命令;
ps命令格式:
ps [options]
ps命令選項(xiàng)有三種風(fēng)格:
(1)UNIX選項(xiàng):選項(xiàng)之前必須帶'-' (2)BSD選項(xiàng):選項(xiàng)之間不能帶'-' (3)GNU長(zhǎng)格式選項(xiàng):選項(xiàng)之前必須帶'--'
常用選項(xiàng):
a:顯示所有與終端相關(guān)的進(jìn)程;
x:顯示所有與終端無(wú)關(guān)的進(jìn)程;
u:以用戶為中心組織進(jìn)程狀態(tài)信息的顯示;
o field1,field2,...:自定義要顯示的字段列表;各字段以逗號(hào)分隔;
-e:顯示所有進(jìn)程
-f:以完整格式顯示進(jìn)程狀態(tài)信息;
-F:以完整格式顯示進(jìn)程狀態(tài)信息(顯示項(xiàng)比-f選項(xiàng)更多);
-H:Hierarchy,以層級(jí)結(jié)構(gòu)顯示進(jìn)程的相關(guān)信息;
進(jìn)程啟動(dòng)方式:
(1)系統(tǒng)啟動(dòng)過(guò)程中自動(dòng)啟動(dòng):與終端無(wú)關(guān)的進(jìn)程;
(2)用戶通過(guò)終端啟動(dòng)的進(jìn)程:與終端相關(guān)的進(jìn)程;
①常用組合之一:aux
顯示所有與終端相關(guān)的進(jìn)程:
[root@localhost ~]# ps a PID TTY STAT TIME COMMAND 2571 tty1 Ss+ 0:02 -bash 13604 pts/0 Ss 0:00 -bash 13742 pts/0 R+ 0:00 ps a #各字段意義: PID:進(jìn)程號(hào); TTY:與進(jìn)程相關(guān)的終端設(shè)備; STAT:進(jìn)程的狀態(tài); TIME:進(jìn)程累積占用CPU的時(shí)間; COMMAND:?jiǎn)?dòng)該進(jìn)程的程序命令(包括選項(xiàng)和參數(shù))
顯示所有與終端無(wú)關(guān)的進(jìn)程:
[root@localhost ~]# ps x PID TTY STAT TIME COMMAND 1 ? Ss 0:28 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 2 ? S 0:00 [kthreadd] 3 ? S 0:00 [ksoftirqd/0] 5 ? S< 0:00 [kworker/0:0H] 7 ? S 0:02 [migration/0] 8 ? S 0:00 [rcu_bh] 9 ? R 0:30 [rcu_sched] 10 ? S 0:00 [watchdog/0] .....(省略)..... 1982 ? Ss 0:12 /usr/sbin/httpd -DFOREGROUND 2571 tty1 Ss+ 0:02 -bash 5213 ? Ssl 0:12 /usr/sbin/NetworkManager --no-daemon 7625 ? S< 0:00 [kworker/1:2H] .....(省略)..... 13739 ? S 0:00 [kworker/3:1] 13740 ? S< 0:00 [kworker/3:2H] 13755 pts/0 R+ 0:00 ps x #'?'表示與終端無(wú)關(guān); #根據(jù)PID號(hào)從小到大排序,各字段意義同上;
顯示所有進(jìn)程:
[root@localhost ~]# ps ax
以用戶為中心顯示所有進(jìn)程:
[root@localhost ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.6 193628 6732 ? Ss Feb13 0:28 /usr/lib/systemd/systemd --switched-root --system --des root 2 0.0 0.0 0 0 ? S Feb13 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Feb13 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< Feb13 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S Feb13 0:02 [migration/0] root 8 0.0 0.0 0 0 ? S Feb13 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S Feb13 0:30 [rcu_sched] root 10 0.0 0.0 0 0 ? S Feb13 0:00 [watchdog/0] root 11 0.0 0.0 0 0 ? S Feb13 0:00 [watchdog/1] root 12 0.0 0.0 0 0 ? S Feb13 0:03 [migration/1] root 13 0.0 0.0 0 0 ? S Feb13 0:03 [ksoftirqd/1] .....(以下省略)..... #各字段意義: USER:運(yùn)行進(jìn)程的用戶; PID:進(jìn)程號(hào); %CPU:進(jìn)程占用CPU資源的百分比; %MEM:進(jìn)程占用內(nèi)存資源的百分比; VSZ:Virtual memory SiZe,虛擬內(nèi)存集; RSS:ReSident Size,常駐內(nèi)存集; TTY:與進(jìn)程相關(guān)的終端設(shè)備; STAT:進(jìn)程狀態(tài); START:進(jìn)程的啟動(dòng)時(shí)間; TIME:進(jìn)程累積占用CPU時(shí)間; COMMAND:進(jìn)程由哪個(gè)命令程序啟動(dòng),帶'[]'代表為內(nèi)核線程,而通過(guò)pstree命令只能顯示進(jìn)程;
進(jìn)程狀態(tài)(STAT):
R:running,運(yùn)行態(tài); S:interruptable sleeping,可中斷睡眠; D:uninterruptable sleeping,不可中斷睡眠; T:stopped,停止態(tài); Z:zombie,僵死態(tài); +:前臺(tái)進(jìn)程(前臺(tái)指的是通過(guò)終端運(yùn)行,需要占據(jù)命令提示符); l:多線程進(jìn)程; N:低優(yōu)先級(jí)進(jìn)程; <:高優(yōu)先級(jí)進(jìn)程; s:session leader,會(huì)話主導(dǎo)者(例如bash);
②常用組合之二:ef
顯示所有進(jìn)程:
[root@localhost ~]# ps -e PID TTY TIME CMD 1 ? 00:00:28 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 ksoftirqd/0 .....(以下省略).....
以完整格式顯示進(jìn)程信息:
[root@localhost ~]# ps -f UID PID PPID C STIME TTY TIME CMD root 13604 13600 0 19:42 pts/0 00:00:00 -bash root 13882 13604 0 21:03 pts/0 00:00:00 ps -f #STIME:進(jìn)程的啟動(dòng)時(shí)間;
以完整格式顯示所有進(jìn)程:
[root@localhost ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Feb13 ? 00:00:28 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0 0 Feb13 ? 00:00:00 [kthreadd] root 3 2 0 Feb13 ? 00:00:00 [ksoftirqd/0] root 5 2 0 Feb13 ? 00:00:00 [kworker/0:0H] root 7 2 0 Feb13 ? 00:00:02 [migration/0] root 8 2 0 Feb13 ? 00:00:00 [rcu_bh] root 9 2 0 Feb13 ? 00:00:31 [rcu_sched] root 10 2 0 Feb13 ? 00:00:00 [watchdog/0] root 11 2 0 Feb13 ? 00:00:00 [watchdog/1] .....(以下省略)..... #各字段意義: UID:effective user,有效用戶,即運(yùn)行該進(jìn)程的用戶; PID:進(jìn)程號(hào); PPID:父進(jìn)程號(hào); C:cpu utilization,CPU使用率,即占用CPU資源的百分比; STIME:進(jìn)程的啟動(dòng)日期; TTY:與進(jìn)程相關(guān)的終端設(shè)備;'?'表示與終端無(wú)關(guān); TIME:進(jìn)程累積占用CPU的時(shí)間; CMD:?jiǎn)?dòng)進(jìn)程的命令程序,帶'[]'表示為內(nèi)核線程;
以更為完整的格式顯示所有進(jìn)程:
[root@localhost ~]# ps -eF UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 1 0 0 48407 6732 3 Feb13 ? 00:00:28 /usr/lib/systemd/systemd --switched-root --system --des root 2 0 0 0 0 0 Feb13 ? 00:00:00 [kthreadd] root 3 2 0 0 0 0 Feb13 ? 00:00:00 [ksoftirqd/0] root 5 2 0 0 0 0 Feb13 ? 00:00:00 [kworker/0:0H] root 7 2 0 0 0 0 Feb13 ? 00:00:02 [migration/0] root 8 2 0 0 0 2 Feb13 ? 00:00:00 [rcu_bh] root 9 2 0 0 0 0 Feb13 ? 00:00:31 [rcu_sched] root 10 2 0 0 0 0 Feb13 ? 00:00:00 [watchdog/0] root 11 2 0 0 0 1 Feb13 ? 00:00:00 [watchdog/1] #各字段意義: UID:運(yùn)行該進(jìn)程的用戶; PID:進(jìn)程號(hào); PPID:父進(jìn)程號(hào); C:CPU使用率; SZ:即VSZ,虛擬內(nèi)存集; RSS:常駐內(nèi)存集; STIME:進(jìn)程的啟動(dòng)日期; TTY:與進(jìn)程相關(guān)的終端設(shè)備; TIME:進(jìn)程累積占用CPU的時(shí)間; CMD:?jiǎn)?dòng)進(jìn)程的命令程序;
③常用組合之三:-efH
以層級(jí)結(jié)構(gòu)顯示進(jìn)程相關(guān)信息:
[root@localhost ~]# ps -efH UID PID PPID C STIME TTY TIME CMD root 2 0 0 Feb13 ? 00:00:00 [kthreadd] root 3 2 0 Feb13 ? 00:00:00 [ksoftirqd/0] root 5 2 0 Feb13 ? 00:00:00 [kworker/0:0H] root 7 2 0 Feb13 ? 00:00:02 [migration/0] root 8 2 0 Feb13 ? 00:00:00 [rcu_bh] root 9 2 0 Feb13 ? 00:00:31 [rcu_sched] root 10 2 0 Feb13 ? 00:00:00 [watchdog/0] root 11 2 0 Feb13 ? 00:00:00 [watchdog/1] root 12 2 0 Feb13 ? 00:00:03 [migration/1] root 13 2 0 Feb13 ? 00:00:03 [ksoftirqd/1] .....(中間省略)..... root 840 1 0 Feb13 ? 00:00:02 /usr/sbin/rsyslogd -n dbus 841 1 0 Feb13 ? 00:00:22 /bin/dbus-daemon --system --address=sys temd: --nofork --nopidfile --s root 854 1 0 Feb13 ? 00:00:00 /usr/sbin/sshd root 13600 854 0 19:42 ? 00:00:01 sshd: root@pts/0 root 13604 13600 0 19:42 pts/0 00:00:00 -bash root 13993 13604 0 21:15 pts/0 00:00:00 ps -efH root 861 1 0 Feb13 ? 00:00:06 /usr/lib/systemd/systemd-logind root 868 1 0 Feb13 ? 00:00:00 /usr/sbin/atd -f root 870 1 0 Feb13 ? 00:00:01 /usr/sbin/crond -n root 884 1 0 Feb13 ? 00:00:00 login -- root root 2571 884 0 Feb13 tty1 00:00:02 -bash .....(以下省略)..... #CMD字段縮進(jìn)級(jí)別相同的進(jìn)程表示為同級(jí)子進(jìn)程;
④常用組合之四:-eo, axo
o選項(xiàng):
o field1,field2,...:自定義要顯示的字段列表,各字段以逗號(hào)分隔; 常見(jiàn)的field有:pid, ppid, ni, pri, rtpri, pcpu, psr, stat, comm(cmd), tty, ... pid:進(jìn)程號(hào); ppid:父進(jìn)程號(hào); ni:nice值; priority:優(yōu)先級(jí); rtpri:實(shí)時(shí)優(yōu)先級(jí); psr:運(yùn)行于哪顆CPU之上; stat:進(jìn)程狀態(tài); cmd:?jiǎn)?dòng)該進(jìn)程的命令程序; tty:與進(jìn)程相關(guān)的終端設(shè)備;
顯示PID及其對(duì)應(yīng)的命令程序:
[root@localhost ~]# ps axo pid,cmd PID CMD 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 2 [kthreadd] 3 [ksoftirqd/0] 5 [kworker/0:0H] 7 [migration/0] .....(以下省略).....
在CentOS 7上顯示初始化程序systemd相關(guān)進(jìn)程的PID,優(yōu)先級(jí)和Nice值:
[root@loaclhost ~]# ps axo cmd,pid,priority,ni | grep systemd /usr/lib/systemd/systemd -- 1 20 0 /usr/lib/systemd/systemd-jo 601 20 0 /usr/lib/systemd/systemd-ud 640 20 0 /usr/lib/systemd/systemd-lo 846 20 0
pgrep, pkill命令:
look up or signal processes based on name and other attributes
根據(jù)名字或其他屬性查看進(jìn)程或向進(jìn)程發(fā)送信號(hào)。
命令格式:
pgrep [options] pattern pkill [options] pattern
常用選項(xiàng):
-u uid:effective user,顯示指定用戶運(yùn)行的進(jìn)程(運(yùn)行過(guò)程中可切換身份);
-U uid:real user,顯示指定用戶啟動(dòng)了哪些進(jìn)程;
-t TERMINAL:顯示與終端相關(guān)的進(jìn)程;
-l:顯示進(jìn)程名;
-a:顯示完整格式的進(jìn)程名;
-P pid:顯示指定進(jìn)程的子進(jìn)程;
用法示例:
顯示進(jìn)程名中包含字符串'ssh'的進(jìn)程:
[root@localhost ~]# pgrep httpd 1982 1983 1984 1985 1986 1987 1988
顯示用戶postfix啟動(dòng)了哪些進(jìn)程:
[root@localhost ~]# pgrep -U postfix 977 14002 #檢驗(yàn): [root@localhost ~]# ps aux | egrep '^USER|977|14002' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND postfix 977 0.0 0.3 91236 3988 ? S Feb13 0:00 qmgr -l -t unix -u postfix 14002 0.0 0.3 91168 3972 ? S 21:21 0:00 pickup -l -t unix -u root 14184 0.0 0.0 112652 968 pts/0 S+ 22:06 0:00 grep -E --color=auto ^USER|977|14002
顯示用戶postfix啟動(dòng)的進(jìn)程的PID和進(jìn)程名:
[root@localhost ~]# pgrep -U postfix -l 977 qmgr 14002 pickup
顯示用戶postfix啟動(dòng)的進(jìn)程的PID和進(jìn)程名(完整格式):
[root@localhost ~]# pgrep -U postfix -a 977 qmgr -l -t unix -u 14002 pickup -l -t unix -u
pidof命令:
find the process ID of a running program.
根據(jù)進(jìn)程名,找出相應(yīng)的PID。
用法示例:
顯示httpd對(duì)應(yīng)的PID:
[root@localhost ~]# pidof httpd 1988 1987 1986 1985 1984 1983 1982
top命令:
display Linux processes
以動(dòng)態(tài)方式查看當(dāng)前系統(tǒng)上的進(jìn)程信息;類(lèi)似于Windows上的任務(wù)管理器;以排序方式顯示,占用某種資源最多的進(jìn)程顯示在最前。
常用命令:
排序: P命令:以占據(jù)CPU百分比排序;(默認(rèn)) M命令:以占據(jù)內(nèi)存百分比顯示; T命令:以累積占用CPU時(shí)間排序; 控制首部字段的開(kāi)啟或關(guān)閉: (1)uptime信息:l命令; (2)tasks及cpu信息:t命令; (3)內(nèi)存信息:m命令; 修改刷新時(shí)間間隔:s命令; 終止指定的進(jìn)程:k命令; 退出top進(jìn)程:q命令;
常用選項(xiàng):
-d #:Delay-time interval,指定刷新時(shí)間間隔;默認(rèn)為3秒;
-b:Batch-mode,以批次方式顯示;
-n #:Number-of-iterations,指定顯示多少批次后退出top進(jìn)程;
用法示例:
動(dòng)態(tài)查看Linux系統(tǒng)上的進(jìn)程信息:
[root@localhost ~]# top top - 22:40:29 up 1 day, 9:33, 2 users, load average: 0.00, 0.01, 0.05 Tasks: 203 total, 2 running, 200 sleeping, 1 stopped, 0 zombie %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 999964 total, 485220 free, 185104 used, 329640 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 598852 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 14293 root 20 0 157708 2284 1556 R 0.3 0.2 0:00.05 top 1 root 20 0 193628 6732 3968 S 0.0 0.7 0:29.74 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.15 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.88 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root rt 0 0 0 0 S 0.0 0.0 0:02.20 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:33.04 rcu_sched 10 root rt 0 0 0 0 S 0.0 0.0 0:00.79 watchdog/0 11 root rt 0 0 0 0 S 0.0 0.0 0:00.84 watchdog/1 12 root rt 0 0 0 0 S 0.0 0.0 0:03.81 migration/1 13 root 20 0 0 0 0 S 0.0 0.0 0:03.32 ksoftirqd/1 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.18 kworker/1:0H 16 root rt 0 0 0 0 S 0.0 
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。