linux進程

查看(顯示)進程 ps
ps 顯示當前目錄下的進程
ps aux :顯示所有進程
ps aux | less (less可以打開文件 | 管道符將第一個命令的輸出當作第二個命令的操作對象)
ps aux | grep 進程名給或者PID碼

bash: 在這裏插入圖片描述

顯示當前只有兩個進程

ps aux |grep test在這裏插入圖片描述
我們發現指令也屬於進程 ,共有兩個進程

現在在代碼中加上 sleep在這裏插入圖片描述

我們發現 加了 sleep 基本不佔空間

內核: 內核管理 cpu 的資源(時間 ,內存)

進程描述 PCB(process control blocks)

linux 進程放在一個 PCB上 ,PCB 實質是一個task_struct 的很大的結構體

1塊cpu 只能給1個進程

PCB 中包含很多信息
1 必須有 PID(進程的唯一標識符)(父進程PPID)
2 內存指針 : 存放數據的地址
3進程狀態:  R(Ready就緒狀態): 進程在就緒隊列中 就處於R狀態
        S  睡眠狀態   :
      D 深度睡眠狀態(密集進行io操作時)eg: coreDump寫遺言時
      T 暫停(ctrl + z 放到後臺,同時進程會暫停)
      t trace 跟蹤
      X 進程已經結束(進程下是看不到的,在源碼中才能看到)
      Z “殭屍進程 ”
殭屍進程的形成:   
  父子進程有關
  什麼是父子進程: 一個進程還可以再創建一個進程,稱爲父子進程。fork()函數創建子進程
  getpid() gitppid();記得sleep(1)再觀察
  獨立進程思維思考::
fork()一次執行,返回兩個值。(突破認知了吧):因爲是兩個進程 ,每個進程完成自己的工作。
  在這裏插入圖片描述
  fork : 創建子進程
  一次調用 ,兩個返回值。
  代碼共享,每個進程數據單獨具有一份空間,採用寫時拷貝

 
我們經常需要fork的執行不同的進程 ;
借用fork()返回值區分,int ret=fork();

if(ret>0) 父進程
else if(ret==0)子進程
else 創建失敗 (ret<0);
失敗的情況 (通過man 手冊 下圖查看 ):1 內存不夠 2 進程太多 等等

父子進程緊接着fork()函數執行,並不是從開一份main() 函數,執行順序取決於操作系統的調度

在這裏插入圖片描述在這裏插入圖片描述
回頭接著看我們的 ” 殭屍進程 “
1 形成 : 父進程結束後 沒有 回收子進程的資源
2 怎麼清除殭屍進程?
1 kill 指令 殺死父進程 (kill 父進程 不太科學,因爲你可能還需要用父進程)
2 進程等待方法(比較科學);
危害 : 內存泄漏
爲什麼kill 掉父進程,殭屍進程就沒了?
因爲kill掉父進程之後,子進程就成了孤兒進程 ,這時候孤兒進程就被1號進程收養,從而釋放資源。
注意 : 孤兒進程並不是殭屍進程,沒有直接關係 !
殭屍進程 處於 Z 狀態 。


進程的調度
並行 : 多個cpu同時各自執行一個進程
併發:一個cpu分別執行很多個進程,可以認爲同時執行很多進程(其實時間特別短,我們感受不到)
調度: 少量的塊數的CPU滿足大量進程同時執行。

組織進程: 雙向鏈表進行組織,每個節點就是一個 task_struct

來看看 下面的代碼,爲了查看它的執行時確實是一個進程 ,我專門寫了一個死循環
接着 ps aux | grep test 查看後臺進程 發現確實有它,我在代碼中加上了sleep(1) ;這樣進程就不會產生該事件佔用CPU 我們童話故事看到 狀態欄顯示爲 S+(sleep狀態) 。因爲 sleep函數不佔用內存

在這裏插入圖片描述

在這裏插入圖片描述在這裏插入圖片描述

屏蔽掉sleep()函數;我們再看看

在這裏插入圖片描述
很明顯! S+ 狀態不在是0.00了 變成了13.3 ,因爲我暫停的緣故這個值比較小(上圖上半截不要考慮,我執行時多執行了一步)

看下邊父子進程的代碼 和執行

在這裏插入圖片描述
注意看代碼 ,我們printf();只打印一個,可一直卻打印兩個PID?爲什麼 。這就是 父子進程的緣故! 那麼 哪個 父進程呢 ? 哪個是子進程? 多打印一個ppid來得到父進程。
注意 比對 ,我們不難發現多了一項PID
在這裏插入圖片描述
看到沒 ,還是兩行打印 ,每行後邊是他的 父進程PID,驗證一下就可以找到父進程了

這時候 殺死 父進程在這裏插入圖片描述
沒了17861吧 (不科學手段哦!)推進使用 進程等待 方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章