天天看點

計算機作業系統--linux程序管理檢視程序的指令程序的狀态線程的狀态(java)

目錄

檢視程序的指令

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 程序就會釋放所有的僵屍程序所占有的資源,進而結束僵屍程序。

繼續閱讀