目錄
前言
4.進程狀態
一.普遍的操作系統層面上宏觀概念:
二.具體的Linux操作系統的狀態:
5.進程優先級(了解)
6.其他概念
進程切換
前言
? 本篇是接著上一篇的內容繼續往下了解進程相關的一些概念!
4.進程狀態
運行 新建 就緒 掛起 阻塞 等待 停止 掛機 死亡......
[^] ?進程這么多狀態本質都是用來滿足不同的運行場景的?
一.普遍的操作系統層面上宏觀概念:
1.一個cpu對應一個運行隊列
2.讓進程入隊列本質就是將該進程的task_struct結構體對象放入運行隊列中
3.狀態是進程內部的屬性,存于描述進程的task_struct中(在該進程對應的PCB中存放),這個狀態可以理解成整數表示(比如:1表示運行狀態,2表示停止狀態......),這個整數是幾就意味著這個進程的狀態是幾
4.運行狀態:進程PCB在運行隊列中就是運行狀態,不是說這個進程正在運行才是運行狀態
5.阻塞狀態:進程并不是只會等待(占用)cpu資源,也可能隨時隨地需要外設資源,所以我們的所有外都設有一個wait隊列,當這個進程需要外設資源但這個外設正在工作時,cpu就把這個進程對應的task_struct對象放到這個外設的隊列中同時把這個進程的狀態修改為阻塞狀態(都是對task_struct對象進行放到不同的隊列中)
當這個外設空閑下來了,就通知操作系統將這個進程PCB從阻塞隊列拉出來改為運行狀態,然后放入cpu運行隊列中
6.所謂的進程不同的狀態,本質是進程在不同的隊列當中等待某種資源(比如:進程等待外設時稱其為阻塞狀態)
7.掛起狀態:
阻塞不一定掛起,掛起一定阻塞
總結:上面解釋了什么叫做運行,什么叫做阻塞,什么叫做掛起
二.具體的Linux操作系統的狀態:
通過查看進程指令:ps ajx | grep 進程名來查看狀態
1.S表示淺度睡眠,可以被終止,是阻塞狀態的一種,一般如果進程要使用外設的情況下基本狀態都會是S
比如:如果代碼中有printf要訪問顯示器,這個進程在默認情況下大概率是S
D表示深度睡眠(面試不重要,但對于我們理解Linux比較重要)
在該狀態下的進程,無法被操作系統殺掉終止,只能通過斷電或者進程自己醒來才能結束該狀態
(在高IO的情況下才有可能看到D狀態的進程)
2.R表示運行狀態
當在運行狀態時,使用命令:kill -19 進程id,進程會進入暫停狀態
3.T表示暫停,暫停也算是阻塞狀態的一種
使用指令:kill -18 進程id,進程會從暫停回到運行狀態
[^] ?(注意R后面的+號不見了)?
關于后面的+號:
在后面有+號時,當我們在shell命令下使用其他命令進程還是在跑并且無法對指令做出回應(shell命令行無法獲取命令行解析了),只有按ctrl+c才能終止,我們把這種進程叫做前臺進程
在后面沒有+號后,我們在shell命令下使用指令會有回應(可以獲取命令行解析),但是此時在命令行按ctrl+c也無法結束進程,進程始終在跑,我們把這種進程叫做后臺進程
4.在Linux下,因為用戶不需要知道進程是否在掛起狀態,因為這是操作系統內部做管理自己把它交換到磁盤上,和用戶其實沒關系也對用戶而言沒啥意義,所以Linux下看不到掛起的狀態
5.t狀態:表示的是當前進程正在被追蹤時的暫停,也是一種阻塞狀態
比如在gdb調試進程時打上斷點運行后,該進程就處于t狀態
6.Z狀態:進程退出時,不能立即釋放該進程對應的資源,需要保存一段時間,讓父進程或者操作系統來進行讀取,進程退出了,但是沒有被回收,此時我們把這個進程叫做僵尸進程,Z狀態(僵尸狀態) !僵尸狀態是一種需要解決的問題,不回收僵尸進程會造成內存泄漏,我們之后才能解決
我們這里通過創建子進程,讓父進程不要退出并且什么都不做,讓子進程正常退出,來讓此時這個子進程變成僵尸狀態
此時我們把子進程終止了,但父進程還在,子進程此時就是僵尸狀態
子進程的名字也改為[myprocess] <defunct> (adj.失效的,不再存在的,n.死者,死人)
Linux下各狀態變化圖:
除此之外還有一種特殊的進程:
孤兒進程:父進程先退出,此時該子進程被操作系統領養(1號進程)
1.這種現象一定存在
2.如果操作系統不領養,那么子進程退出的時候,對應的僵尸進程便無人可以進行回收了
3.如果是由前臺進程創建的子進程,如果孤兒了,就會自動變成后臺進程
5.進程優先級(了解)
1.什么叫做優先級?
權限和優先級的區別:
權限是能做還是不能做的問題
優先級則是能做,但是先做還是后做的問題
2.為什么會存在優先級?
答:因為資源太少了
3.Linux優先級特點(很快)
a.優先級本質就是pcb里面的一個整數數字(也可能是幾個)
b.最終優先級=老的優先級(linux下為80) + nice(Linux支持進程運行中進行優先級的調整,通過更改nice值完成調整)
[^] ?nice值默認為0,PRI為優先級,越小優先級越高?
使用top命令更改nice
進入top后按r,輸入進程id,再輸入更改的nice值 nice范圍[-20,19]
那么優先級的范圍: [60,99]
6.其他概念
進程切換
cpu工作:1.取指令 2.分析指令 3.執行指令
1.當我們程序在運行的時候,一定會產生非常多的臨時數據,這些數據屬于當前進程,cpu內部雖然只有一套寄存器硬件,但是寄存器里面保存的數據是屬于當前進程的(在任何時刻,cpu里面的寄存器里面的數據看起來是在寄存器上,但實際上是只屬于當前運行的進程的,寄存器被所有進程共享,寄存器內的數據是每個進程各自私有的——上下文數據)
寄存器硬件 != 寄存器內的數據
2.進程在運行的時候占有cpu,但進程不是一直占有cpu直到該進程結束,因為進程在運行的時候都有自己的時間片
3.時間片結束后該進程不占有cpu時,需要先保留該進程在cpu內的在寄存器中存儲的數據(注意不是寄存器),這個操作為上下文保護;下一個進程的時間片開始,下個進程開始占有cpu時,要先恢復在寄存器中存儲的數據,該操作為上下文恢復;完成以上操作就記為一次進程切換
進程在切換的時要進行進程的上下文保護
進程在恢復運行時要進行上下文的恢復