進程基礎
1.什麽是進程?
進程是操作系統提供的抽象之一。有了進程的概念之後,CPU才有了並發或者偽並發的可能性。通俗的說來,當你的寫的程序運行起來後,那麽它就是一個進程了。
2.進程,偽並發,並發
首先說說並發,並發指的是在某一個時刻某些事件同時發生。
假設你的電腦只有一個CPU(這裏一個指單核),然而你卻有很多程序要同時運行,即你的電腦上將有很多進程存在,那麽CPU就將提供一種偽並發的能力。具體來說就是運行一個進程,然後切換到下一個進程運行,如此往復。由於切換的速度太快了,並且CPU每次執行每個進程的時間片又很短,所以你幾乎感覺不到這種切換的存在,你認為他們就是同時在執行的。
然而上面的這種並發是虛假的,因為每時每刻CPU上只有一個程序在執行指令。那麽真正的並發是什麽?只要你的CPU是多核的,那麽CPU就能提供真正的並發,CPU能同時運行多個進程,每一個核心對應於一個進程。
3.進程的創建與銷毀
進程的創建的時機
- 系統啟動時
- 某個進程執行了創建進程的系統調用(函數)
- 用戶請求創建一個進程
- 創建一個批處理任務
當系統啟動的時候,會創建一些前臺進程和後臺進程。比如郵箱進程(後臺進程),你幾乎感受不到它的存在。然而當有郵件到來的時候,它卻會通知你。這種後臺進程又被叫做守護進程。
當某個程序要接收海量數據的輸入時,這個程序可能會創建一個新的進程來接收這些數據,然後它向下繼續執行其他的語句。
在交互式的系統中,當你點擊程序圖標運行的時候,也會創建一個新的進程。
最後一個批處理只有在大型主機上會存在。
進程的消亡時機
- 正常退出(自願)
- 異常退出(自願)
- 致命錯誤(非自願)
- 被其它進程終結(非自願)
當一個進程執行完它的所有指令,那麽它就自動退出了
當一個進程遇到了異常,比如說一個c++編譯器遇到了非.cc,.cpp結尾的文件,那麽它也會自動結束運行。
當程序遇到了BUG,比如說內存的非法訪問,分母是0的除法,那麽它就會被操作系統給終結掉。
當別的程序執行了kill函數,那麽對應的某個進程會被終結。
4.進程的狀態及狀態之間的轉換
- 運行態
- 準備態
- 阻塞態
位於運行態及CPU正在執行該進程的指令。位於準備態指的是CPU即將可能要執行該進程, 這取決於操作系統的調度。阻塞態指的是進程被掛起了,暫時無法被CPU調度,於是就暫時失去了運行的可能。
圖中2,3之將的轉換取決與CPU的調度。當進程需要進行IO操作,然而IO的數據還沒有準備好的情況下,進程被阻塞,轉換1發生。當數據已經準備好後,進程由阻塞態轉換成準備態,轉換4發生。
5.進程的具體實現
操作系統為了控制每一個進程,其內部必須有相應的數據結構來存儲每一個進程,這個數據結構被稱作進程表(進程控制塊),通常是一個鏈表。同時每一個進程也是一個數據結構,其內部保存著程序計數器,棧指針,內存分配情況,打開文件的狀態等等的信息。當CPU切換進程的時候,必須要保留被換掉的進程中相應的信息同時也要恢復新進程中相關的信息。
進程數據結構通常包含的域
6.進程之間的繼承結構
一個進程可以創建多個子進程,這些子進程每個又可以創建多個子進程,最終所有的進程會形成一個樹狀結構。
參考資料----《現代操作系統》
進程基礎