進程概念
- 內核
- 進程
- 進程狀態
- 內存泄漏
- 進程調度。
- Linux真實調度算法
- 環境變量
內核
狹義上的操作系統指的是 內核就是進程管理進程調度,文件系統等等。
廣義上的操作系統其實在外殼指令這些。封裝了系統調用的東西。
進程
課本概念程序的一個基本實例
內核觀點,承擔分配資源的實體。
我們可以理解為所謂進程就是PCB+加載到內存的代碼和數據。
管理就得先描述再組織。Linux下的PCB就是task_struct。
我們可以通過指令ps axj|head -1
ls /proc (內存級的文件系統)
cwd -> cwd 表示進程的 ?當前工作目錄
exe -> 表示進程執行的 ?可執行文件路徑,即進程是通過哪個二進制文件啟動的
bash就是一個死循環的進程
fork()創建子進程,如何理解fork調用一次返回兩次
一個函數通常在執行到return語句之前,函數的工作基本完成了。
我們認為在fork函數內部執行到return之前,我們已經創建了子進程。父子進程同時return
進程狀態
進程狀態實際就是task struct中的一個整數。
有運行阻塞掛起。
運行就是進程鏈入到運行隊列
阻塞就是進程鏈入到阻塞隊列中
理解Linux內核鏈表的話題,
Linux的PCB,封裝一個雙向鏈表的結構體。
封裝了一個previous指針和一個next指針。
PCB中可以存在多個這樣的結構體
第一個head我們放在這個調度隊列中,第二個放在在等待隊列中,第三個再放入其他。
這樣就可以將一個進程鏈入到不同的數據結構當中。可能有的人會想,我們就可以用offset函數計算出偏移量
如何管理硬件?管理硬件先描述再組織,就是我們有個struct device的。結構體里面封裝了這個。ID標識符,然后status表示狀態,然后task struck wait_queen,
如果說進程所就緒的,所需要的資源未就緒,我們就把它列入到特定硬件的阻塞隊列中,如果如果硬件那個硬件就去了,我們就在那再鏈回到運行隊列中。
事實上我們察覺不了,其實是內存中的代碼和數據掛回到磁盤中但是我們保留它PCB的結構體
掛起就是掛到外設或者說將他放到運行隊列的末端。
運行在在unix,Linux下表現的就是偶爾加或者說r狀態二加是前臺,r是后臺。
S就是阻塞狀態,然后也就可中斷睡眠,淺睡眠。就是然后操作系統可以自自主的殺死這個進程。
具體狀態
R(后臺)和R+(前臺)運行
S(阻塞) 可中斷休眠(操作系統可自主殺死該進程)
t(暫停) debug下
T(暫停) Ctrl+Z
這個是Linux下的特有的狀態,這個只是一種操作系統止損的行為。這個進程是不是真要殺死?但操作系統只是懷疑這個進程有問題,所以就暫停住他。
D就是不可中斷狀態。因為如果說我們進行大量的這個寫入,但是如果說進程被殺死,用戶無法得知,那數據就會直接丟失,為此我們需要一個不可被擊殺的狀態,但其實這個狀態是很少見的。只要做存儲和IO的人才知道
Z狀態就是僵尸狀態,僵尸進程這個東西是非常重要的,如果我們不對僵尸進程進行處理的話,那就會造成這個內存泄露,父進程不管僵尸進程就會一直維護導致內存泄漏。
內存泄漏
常駐內存的進程(死循環)才會有內存泄漏
如果子進程退出之前,父進程先現在死亡了,那么子進程就會托管給父進程?
進程調度。
我們要理解到首先我們談兩個概念,優先級和權限。優先級是指先后順序,權限是能否得到我們只有在具有訪問的權限的情況下才能談優先級的概念。
我來講一下nice值,值越低,優先級越高。但其實nice值是有一定范圍的即優先級有一定范圍,否則會導致進程饑餓,
并發是多個進程。單哥CPU快速切換,也就是分時系統。
并行就是多個進程。多個CPU。
進程會調度。
哪怕該進程是死循環也會調度
保存:將寄存器中的內容保存到當前進程的PCB當中
恢復上下文:當前進程的PCB當中的內容恢復到寄存器當中
我要要意識到空間一份,內容多份!!!
Linux真實調度算法
nr_active表明多少個進程
bitmap[5],0到99實時優先級不考慮,100-139分時我們要考慮的優先級。通過位圖我們就能O(1)地得出當前優先級下隊列是否有進程
queue哈希桶,哈希函數X-60+(140-40)。
X是進程優先級,進程優先級范圍是[60,99]
當前進程執行完之后,并不是直接列入到當前隊列的最末端因為這樣的話一個優先級高的死循環進程,我們永遠無法到達到下一優先級隊列當中。因此我們將它列入到過期隊列當中。隨著時間的發展活躍隊列的進程越來越少,過期隊列的進程越來越多。最后當活躍隊列的進程為零時,我們將活躍隊列和過期隊列的指針交換(O(1))。又得到了一個充滿進程的活躍隊列和一個空的過期隊列。
環境變量
命令行參數:實現不同程序子功能的方法
int main(int argc,char* argv[])
環境變量從哪來?
配置文件里來
.bash_profile
.bashrc(在這里面添加PATH)
su USER變
su - 重新登入
環境變量Key=Value的形式
PWD(當前路徑)
OLDPWD(上次路徑)