目錄
檢視程序的指令
1. ps
2. pstree
3. top
4. netstat
程序的狀态
線程的狀态(java)
孤兒程序
僵屍程序
檢視程序的指令
1. ps
檢視某個時間點的程序資訊
示例一:檢視自己的程序
# ps -l
示例二:檢視系統所有程序
# ps aux
示例三:檢視特定的程序
# ps aux | grep threadx
2. pstree
檢視程序樹
示例:檢視所有程序樹
# pstree -A
3. top
實時顯示程序資訊
示例:兩秒鐘重新整理一次
# top -d 2
4. netstat
檢視占用端口的程序
示例:檢視特定端口的程序
# netstat -anp | grep port
程序的狀态
- 運作态:該程序正在執行。
- 就緒态:程序已經做好了準備,隻要有機會就開始執行。
- 阻塞态(等待态):程序在某些事情發生前不能執行,等待阻塞程序的事件完成。
- 建立态:剛剛建立的程序,作業系統還沒有把它加入到可執行程序組中,通常是程序控制塊已經建立但是還沒有加載到記憶體中的程序。
- 退出态:作業系統從可執行程序組中釋放出的程序,或由于自身或某種原因停止運作。
線程的狀态(java)
建立态:新建立了一個線程對象。
就緒态:線程對象建立後,其他線程(比如main線程)調用了該對象的start()方法。該狀态的線程位于可運作線程池中,等待被線程排程選中,擷取cpu 的使用權 。
可運作态:可運作狀态(runnable)的線程獲得了cpu 時間片(timeslice) ,執行程式代碼。
阻塞态:阻塞狀态是指線程因為某種原因放棄了cpu 使用權,也即讓出了cpu timeslice,暫時停止運作。直到線程進入可運作(runnable)狀态,才有機會再次獲得cpu timeslice 轉到運作(running)狀态。阻塞的情況分三種:
- 等待阻塞:運作(running)的線程執行o.wait()方法,JVM會把該線程放入等待隊列(waitting queue)中。
- 同步阻塞:運作(running)的線程在擷取對象的同步鎖時,若該同步鎖被别的線程占用,則JVM會把該線程放入鎖池(lock pool)中。
- 其他阻塞:運作(running)的線程執行Thread.sleep(long ms)或t.join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀态。當sleep()狀态逾時、join()等待線程終止或者逾時、或者I/O處理完畢時,線程重新轉入可運作(runnable)狀态。
死亡:線程run()、main() 方法執行結束,或者因異常退出了run()方法,則該線程結束生命周期。死亡的線程不可再次複生。
孤兒程序
一個父程序退出,而它的一個或多個子程序還在運作,那麼這些子程序将成為孤兒程序。
孤兒程序将被 init 程序(程序号為 1)所收養,并由 init 程序對它們完成狀态收集工作。
由于孤兒程序會被 init 程序收養,是以孤兒程序不會對系統造成危害。
僵屍程序
一個子程序的程序描述符在子程序退出時不會釋放,隻有當父程序通過 wait() 或 waitpid() 擷取了子程序資訊後才會釋放。如果子程序退出,而父程序并沒有調用 wait() 或 waitpid(),那麼子程序的程序描述符仍然儲存在系統中,這種程序稱之為僵屍程序。
僵屍程序通過 ps 指令顯示出來的狀态為 Z(zombie)。
系統所能使用的程序号是有限的,如果産生大量僵屍程序,将因為沒有可用的程序号而導緻系統不能産生新的程序。
要消滅系統中大量的僵屍程序,隻需要将其父程序殺死,此時僵屍程序就會變成孤兒程序,進而被 init 程序所收養,這樣 init 程序就會釋放所有的僵屍程序所占有的資源,進而結束僵屍程序。