基礎知識普及:操作系統中的進程與線程!

 

操作系統是管理計算機硬件和軟件資源的計算機程序,它管理計算機的內存分配,決定資源供需關係、控制輸入輸出設備以及提供用戶和系統交互的操作界面

簡單的概括一下,操作系統就是一個管理硬件、提供用戶交互的軟件系統

 

二. 操作系統的歷程

1. 無操作系統時代:人工操作、cup等待人工操作、資源利用率低

2. 批處理系統時代:cpu無需等待人工操作、批量輸入任務、資源利用率提升、多道程序設計

3. 分時系統時代:多用戶共享、可調試程序、資源利用率大幅提升

 

三. 操作系統的基本功能

1. 對計算機資源的管理,如處理器資源的管理、IO設備的管理、存儲器資源的管理

2. 實現了對計算機資源的抽象

3. 提供了用戶與計算機之間的接口:如圖形界面、shell終端等

 

四. 操作系統的相關概念

多道程序設計

概述:多道程序設計是指在計算機內存中同時存放多個程序,而這些個程序在操作系統的管理之下,相互交替運行,對多道程序的管理是操作系統的重要功能

意義:早期的批處理系統雖然可以批量輸入任務,但一次只能處理一個任務,多道程序設計的出現使得批處理系統可以一次處理多個任務,大大的提高了資源的利用率

 

1. 併發性

概述:併發性分爲並行和併發兩種情況

並行:是指兩個或多個事件可以在同一時刻發生

併發:是指兩個或多個事件可以在同一時間間隔發生

 

2. 共享性

概述:共享性表現爲操作系統中的資源可供多個併發的程序共同使用,這種共同使用的形式稱之爲資源共享

 

3. 虛擬性

概述:把一個物理實體轉換爲若干個邏輯實體,物理實體是真實存在的,而邏輯實體是虛擬的,這種虛擬化的技術 又分爲時分複用技術空分複用技術

時分複用技術:資源在時間上進行復用,不同程序併發使用,例如:

虛擬處理器技術:就是藉助多道程序技術爲每個程序建立進程,多個進程之間分時的使用處理器

虛擬設備技術:物理設備虛擬爲多個邏輯設備,每個程序佔用一個邏輯設備,多個設備通過邏輯 設備併發訪問

空分複用技術:用來實現虛擬磁盤、虛擬內存等

虛擬磁盤:一塊物理磁盤虛擬爲邏輯磁盤,如C、D、E等邏輯磁盤,這樣每個磁盤使用起來相對 獨立、互不影響更加安全和方便

虛擬內存:在邏輯上擴大程序的存儲容量,這樣我們就可以使用比實際內存更大的容量,內存在 計算機的作用是無可替代的,所有的程序都需要加載到內存中才能執行,如果執行的 程序過大或者過多,就會導致內存不足。爲了防止這樣的情況,就有了虛擬內存的誕 生,在Windows系統中,使用一部分硬盤空間來充當內存使用,這部分空間即稱爲虛 擬內存

 

4. 異步性

概述:在多道程序的設計之下,允許多個程序併發執行,但因進程在使用資源時需要等待或者放棄,所以進程的執行並不是連續的,而是以斷斷續續的方式進行的

例如:有三個程序A、B、C它們在交替的運行,並使用同一資源,目前是A正在使用資源,假設A使用完畢 後釋放了該資源,B、C開始同時競爭這一資源,而我們不知道誰最後競爭到了這一資源,這時進程 就是在以不可預知的形式在向前推進,我們不知道程序何時執行、何時暫停、何時完成,最後就導致 了程序的異步性

進程和程序的區別:1. 程序是靜止的而進程是動態的

2. 程序是永久存在的。進程是程序在數據集上的一次執行,是暫時的

3. 程序和進程並非是一 一對應的。一個進程肯定有與之對應的程序而且只有一個, 一個程序 可能沒有與之對應的進程(這是因爲程序還有被運行),也有可能有多個進程與之對應,這是 因爲一個程序運行在不同的數據集上就構成了不同的進程

 

五. 進程與線程

1. 進程

概述:進程是系統進行資源分配和調度的基本單位,並作爲程序獨立運行的載體保證程序正常運行,使得操作系統的資源利用率大大提升

 

2. 進程的實體

概述:我們用主存(內存分爲主存(DRAM)和Cache(SRAM))中的進程形態來描述進程的實體,在主存中進程是一段連續存儲的空間,這個空間我們稱爲進程控制塊(PCB)

進程控制塊:1. PCB是用來描述和控制進程運行的通用數據結構

2. 記錄進程當前狀態和控制進程運行的全部信息

3. PCB是進程能夠獨立運行的基本單位

4. PCB是常在內存中的,它會被存放在內存中專門的PCB區域內,這是因爲操作系統進行調度作業時 經常會訪問到PCB

在控制塊中存放着進程的一些重要信息,如:標識符、狀態、優先級、程序計數器、內存指針、上下文數據、IO狀態信息、記賬信息等

下面我們對這些重要的信息做一個詳細的描述:

標識符:一個進程唯一的標記,用來區別於其他進程

狀態:說明進程當前的運行狀態

優先級:進程執行的優先次序

程序計數器: 記錄進程即將被執行的下一條指令的地址

內存指針:記錄的是程序代碼和進程數據相關的地址

上下文數據:記錄的是進程執行時處理器存儲的數據

IO狀態信息:被進程IO操作所佔用的文件列表

記賬信息:進程所使用的處理器時間等

 

3. 進程的類型

1)前臺進程:是指用戶可以在終端和進程相互交互的進程

2)後臺進程:是指沒有佔用終端的進程,後臺進程不需要和用戶交互,在Linux系統中用 “&” 結尾的命令運行的 進程可以在後臺運行

3)守護進程:是指在系統啓動時啓動,並且在系統關閉時結束的進程

 

4. 進程的標記

進程ID:進程ID是進程的唯一標記,每個進程擁有不同的ID。

ID爲0的進程稱爲idle進程,是系統創建的第一個進程,idle進程的運行時間其實就是指系統的空閒時間 ID爲1的進程稱爲init進程,它是0號進程的子進程,負責完成系統的初始化工作,並且init進程是所有用 戶的起始進程

進程狀態:以下的狀態符號具體是體現在Linux系統中的

5. 進程狀態模型

概述:進程的狀態模型分爲五種,分別是創建、就緒、阻塞、執行和終止

下面我們就來詳細的說明一下這五大狀態:

創建狀態:進程分配到了PCB但其他資源尚未準備就緒時稱爲創建狀態

就緒狀態:當進程被分配到除CPU以外的所有必要資源後,此時的進程狀態就稱爲就緒狀態

阻塞狀態:進程因爲某種原因如:IO操作,不能立刻執行而放棄CPU使用權的狀態稱爲阻塞狀態

執行狀態:當進程處在就緒狀態並獲得CPU的使用權後,就可以執行了,此時的狀態就稱爲執行狀態(在單核CPU中只能有一個進程是處在執行狀態的)

終止狀態: 進程執行完成由系統回收資源後的狀態稱爲終止狀態

 

6. 進程間的同步

1)進程同步

概述: 在多道程序設計下,多進程之間需要共同完成一項任務時,需要相互制約、互相合作、互相等待,使得各進程按一定的速度執行的過程稱爲進程間的同步。

 

2) 臨界資源

概述:臨界資源指的某些資源雖作爲共享資源卻無法同時被多個進程同時使用的資源,如:打印機

 

3)我們爲什麼需要進程間的同步?

在討論這個問題之前,我們先來看一個經典的問題:哲學家進餐問題

有五個哲學家,他們的生活方式是交替地進行思考和進餐,哲學家們共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五支筷子,平時哲學家進行思考,飢餓時便試圖取其左、右最靠近他的筷子,只有在他拿到兩支筷子時才能進餐,該哲學家進餐完畢後,放下左右兩隻筷子又繼續思考。

限制的條件

(1)只有拿到兩隻筷子時,哲學家才能喫飯。

(2)如果筷子已被別人拿走,則必須等別人喫完之後才能拿到筷子。

(3)任一哲學家在自己未拿到兩隻筷子喫完飯前,不會放下手中已經拿到的筷子

我們描述一下哲學家們進餐的流程:

其中一個哲學家拿起左邊的筷子,然後準備去拿右邊的筷子,但發現右邊的筷子已經被拿走了,他只能等待右邊的筷子放回原位才能就餐,這時他不會放下左邊的筷子,直到他拿到右邊的筷子並就餐之後纔會把筷子放回原位,這樣看起來好像沒什麼問題。

現在我們來討論一種極端的情況:

這五個科學家同時拿起左手邊的筷子,並在拿到右手邊的筷子之前,不會放下已經拿到的左手邊的筷子,而他們必須要有左右兩隻筷子纔可以就餐,那麼最終的結果是怎樣的?我想大家都已經猜到了!

產生這種極端情況的根本原因是:哲學家之間沒有進行相互的溝通

我們把這個問題引入到進程當中,就可以解釋了我們爲什麼需要 進程之間的同步,它幫助我們解決了在多個併發執行的進程之間如何對臨界資源進行有效協調的問題

 

4)進程間同步的原則

  1. 空閒讓進:當臨界資源沒有被佔用時,這時可以允許一個進程使用該臨界資源
  2. 忙則等待:當臨界資源正在被某進程佔用時,其他的進程必須等待該臨界資源被釋放纔可以使用
  3. 有限等待: 對等待訪問的進程,應保證在有限的時間內能訪問到臨界資源
  4. 讓權等待:當進程暫時不能訪問到所需要的臨界資源時,應主動的釋放CPU資源

5) 進程間同步的方法

  1. 消息隊列
  2. 共享存儲
  3. 信號量

 

7. 進程調度

1)概述:是指計算機通過某種決策決定哪個就緒程序可以獲得CPU的使用權,它會保留原來進程的運行信息,然後選擇新的進程並分配給它CPU的使用權

 

2)調度機制:(1)就緒隊列的排隊機制:就緒進程按照一定的方式進行排隊,以便調度程序可以快速的找到就緒進 程

(2)選擇運行進程的委派機制 :調度程序按照相應的策略選擇就緒進程,並分配給它CPU使用權

(3)進程的上下文切換機制:保存當前進程的上下文環境到內存中,並把要執行的進程的上下文環境 加載到CPU中

問題:若當前的進程沒有執行完,操作系統就執行進程的調度,那當前的進程會如何呢?

答:我們先要了解一下在操作系統中進程的調度可以分爲兩類:搶佔式調度非搶佔式調度

搶佔式調度:操作系統允許調度程序以某種策略暫停當前正在運行的進程,把CPU資源分給其他的就緒進程

非搶佔式調度:調度程序不會以任何形式搶佔已經被某進程佔用的CPU資源而分給其他的就緒進程,直到該進 程執行完畢或者遇到IO阻塞

對比搶佔式調度非搶佔式調度的系統開銷大、但相對公平可以每個就緒進程都能得到運行、適用於大部 分的場景

 

3)調度算法:(1)先來先服務調度算法:是指按照就緒隊列中就緒進程的先後順序進行調度

(2)短進程優先調度算法:是指調度程序優先選擇運行時間可能最短的就緒進程,但如果就緒隊 列中有需要運行時間比較長的就緒進程,那麼這種算法對它是不友好的

(3)高優先權優先調度算法:是指調度程序優先選擇權重比較高的就緒進程進行處理,這種算法 的好處是可以及時的處理一些比較緊急的任務,如:前臺進程就要比後臺進程的權重要高, 這是因爲前臺進程是需要和用戶交互的進程

(4)時間片輪轉調度算法:這是比較公平的算法,它是指按照先來先服務的原則給就緒隊列中的每 個進程分配相同的運行時間來運行,之後不管當前正在運行的進程有沒有執行完, 它都會把 CPU資源分配給下一個就緒進程,但它並不能保證對用戶能夠及時的響應

 

8. 死鎖現象

1)概述:死鎖是指兩個或兩個以上的進程因爲競爭資源或因爲彼此之間通信時調度的順序不當而造成的阻塞現象

2)產生的必要條件:(1)互斥條件 :是指一個進程對某資源的使用是排他性的,除非這個進程主動釋放資源否 則其他的進程想使用此資源只能等待

(2)請求保持條件: 在互斥的條件之下,這個進程又請求了一個新的資源,恰好這個資源 已經被佔用,這時此進程請求不到想要的資源但也不會釋放已經佔有 的資源,這就是請求保持條件

(3)不可剝奪條件: 進程正在使用的資源在未完成之前不能被強制剝奪,只能由自身釋放

(4)環路等待條件:發生死鎖現象時,必會存在進程與資源形成的等待環形鏈

3)避免死鎖的方法:(1)系統規定進程運行之前,一次性申請好所有所需的資源,這樣我們就破壞了死鎖產生 必要條件的第(2)條:請求保持條件

(2)當一個進程請求新的資源而得不到時,那麼它必須釋放已經佔有的資源,這樣我們就 破壞了必要條件中的第(3)條:不可剝奪條件

(3)把資源按照線性排序,規定進程申請資源時只能按照所需的資源順序來申請,這樣就 破壞了第(4)條:環路等待條件

 

9. 線程

概述:1)線程是操作系統進行運行調度的最小單位。

2)操作系統對進程的調度實際上就是對進程裏面線程的調度,它包含在進程當中,是進程中實際運行工作 的單位。

3)一個進程裏面可以併發多個線程,每個線程執行不同的任務。

4)一個進程中的多個線程是共享進程資源的。

問題:線程之間需要同步嗎?

答:同一個進程內的多個線程之間,因爲也是存在競爭共享資源的問題,所以也是需要線程同步機制的

線程間同步的方法:

1)互斥量

2)讀寫鎖

3)自旋鎖

4)條件變量

 

10. 進程與線程對比

(1)獲取更多優質內容及精彩資訊,可前往:https://www.cda.cn/?seo

(2)瞭解更多數據領域的優質課程:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章