更新時間:2021-01-08 來源:黑馬程序員 瀏覽量:
程序是一個沒有生命的實體,它包含許多由程序設計語言編寫的、但未被執(zhí)行的指令,這些指令經(jīng)過編譯和執(zhí)行才能完成指定動作。
程序被執(zhí)行后成為了一個活動的實體,這個實體就是進程。換言之,操作系統(tǒng)調(diào)度并執(zhí)行程序,這個“執(zhí)行中的程序”稱為進程。進程是操作系統(tǒng)進行資源分配和調(diào)度的基本單位。
在Windows操作系統(tǒng)下使用組合鍵Ctrl+Alt+Delete打開任務管理器,單擊任務管理器窗口中的“進程”選項卡查看計算機中所有的進程,如圖1所示。
圖1 任務管理器中的進程
每個應用程序都有一個自己的進程,每個進程都在內(nèi)存中占據(jù)一定空間,一般情況下,進程占據(jù)的內(nèi)存空間由控制塊、程序段和數(shù)據(jù)段三個部分組成,各部分的介紹如下。
(1) 控制塊(Proscessing Control Block,PCB):系統(tǒng)為管理進程專門設置的數(shù)據(jù)結(jié)構,常駐于內(nèi)存中,用于記錄進程的外部特征與進程的運動變化過程??刂茐K是進程存在的唯一標志。
(2) 程序段:用于存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。
(3) 數(shù)據(jù)段:存儲變量和進程執(zhí)行期間產(chǎn)生中間或最終數(shù)據(jù)的一塊內(nèi)存區(qū)域。
隨著外界條件的變化,進程的狀態(tài)會發(fā)生變化。在五態(tài)模型中,進程有新建態(tài)、就緒態(tài)、運行態(tài)、阻塞態(tài)和終止態(tài)這五個狀態(tài),關于這些狀態(tài)的介紹如下:
(1) 新建態(tài)。創(chuàng)建進程,申請一個空白的控制塊,向該控制塊中填寫控制和管理進程的信息,完成資源分配。
(2) 就緒態(tài)。進程具備運行條件,等待系統(tǒng)分配處理器資源以便運行。
(3) 運行態(tài)。進程占用處理器資源正在運行。
(4) 阻塞態(tài)。進程不具備運行條件,正在等待某個事件(如I/O操作或進程同步)的完成,否則無法繼續(xù)運行。
(5) 終止態(tài)。進程因出現(xiàn)錯誤或被系統(tǒng)終止而運行結(jié)束。
除了以上五種狀態(tài)之外,進程還有一個掛起態(tài)。掛起態(tài)是一種主動行為,它是在計算機內(nèi)存資源不足、處理器空閑、用戶主動掛起、系統(tǒng)檢查資源使用情況等條件下將進程暫時調(diào)離出內(nèi)存形成的,在條件允許時可再次被調(diào)回內(nèi)存。與掛起態(tài)相比,阻塞態(tài)是一種被動行為,它是在等待事件或者獲取不到資源而引發(fā)的等待表現(xiàn)。
為了幫助大家理解,下面通過一張圖來描述進程狀態(tài)間的轉(zhuǎn)換關系,具體如圖2所示。
圖2 進程狀態(tài)的切換
圖2中描述的切換過程如下。
無→新建:當程序從存儲設備加載到內(nèi)存中時,進程進入新建態(tài)。
新建→就緒:處于新建態(tài)的進程會被調(diào)度器自動轉(zhuǎn)換為就緒態(tài),獲得了所需的資源,這個過程是非常短暫的。
就緒-→運行:當處于就緒態(tài)的進程獲取CPU后進入運行態(tài),CPU開始執(zhí)行這個進程的命令。
運行→阻塞:當處于運行態(tài)的進程因出現(xiàn)資源不足(I/O或緩沖區(qū)申請失敗等)等事件而終止運行,進入阻塞態(tài)。
阻塞→就緒:當處于阻塞態(tài)的進程獲得了等待的資源后恢復為就緒態(tài)。
阻塞→掛起:當處于阻塞態(tài)的進程遇到諸如處理器空閑、資源不足等情況時而調(diào)離內(nèi)存,進入掛起態(tài)。進程的內(nèi)存數(shù)據(jù)會保存到磁盤中,以釋放空間供其它進程使用。
掛起→就緒: 當處于掛起態(tài)的進程遇到系統(tǒng)資源充足或主動請求激活時,進入就緒態(tài)。
運行→終止:當處于運行態(tài)進程執(zhí)行完成或者被操作系統(tǒng)終止時,它會從內(nèi)存中被移除,變?yōu)椤敖K止”狀態(tài)。
進程具有以下一些特點:
動態(tài)性。進程是程序的一次執(zhí)行過程,它是動態(tài)產(chǎn)生、動態(tài)消亡的。
并發(fā)性。多個進程可并發(fā)執(zhí)行。
獨立性。進程是一個能獨立運行的基本單位,同時也是系統(tǒng)分配資源和調(diào)度的獨立單位。
異步性。進程之間的相互制約使得進程的執(zhí)行具有間斷性,它們按各自獨立的、不可預知的速度向前推進。
猜你喜歡:
numpy array和python list相比有什么優(yōu)勢?