(一 ) 程序的併發
(1) 順序執行和併發執行
程序有兩種執行方式:① 順序執行 ② 併發執行
順序執行:單道批處理的執行方式,也用於簡單的單片機系統,具有獨立功能的程序獨佔cpu直到得到最終結果的過程
併發執行:現在的操作系統基本爲併發執行,其引入目的是爲了提高系統資源利用率
A:單道程序順序執行的特點:
- 順序性:嚴格程序結構規定的次序執行
- 封閉性:佔據了全部資源,最終結果由初始條件決定,不受外界影響
- 可再現性:初始條件一致則結果一致,與執行速度無關
B:多道程序執行的特點
- 獨立性:邏輯上獨立
- 隨機性:輸入與程序開始時間是隨機的
- 資源共享性:硬件和軟件資源共享
(2) 程序併發
A:基本概念
基本概念:一組邏輯上相互獨立的程序或者程序段在執行時間上客觀上互相重疊
說白了,就是一個程序或者說程序段還沒執行結束,另一個程序或者程序段就開始了
它也是爲了增強計算機的處理能力和提供資源的利用率所設計的一種同時操作技術
B:優缺點
優點:提高資源利用率
缺點:
必然導致資源共享和競爭,從而改變程序的執行速度,同時也會失去原有的時序關係
-
如果併發程序不按照特定的規則和方法進行資源共享和競爭,則其執行結果將不可避免失去封閉性和可再現性
- 失去封閉性:資源被共享了,可能會受到其他程序控制邏輯的影響,例如一個程序寫到存儲器中的數據可能被另一個程序修改
失去可再現性:受到其他的因素干擾,初始條件一致,結果可能不一致
(3) 引入進程的概念
A:出現的問題
上面提到了併發的概念,但是如果隨意的執行併發,不做任何約束,將會有大量的錯誤結果產生,同時上面也提到了,不同的執行順序,得到的結果也是不同的,也就是不再具有封閉性和結果的可再現性
這是爲什麼呢? 這是因爲公共變量進行了共享引起的
B:如何解決問題
所以爲了獲取可再現性,我們需要增加一點約束條件,也就是把他現在存在的問題解決掉即:滿足封閉性和可再現性
怎麼做呢,首先我們需要消去共享資源(例如公共變量)帶來的影響
在這裏假定兩個程序,A 和 B ,我們需要保證滿足一些條件
程序 A 的讀變量集與程序 B 的寫變量集,不能存在交集
反之,程序 A 的寫變量集與程序 B 的讀變量集,也不能存在交集
程序 A 和 程序 B 的寫變量集,更加不能存在交集(兩者讀沒有關係,因爲沒有什麼破壞)
C:引入進程
上面雖然提出了三點要求,但是這幾個點卻並不好檢查出來,這是因爲程序未運行,誰也不知道併發的情況是如何的,資源是如何被爭奪的等等,所以說這個時候,“程序” 這個靜態概念已經不能很確切的反映程序活動的特徵了,所以,“進程” 這個動態的概念就出現了,用來描述系統以及用戶的程序活動
(二) 進程的概述
(1) 什麼是進程 ?
- 一個被調入內存正在執行的程序
- 一個具有獨立功能的程序對某個數據集在CPU處理器上的執行過程
- 獨立分配資源的基本單位
簡單的理解:進程是程序的一次執行活動,它描述了程序動態執行的過程
(2) 進程和程序的區別
進程 | 程序 |
---|---|
動態 | 靜態 |
併發性 | 沒有併發性 |
競爭系統資源的基本單位 | 不具有資源的競爭性 |
不同進程可以包含同一個程序,該程序對應的數據集不同 | 可以有多個進程 |
(3) 進程和作業的區別
進程 | 作業 |
---|---|
具有獨立功能的程序對某個數據集在CPU處理器上的執行過程 | 用戶需要計算機完成某項任務時要求計算機所做工作的集合 |
執行任務的執行實體 | 用戶向計算機提交任務的任務實體 |
(兩者關係) | 一個作業可以由多個進程組成 |
做了一幅圖,方便大家理解
(4) 進程的特點
動態性: 進程對應程序的執行
- 進程產生:創建 --> 運行 --> 消亡
- 進程在其生命週期內,在內存三種基本狀態(就緒、運行、阻塞)之間轉換,必要時還可能被掛起到外存
獨立性:各進程的地址空間相互獨立,除非採用進程間通信手段
併發性:任何進程都可以同其他進程一起向前推進
異步性:每個進程都以其相對獨立的不可預知的速度向前推進
結構化:進程 = 代碼段 + 數據段 + PCB(進程控制塊)
(三) 進程控制塊(PCB)
上面在進程的特點中提到了 進程 = 代碼段 + 數據段 + PCB(進程控制塊),下面就順着介紹一個進程控制塊這個內容
(1) 基本介紹
① 進程控制塊,用來記錄進程相關信息和管理進程而設置的,並且是由 OS 維護的一個特定的數據結構
- 包含了進程的描述信息、控制信息、資源信息以及現場保護區(下面講)
② PCB 是進程動態特性的集中反映
- 系統通過 PCB 感知進程的存在,通過 PCB 中所包含的各項變量的變化,掌握進程的狀態以達到控制進程活動的目的
③ PCB 結構的全部或部分常駐內存
④ PCB 隨進程的創建而填寫,隨進程的撤消而釋放
⑤ 系統利用 PCB 來控制和管理進程,所以 PCB 是系統感知進程存在的唯一標誌
⑥ 進程與 PCB 是一一對應的
(2) 包含的內容
A:描述信息
進程標識號,唯一,通常是一個整數
進程名,通常基於可執行文件名
用戶名或用戶標識號
進程組關係
B:進程控制信息
進程當前狀態:初始態、就緒態、執行態、等待狀態、終止狀態
-
進程優先級:進程優先級是選取進程佔有處理機的重要依據:
- 佔有CPU時間
- 進程優先級偏移
- 佔據內存時間等
程序開始地址
各種計時信息
通信信息
C:資源管理信息
佔用內存大小及其管理用數據結構指針
在某些複雜系統中,還有對換或覆蓋用的有關信息,如對換程序段長度,對換外存地址等
共享程序段大小及起始地址。
輸入輸出設備的設備號,所要傳送的數據長度、緩衝區地址、緩衝區長度及所用設備的有關數據結構指針等。
指向文件系統的指針及有關標識等
D:CPU 現場保護結構
- 存儲退出執行時的進程現場數據(或稱進程上下文)
- 寄存器值(通用、程序計數器 PC、狀態 PSW,地址包括棧指針)
(四) 進程上下文
在上面的介紹中,又引申出了進程上下文這樣的概念
進程上下文是對進程執行活動全過程的靜態描述
進程上下文由進程的用戶地址空間內容、硬件寄存器內容及與該進程相關的核心數據結構組成(正文段、
數據集、堆棧)
(五) 進程的狀態
提前聲明:在這部分,通常情況我們一般理解五個常用狀態,新建、就緒、運行、等待、終止,就可以了,但是我們首先會講講比較關鍵的三種狀態,此外,更細緻的來說,這五種狀態還不算特別精確,不過我們這裏不考慮太多
(1) 進程的三種基本狀態
A:就緒態
一個進程已經具備了運行的條件,但是暫時還沒有CPU調度,所以不能運行的狀態
- CPU 調度的時候,馬上就可以運行
B:執行態
進程佔有了包括CPU在內的全部資源,並且在CPU上運行
C:等待態
叫法挺多,可以叫做阻塞態、掛起態、封鎖態、凍結態、睡眠態
它指的是進程因爲等待某件事情的發生而暫時不能運行的狀態
- 也就是說,即使CPU空閒,但是這個進程也不能運行
(2) 三狀態轉換及原因
首先放一張圖,來看一下對於三個狀態的描述
我們按着圖示的序號來分析一下
① 就緒 --> 運行
- 調度程序選擇一個新的進程運行,也就是CPU調用了一個已經準備好的進程(就緒態),然後就進入了運行態
② 運行 --> 就緒
- 第一種原因是,運行中的進程用完了時間片
- 第二種原因是,優先級更高的進程處於就緒狀態,所以當前運行進程被迫中斷
③ 運行 --> 阻塞
-
當一個進程等待某一件事情發生的時候,例如:
請求系統服務
沒有新的工作可以做
等待某一進程提供輸入(IPC)
初始化 I/O 且必須等待結果
而這些狀態之間的互相轉換,也存在一定的聯繫和影響,例如:
-
②(運行 --> 就緒)發生,則 ①(就緒 --> 運行)必然發生
- 也就是說,當一個進程從運行轉到就緒狀態後,CPU 自然空閒了,如果就緒狀態下仍然有別的進程,那麼這個進程就會被 CPU 調用,同樣呢,如果就緒狀態下沒有別的進程了,那麼這個剛從運行轉到就緒狀態的進程就會馬上被 CPU 重新調用
-
③(運行 --> 阻塞)發生,則 ①(就緒 --> 運行)必然發生
- 當運行中的某個進程,進入阻塞狀態後,那麼 CPU 同樣也空閒了下來,所以,就會調用已經在就緒狀態的進程,即執行 ① 的操作
CPU 空閒且無就緒進程的時候,④(阻塞 --> 運行)發生則會引起 ①(運行 --> 阻塞)
(3) 進程的五種狀態(基於前三種補充)
剛纔前面講解的三種狀態,是一個比較基本的狀態,但是還是不完整的,還欠缺創建以及終止狀態
A:創建狀態
創建狀態:即創建一個新的進程
- 批處理環境中,選擇一個新作業即將進去內存執行
- 交互環境中,新用戶登錄到系統
- 操作系統因提供一項服務而創建
B:終止狀態
終止狀態:一個進程結束
- 含一個終止指令或用於終止的OS顯示服務調用
- 分時系統中,用戶的行爲可指示終止(比如退出)
- PC 機環境中,用戶結束一應用程序
- 出現某些錯誤的時候,例如,I/O失敗,無效指令等
- 父進程可請求它的某個子進程終止
- 父進程終止,OS自動終止後代進程
(六) 進程控制
(1) 基本概念
系統使用一些具有特定功能的程序段來創建、撤銷進程並完成進程各狀態間的轉換,從而達到
- 多進程高效率併發執行和協調
- 實現資源共享
(2) 原語
定義:在系統模式下執行的某些特定功能的程序段
作用:通常把進程控制用的程序段作成原語
分類:
- 機器指令級的
- 功能級的
特點:作爲原語的程序段不允許併發
進程控制原語有:
- 創建原語
- 撤銷原語
- 阻塞原語
- 喚醒原語
A:創建
B:撤銷
C:阻塞
D:喚醒
(七) 線程
(1) 爲什麼引入線程的概念
實施進程的創建、刪除和切換過程中時空代價大,限制了系統中的進程數目和併發活動的程度。
所以現代操作系統中,進程作爲資源的擁有者,調度和運行的屬性賦予新的實體——線程
進程模型在處理“基於同數據區的同時多請求”時的效率侷限性,例:售票系統:數據庫服務器軟件需同時處理來自多個用戶進程的讀盤請求,這些請求都是針對同一個盤,可以有如下幾種方式:
進程:一個進程來順序處理
多個相互獨立的進程:每個進程負責處理一個請求
用一個進程來併發處理所有請求(讀盤時要阻塞,處理下一個請求)
分析:第一種方法沒有併發,第二種方法切換的代價比較大。對於這種在一個進程內還可以有更多的子任務併發執行的情況,採用第三種方法效率更高,這就是採用了線程
(2) 線程和進程的區別
進程 | 線程 |
---|---|
程序獨立資源分配的基本單位 | CPU執行的基本單位 |
獨立地址空間 | 共享同一地址空間與進程共享資源 |
調度開銷較大 | 調度開銷較小 |
下面是 copy 的一份解釋,僅供參考
線程是在進程內用於調度和佔有處理機的基本單位,它由線程控制表、存儲線程上下文的用戶棧以及核心棧組成。線程可分爲用戶級線程、核心級線程以及用戶/核心混合型線程等類型。其中用戶級線程在用戶態下執行,CPU調度算法和各線程優先級都由用戶設置,與操作系統內核無關。核心級線程的調度算法及線程優先級的控制權在操作系統內核。混合型線程的控制權則在用戶和操作系統內核二者。線程與進程的主要區別有:
(1) 進程是資源管理的基本單位,它擁有自己的地址空間和各種資源,例如內存空間、外部設備等;線程只是處理機調度的基本單位,它只和其他線程一起共享進程資源,但自己沒有任何資源。
(2) 以進程爲單位進行處理機切換和調度時,由於涉及到資源轉移以及現場保護等問題,將導致處理機切換時間變長,資源利用率降低。以線程爲單位進行處理機切換和調度時,由於不發生資源變化,特別是地址空間的變化,處理機切換的時間較短,從而處理機效率也較高。
(3) 對用戶來說,多線程可減少用戶的等待時間。提高系統的響應速度。例如,當一個進程需要對兩個不同的服務器進行遠程過程凋用時,對於無線程系統的操作系統來說需要順序等待兩個不同調用返回結果後才能繼續執行,且在等待中容易發生進程調度。對於多線程系統而言,則可以在同一進程中使用不同的線程同時進行遠程過程調用,從而縮短進程的等待時間。
(4) 線程和進程一樣,都有自己的狀態.也有相應的同步機制,不過,由於線程沒有單獨的數據和程序空間,因此,線程不能像進程的數據與程序那樣,交換到外存存儲空間。從而線程沒有掛起狀態。
(5) 進程的調度、同步等控制大多由操作系統內核完成,而線程的控制既可以由操作系統內核進行,也可以由用戶控制進行。
(3) 線程的特點
減小併發執行的時間和空間開銷(線程的創建、退出和調度),因此允許在系統中建立更多的線程來提高併發程度
線程的創建、終止時間比進程短;
同進程內的線程切換時間比進程短(上下文有許多是相同的)
由於同進程內線程間共享進程的代碼、數據、內存和文件資源,可直接進行不通過內核的通信;而進程間的通信需要通過內核進行,以提供保護和通信所需機制
一個進程的所有線程必須同時處於掛起狀態;進程的終止會導致所有線程的終止。
線程不適宜任務單一的、很少做進程調度和切換的實時系統、個人數字助理系統,最適宜多處理機系統
典型的應用環境舉例如下:
- 服務器中的文件管理或通信控制或客戶服務器方式的服務器程序
- 前後臺處理。如表處理程序,用戶輸入命令和命令執行;
- 異步處理:一個程序中可以併發的程序段,使用不同的線程
(八) 結尾
如果文章中有什麼不足,歡迎大家留言交流,感謝朋友們的支持!
如果能幫到你的話,那就來關注我吧!如果您更喜歡微信文章的閱讀方式,可以關注我的公衆號
在這裏的我們素不相識,卻都在爲了自己的夢而努力 ❤
一個堅持推送原創開發技術文章的公衆號:理想二旬不止