線程|進程|程序比較總結(全網最細)

寫在前面:

我在複習過程中整理的系列文章,全部免費分享給大家,適合保研和考研還有平常複習,需要的請移步我的個人原創gong主號:程序員寶藏,回覆關鍵字:複試上岸,即可獲取!

CSDN的排版功能有點弱。。。。想看有紅黑重點標註且排版美觀的這系列文章(包括計算機專業基礎的所有主幹知識總結和拓展),可以去我的原創gong主號:程序員寶藏(我承認這是推廣,但號如其名,誠不欺你)往期文章查看!不細你來找我要紅包!
在這裏插入圖片描述

如果覺得對你有幫助,點個贊鼓勵一下我,嘿嘿!

在這裏插入圖片描述

正文開始:

1.程序、進程、線程簡述

程序的基本概念

程序是含有指令和數據的文件,被存儲在磁盤或其他的數據存儲設備中,也就是說程序是靜態的代碼。

進程的基本概念

在多道程序環境下,允許多個程序併發執行,此時它們將失去封閉性,並具有間斷性及不可再現性的特徵。爲此引入了進程(Process) 的概念,以便更好地描述和控制程序的併發執行,實現操作系統的併發性和共享性(最基本的兩個特性)。

爲了使參與併發執行的程序(含數據)能獨立地運行,必須爲之配置一個專門的數據結構,稱爲進程控制塊(Process Control Block, PCB) 。系統利用PCB 來描述進程的基本情況和運行狀態,進而控制和管理進程。

相應地,由程序段、相關數據段和PCB三部分構成了進程映像(進程實體)。所謂創建進程,實質上是創建進程映像中的PCB; 而撤銷進程,實質上是撤銷進程的PCB 。值得注意的是,進程映像是靜態的,進程則是動態的。

從不同的角度,進程可以有不同的定義,比較典型的定義有:

  1. 進程是程序的一次執行過程。
  2. 進程是一個程序及其數據在處理機上順序執行時所發生的活動。
  3. 進程是具有獨立功能的程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單位。

引入進程實體的概念後,我們可以把傳統操作系統中的進程定義爲: “進程是進程實體的運行過程是系統進行資源分配和調度的一個獨立單位。(還沒引入線程)”

【注意】:要準確理解這裏說的系統資源。它指處理機、存儲器和其他設備服務於某個進程的”時間”,例如把處理機資源理解爲處理機的時間片纔是準確的。因爲進程是這些資源分配和調度的獨立單位(還沒引入線程),即“時間片”分配的獨立單位,這就決定了進程一定是一個動態的、過程性的概念。

在這裏插入圖片描述

線程的基本概念

引入進程的目的是爲了更好地使多道程序併發執行,提高資源利用率和系統吞吐量;而引入線程的目的則是爲了減小程序在併發執行時所付出的時空開銷,提高操作系統的併發性能。

線程最直接的理解就是“輕量級進程”,它是一個基本的CPU執行單元,也是程序執行流的最小單元,由線程ID 、程序計數器、寄存器集合和堆棧組成。線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的全部資源。一個線程可以創建和撤銷另一個線程,同一進程中的多個線程之間可以併發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。

2.程序和進程

【拓展問題1】:爲什麼要引入進程?
答:在多道程序同時運行的背景下,進程之間需要共享系統資源,因此會導致各程序在執行過程中出現相互制約的關係,程序的執行會表現出間斷性的特徵。這些特徵都是在程序的執行過程中發生的,是動態的過程,而傳統的程序本身是一組指令的集合,是一個靜態的概念,無法描述程序在內存中的執行情況,即我們無法從程序的字面上看出它何時執行、何時停頓,也無法看出它與其他執行程序的關係,因此,程序這個靜態概念已不能如實反映程序併發執行過程的特徵。爲了深刻描述程序動態執行過程的性質乃至更好地支持和管理多道程序的併發執行,人們引入了進程的概念。

【拓展問題2】:進程是如何解決問題的?
答:進程把能夠識別程序運行態的一些變量存放在PCB中,通過這些變量系統能夠更好地瞭解進程的狀況,並在適當時進行進程的切換,以避免一些資源的浪費,甚至劃分爲更小的調度單位線程來提高系統的併發度。

程序和進程的比較
  1. 程序是永存的(除非刪除);進程是暫時的,是程序在數據集上的一次執行,有創建有撤銷,存在是暫時的;
  2. 程序是靜態的觀念,進程是動態的觀念;
  3. 進程具有併發性,而程序沒有;
  4. 進程是競爭計算機資源的基本單位,程序不是。
  5. 進程和程序不是一一對應的: 一個程序可對應多個進程即多個進程可執行同一程序; 一個進程可以執行一個或幾個程序。

3.進程和線程

【拓展問題3】:爲什麼要引入線程?
答:進程存在着很多缺陷,主要集中在兩點:
(1)進程只能在同一時間幹一件事情,如果想同時幹兩件事或多件事情,進程就無能爲力了。
(2)進程在執行的過程中如果由於某種原因阻塞了,例如等待輸入,整個進程就會掛起,其他與輸入無關的工作也必須等待輸入結束後才能順序執行。
爲了解決上述兩點缺陷,引入了線程這個概念。

線程與進程的比較
  1. 調度。在傳統的操作系統中,擁有資源和獨立調度的基本單位都是進程。在引入線程的操作系統中,線程是獨立調度的基本單位,進程是擁有資源的基本單位。在同一進程中,線程的切換不會引起進程切換。在不同進程中進行線程切換,如從一個進程內的線程切換到另一個進程中的線程時,會引起進程切換。
  2. 擁有資源。不論是傳統操作系統還是設有線程的操作系統,進程都是擁有資源的基本單位,而線程不擁有系統資源(也有一點兒必不可少的資源),但線程可以訪問其隸屬進程的系統資源。要知道,若線程也是擁有資源的單位,則切換線程就需要較大的時空開銷,線程這個概念的提出就沒有意義。
  3. 併發性。在引入線程的操作系統中,不僅進程之間可以併發執行,而且多個線程之間也可以併發執行,從而使操作系統具有更好的併發性,提高了系統的吞吐量。
  4. 系統開銷。由於創建或撤銷進程時,系統都要爲之分配或回收資源,如內存空間、I/0 設備等,因此操作系統所付出的開銷遠大於創建或撤銷線程時的開銷。類似地,在進行進程切換時,涉及當前執行進程CPU 環境的保存及新調度到進程CPU 環境的設置,而線程切換時只需保存和設置少量寄存器內容,開銷很小。此外,由於同一進程內的多個線程共享進程的地址空間,因此這些線程之間的同步與通信非常容易實現,甚至無須操作系統的干預。
  5. 地址空間和其他資源(如打開的文件)。進程的地址空間之間互相獨立,同一進程的各線程間共享進程的資源,某進程內的線程對於其他進程不可見。
  6. 通信方面。進程間通信(IPC) 需要進程同步和互斥手段的輔助,以保證數據的一致性,而線程間可以直接讀/寫進程數據段(如全局變量)來進行通信。

【爲什麼線程的提出有利於提高系統併發性?】可以這樣來理解:由於有了線程,線程切換時,有可能會發生進程切換,也有可能不發生進程切換,平均而言每次切換所需的開銷就變小了,因此能夠讓更多的線程參與併發,而不會影響到響應時間等問題。

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