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