計算機操作系統(七)進程的組成與特性,狀態與轉換
- 前言
- 一、進程的組成
- 1. 什么是“進程”?
- 2. 進程的三個核心組成部分
- 2.1 PCB(進程控制塊)—— 進程的“身份證+戶口本”
- 2.2 程序段—— 進程的“任務清單”
- 2.3 數據段—— 進程的“材料箱”
- 總結
- 二、進程的特征
- 1. 動態性
- 2. 并發性
- 3. 獨立性
- 4. 異步性
- 5. 結構性
- 總結:
- 三、進程的狀態
- 1. 創建態
- 2. 就緒態
- 3. 運行態
- 4. 阻塞態
- 5. 終止態
- 6.狀態轉換圖:
- 總結
- 四、進程的轉換
- 1.創建態 → 就緒態
- 2. 就緒態 → 運行態
- 3. 運行態 → 就緒態
- 4. 運行態 → 阻塞態
- 5. 阻塞態 → 就緒態
- 6. 運行態 → 終止態
- 7. 為什么就緒態不能直接到阻塞態?
- 狀態轉換圖:
- 五、進程的組織--鏈接方式和索引
- 1.PCB的“組織方式”:
- 1.1 鏈表鏈接:給PCB“分組排隊
- 1. 執行態PCB:(唯一)
- 2. 就緒隊列:
- 3. 阻塞隊列:
- 2. 索引方式:給PCB“建花名冊”,快速查找
- 1. 索引表是什么?
- 2. **為什么需要索引?**
- 3. 兩種方式如何配合?
前言
- 前面的博客中,我們探討了計算機操作系統的基本概念。
- 本節將深入解析進程的組成、特性,以及狀態與轉換機制。
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的操作系統博客專欄
https://blog.csdn.net/2402_83322742/category_12916780.html?spm=1001.2014.3001.5482
一、進程的組成
1. 什么是“進程”?
-
先打個比方:你打開電腦上的“計算器”程序,這個程序開始運行的過程,就是一個 “進程”。
-
進程就像一個“正在干活的工人”,而它的組成部分,就是這個工人干活時需要的“工具包”“任務清單”和“材料”。
2. 進程的三個核心組成部分
2.1 PCB(進程控制塊)—— 進程的“身份證+戶口本”
-
是什么?
PCB是操作系統給每個進程單獨創建的一個“小檔案”,里面記錄了這個進程的所有關鍵信息,比如:- 進程的“名字”(PID)、當前狀態(是在運行、暫停還是排隊等著?)
- 它的“優先級”(比如重要的進程優先干活)
- 它占用了哪些“資源”(比如用了多少內存、有沒有占用打印機)
- 下一步該執行哪行代碼(類似書簽,記錄進度)。
-
作用:
操作系統全靠這個“檔案”來管理所有進程,比如決定先讓哪個進程運行、怎么暫停/恢復進程。 -
類比: 就像老師手里的“學生檔案”,記錄了每個學生的學號、成績、座位號,老師靠檔案管理學生。
2.2 程序段—— 進程的“任務清單”
-
是什么?
程序段就是這個進程要執行的“代碼”,也就是程序的邏輯步驟。
比如計算器程序的程序段,里面寫著“如何計算加法”“如何顯示數字”等具體的指令。 -
作用:
告訴計算機“該做什么”,是進程的“靈魂”。不管進程運行多少次,程序段的內容都是固定的(比如計算器的加法邏輯不會自己變)。
類比: 就像工人手里的“操作手冊”,上面寫著“第一步擰螺絲,第二步插電線”等具體步驟。
2.3 數據段—— 進程的“材料箱”
-
是什么?
數據段是進程運行時用到的“臨時數據”,比如:- 計算器輸入的數字(比如你輸入的“1+2”)
- 程序運行中的中間結果(比如計算到一半的數值)
- 臨時存儲的用戶設置(比如計算器的“主題顏色”)。
-
作用:
程序段執行時需要“數據”才能干活,數據段就是存放這些數據的地方。不同進程的數據段是隔離的(比如計算器和微信的數據不會混在一起)。
類比: 就像工人干活時用的“材料箱”,里面裝著螺絲、電線、零件等,用完就清空(進程結束后數據段就沒了)。
總結
- 當你打開“計算器”程序時,操作系統會創建一個 進程。
- 同時生成一個 PCB(記錄這個進程的“身份信息”)。
- 把計算器的“程序代碼”(程序段)加載到內存,告訴計算機“按這個邏輯干活”。
- 開辟一塊內存空間作為 數據段,用來存放你輸入的數字、計算結果等臨時數據。
- 操作系統通過PCB管理這個進程,比如你最小化計算器時,PCB會記錄它的“暫停狀態”,等你恢復時繼續運行。
二、進程的特征
1. 動態性
-
是什么?
進程不是“死的”,而是一個“動態變化的過程”。- 它會“出生”:比如你打開一個軟件(程序運行,創建進程)。
- 會“干活”:在內存里執行代碼、處理數據。
- 會“死亡”:關閉軟件時,進程結束,資源被回收。
- 狀態會變:比如從“運行中”變成“暫停”(你最小化窗口時),再變回“運行”。
-
和程序的區別:
程序是硬盤里的“靜態文件”(比如微信安裝包),而進程是程序“運行起來的實例”(打開的微信窗口就是一個進程)。
類比: 程序像“劇本”(靜態不變),進程像“演員演劇本”(動態表演,有開始和結束)。
2. 并發性
-
是什么?
多個進程可以“同時存在”于內存中,一起運行(雖然CPU同一時間只能執行一個,但操作系統讓它們“輪流快速切換”,看起來像同時進行)。
比如你一邊用微信聊天(微信進程),一邊用瀏覽器看網頁(瀏覽器進程),一邊聽音樂(音樂進程),它們同時在內存里“活著”,只是CPU在它們之間快速切換執行。 -
作用:
讓電腦能“一心多用”,提高效率。
類比: 就像老師同時管多個學生:一會兒給A講題,一會兒給B批改作業,一會兒讓C自己做題。雖然同一時間只處理一個,但快速切換,看起來像同時在做。
3. 獨立性
-
是什么?
每個進程都是“獨立的個體”,有自己的“私人資源”,互不干擾。- 資源隔離:比如微信進程的內存數據、打開的文件,計算器進程絕對碰不到(操作系統保證它們互相隔離)。
- 地位平等:每個進程都是操作系統分配資源的“基本單位”(比如分配內存、網絡權限,都是以進程為單位)。
-
好處:
一個進程崩潰(比如微信卡死),不會影響其他進程(瀏覽器還能正常用)。
類比: 每個進程像“獨立的房間”,房間里的東西(數據、資源)只有自己能用,別人進不來,也不會被別人的房間影響。
4. 異步性
-
是什么?
進程按自己的“節奏”運行,操作系統不確定它們的執行順序,但最終結果正確。- 比如你同時下載文件(下載進程)和寫文檔(文檔進程):
- 下載可能時快時慢(取決于網絡),文檔編輯也隨時可能暫停/繼續。
- 操作系統會根據規則(比如優先級)調度它們,但具體先執行誰、執行多久,進程自己不知道(“異步”就是“不同步”,沒有嚴格的順序)。
- 比如你同時下載文件(下載進程)和寫文檔(文檔進程):
-
為什么沒問題?
操作系統通過PCB記錄每個進程的“進度”(比如執行到哪行代碼),隨時能暫停和恢復,保證最終結果正確。
類比: 像排隊買奶茶,每個人點單、制作的速度不同(有人點復雜的奶茶慢,有人點簡單的快),店員按規則(比如先來后到)處理,雖然順序不確定,但最后每個人都能拿到自己的奶茶。
5. 結構性
-
是什么?
每個進程都必須“標配”三個部分:- PCB(進程控制塊):相當于進程的“身份證”,記錄它的所有信息(狀態、資源、進度等),沒有PCB的話,操作系統根本不知道這個進程存在。
- 程序段:進程要執行的代碼(做事的邏輯)。
- 數據段:進程運行時用的臨時數據(比如你輸入的內容、中間結果)。
-
重點:PCB是進程存在的“唯一標志”!
只要操作系統里有一個進程,就一定有對應的PCB;反之,沒有PCB的東西,就不是進程(比如普通的文件、數據)。
類比: 每個進程像一個“完整的人”,必須有“身份證(PCB)”+“大腦(程序段,指揮做事)”+“身體(數據段,存儲臨時信息)”,缺一不可。
總結:
- 動態性:進程是“活著的、會變的”,有出生、運行、死亡的過程。
- 并發性:多個進程能“同時存在”,一起在電腦里干活(輪流執行)。
- 獨立性:每個進程有自己的“私人資源”,互不干擾、互不侵犯。
- 異步性:進程按自己的節奏運行,順序不確定,但結果正確。
- 結構性:每個進程都必須有“PCB+程序段+數據段”三件套,PCB是它的“身份象征”。
三、進程的狀態
1. 創建態
-
發生了什么?
當你打開一個程序(比如微信),操作系統開始“生”這個進程,分兩步:
① 初始化PCB:給進程辦“臨時身份證”(記錄PID、初始狀態等基本信息),就像老師給新學生登記學號、座位號。
② 分配資源:給進程分“課桌”(內存空間)、“課本”(程序段代碼)、“草稿紙”(數據段臨時存儲區),但還沒讓它“正式上課”(占用CPU)。 -
狀態特點:
進程剛“誕生”,還沒準備好運行,就像學生剛進教室,書包還沒放好,老師還沒讓他開始做題。
2. 就緒態
-
發生了什么?
進程已經“萬事俱備”:PCB辦好,資源(內存、文件等)都拿到了,只差CPU“點名”讓它運行。
就像學生坐在座位上,課本、筆都擺好了,舉手等著老師說:“你來回答問題”(分配CPU時間片)。 -
關鍵:為什么不直接運行?
因為CPU同一時間只能“輔導”一個學生(執行一個進程),其他準備好的進程只能在“就緒隊列”里排隊,等CPU輪到自己。
3. 運行態
-
發生了什么?
CPU選中了這個進程,開始執行它的程序段代碼,處理數據段里的數據。
就像老師叫到某個學生的名字,讓他上臺做題,此時這個學生“獨占”老師的注意力(單核CPU下,同一時間只有一個進程在運行)。 -
兩種情況會“下講臺”:
① 時間片用完:老師說“你先下去,下一個同學來”(CPU分配的時間到了,進程回到就緒態排隊)。
② 主動“請假”:比如進程需要等用戶點擊按鈕(進入阻塞態)。
4. 阻塞態
-
為什么會阻塞?
進程運行時遇到“等事件”的情況,比如:- 等用戶輸入(比如你在微信里還沒打字,進程沒法繼續發消息)。
- 等文件讀取(比如打開一個大文件,還沒讀完數據)。
- 等網絡響應(比如網頁還沒加載完)。
這時進程“卡住了”,無法繼續執行,只能“暫停”,把CPU讓給其他就緒態的進程。
-
狀態特點:
進程就像學生做題時發現“沒草稿紙了”,舉手跟老師說:“我等你拿紙來,現在先不做了”,然后放下筆,坐在座位上干等(不占用CPU,但保留PCB和資源)。
注意:阻塞態和就緒態的區別:就緒態是“能干活但沒輪到”,阻塞態是“想干活但干不了,得等事件發生”。
5. 終止態
-
為什么會終止?
兩種情況:
① 正常結束:進程完成任務(比如你關閉計算器,程序正常退出)。
② 異常終止:進程出錯崩潰(比如微信突然卡死,操作系統強制結束它)。 -
操作系統在終止態做什么?
最重要的事:回收資源!- 歸還內存(把“課桌”讓給其他進程)。
- 關閉打開的文件(把“課本”放回書架)。
- 刪除PCB(注銷“學生檔案”,操作系統不再知道這個進程存在)。
如果不回收,就像學生放學不收拾書包,占著課桌不放,時間長了教室會堆滿垃圾(內存泄漏、資源浪費)。
6.狀態轉換圖:
創建態 → 就緒態(準備好,等CPU)
就緒態 → 運行態(CPU選中,開始干活)
運行態 → 就緒態(時間片用完,回去排隊)
運行態 → 阻塞態(等事件,被迫暫停)
阻塞態 → 就緒態(事件發生了,比如用戶輸入了,重新排隊等CPU)
運行態/阻塞態 → 終止態(干活結束或出錯,放學回家)
總結
- 創建態:進程剛“出生”,正在辦身份證、分資源,還沒準備好上課。
- 就緒態:進程萬事俱備,在“就緒隊列”里舉手等CPU點名。
- 運行態:進程正在CPU上執行,就像學生在老師面前做題。
- 阻塞態:進程遇到“等事件”卡住了,暫時放下活,等事件好了再繼續。
- 終止態:進程下課放學,操作系統回收它的所有資源,從此消失。
四、進程的轉換
1.創建態 → 就緒態
- 條件:系統完成創建進程的所有準備(初始化PCB、分好資源)。
- 類比:你走進奶茶店,店員登記完你的信息(創建態),給你號碼牌(10號),你去等待區坐著(就緒態)。
2. 就緒態 → 運行態
- 條件:CPU“調度”選中這個進程(店員喊:“10號顧客來點單!”)。
- 關鍵:就緒態是“排隊等CPU”,運行態是“正在用CPU”,必須通過“調度”才能轉換(就像必須等店員喊號才能去點單)。
3. 運行態 → 就緒態
- 兩種情況:
① 時間片用完:CPU分配給進程的“時間配額”到了(比如店員說:“你先講到這里,下一位!”),進程回到就緒隊列重新排隊。
② 主動讓步:比如高優先級進程來了,當前進程被迫暫停(比如突然來了VIP顧客,店員讓你稍等,先服務VIP)。 - 類比:你點單時,店員說:“你前面還有更急的顧客,先去后面重新排隊吧!”你回到等待區(就緒態)。
4. 運行態 → 阻塞態
- 條件:進程需要“等待某個事件”(比如等用戶輸入、等文件讀取、等網絡響應)。
- 類比:你點單時發現“忘記帶錢包”,只能對店員說:“我等回家拿錢包再來,現在先不買了”,然后站到旁邊(阻塞態,不占用店員時間)。
5. 阻塞態 → 就緒態
- 條件:等待的事件發生了(比如你拿到錢包、文件讀完了、網絡通了)。
- 類比:你拿到錢包回來,店員給你新的號碼牌(15號),你回到等待區重新排隊(就緒態)。
- 注意:不能直接從阻塞態回到運行態!必須先到就緒態排隊,等CPU再次調度(就像你拿完錢包回來,不能直接插隊,必須重新排隊等喊號)。
6. 運行態 → 終止態
- 兩種情況:
① 正常結束:進程跑完所有代碼(你點完單、付完款、拿到奶茶,離開店鋪)。
② 異常終止:進程遇到錯誤無法修復(比如點單時系統崩潰,店員說:“今天沒法幫你點了,下次再來”)。 - 關鍵:一旦進入終止態,進程“徹底消失”,資源被回收(你的排隊記錄被刪除,座位被其他顧客占用)。
7. 為什么就緒態不能直接到阻塞態?
- 因為阻塞態的前提是“進程正在運行時遇到了等待事件”,就緒態的進程還沒拿到CPU(沒開始點單),根本沒機會“卡住”。
- 類比:你在等待區排隊(就緒態),還沒輪到你點單,怎么會中途因為“沒帶錢包”卡住呢?只有輪到你點單(運行態)時,才可能遇到問題進入阻塞態。
狀態轉換圖:
創建態 → 就緒態(辦手續完畢,開始排隊)
就緒態 → 運行態(被店員喊號,開始點單)
運行態 → 就緒態(時間到/讓步,回去重新排隊)
運行態 → 阻塞態(等事件,暫停點單,站到旁邊)
阻塞態 → 就緒態(事件完成,重新拿號排隊)
運行態 → 終止態(點單結束/出錯,離開店鋪)
五、進程的組織–鏈接方式和索引
- 每個進程都有一個PCB(進程控制塊,相當于“學生檔案”),當電腦運行很多進程時,操作系統需要把這些“檔案”有條理地管起來,不然就會亂成一鍋粥。
- 主要有兩種“管理方法”:鏈表鏈接(按狀態分組排隊)和索引表查找(快速定位某個檔案)。
1.PCB的“組織方式”:
1.1 鏈表鏈接:給PCB“分組排隊
就像學校把學生按“狀態”分成“上課組”“排隊組”“等待組”,每個組用“鏈表”串起來,方便按組管理:
1. 執行態PCB:(唯一)
- 特點:同一時間只有一個進程在運行(單核CPU下),操作系統用一個“指針”直接指向這個PCB(比如老師手里的“當前答題學生”牌子)。
- 類比:全班只有一個學生在黑板上做題,老師一眼就能看到他,不需要排隊。
2. 就緒隊列:
- 結構:所有就緒態的PCB用“指針”連成一個“鏈表”(每個PCB里有一個“下一個就緒PCB”的地址)。
- 作用:操作系統要選下一個運行的進程時,直接從這個隊列里按規則(比如優先級)挑一個,就像老師從“排隊名單”里喊下一個學生。
- 類比:等待區的學生每人手里拿一張紙條,上面寫著“下一個學生的學號”,連成一條“排隊鏈”,老師按順序喊人。
3. 阻塞隊列:
- 特點:阻塞原因不同(比如等磁盤、等網絡),會分成多個阻塞隊列。
- 比如“等待磁盤讀取”的PCB組成一個隊列,“等待用戶輸入”的組成另一個隊列。
- 結構:每個PCB里有一個“阻塞隊列指針”,指向同類型阻塞隊列的下一個PCB。
- 類比:等待取快遞的學生,按“快遞類型”分組(比如等課本的一隊,等零食的一隊),每隊用鏈表連起來,方便快遞到了之后統一通知。
2. 索引方式:給PCB“建花名冊”,快速查找
光有排隊的鏈表還不夠,操作系統需要快速找到某個特定的PCB(比如通過進程ID找對應的檔案),這時候就需要“索引表”:
1. 索引表是什么?
- 相當于一個“花名冊”,按進程ID(PID,類似學號)排序,每個條目記錄“PID”和“對應PCB的地址”。
- 類比:老師手里的班級花名冊,按學號排好,每個學號對應一個學生的座位號,老師喊“學號3號”,馬上就能找到對應的學生。
2. 為什么需要索引?
- 鏈表適合“按組管理”(比如就緒隊列按順序調度),但如果要找“某個特定PID的進程”,鏈表需要從頭開始一個個找,很慢。
- 索引表就像“字典”,可以通過PID直接“查字典”找到PCB的位置,速度飛快(比如查學號3號,直接翻到花名冊第3頁)。
3. 兩種方式如何配合?
舉個例子:你打開了微信(進程A,PID=100)、瀏覽器(進程B,PID=200)、音樂播放器(進程C,PID=300)
-
鏈表分組:
- 假設當前微信在運行(執行態),瀏覽器和音樂播放器在就緒隊列里排隊(鏈表:B→C)。
- 如果瀏覽器需要等網絡加載網頁(進入阻塞態),會被移到“等待網絡”的阻塞隊列,鏈表變成:C(就緒),B(阻塞-網絡隊列)。
-
索引表查找:
- 操作系統維護一個索引表,條目是:
- PID=100 → PCB_A的地址(微信)
- PID=200 → PCB_B的地址(瀏覽器)
- PID=300 → PCB_C的地址(音樂播放器)
- 當你想終止瀏覽器進程時,通過PID=200直接在索引表找到PCB_B,不管它在哪個隊列,都能快速定位并操作。
- 操作系統維護一個索引表,條目是:
以上就是對本次關于操作系統博客內容的總結,后續我們將深入探討操作系統更多知識。
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的操作系統博客專欄
https://blog.csdn.net/2402_83322742/category_12916780.html?spm=1001.2014.3001.5482
非常感謝您的閱讀,喜歡的話記得三連哦 |