進程線程聯繫與區別


在這裏插入圖片描述

進程和線程的區別簡介?

進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程。

  1. 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.

  2. 線程的劃分尺度小於進程,使得多線程程序的併發性高。

  3. 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

  4. 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

  1. 從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

線程與進程總結:

一、進程簡介

1.1 進程概念的引入

計算機中,CPU是最寶貴的資源,爲了提高CPU的利用率,引入了多道程序設計的概念。當內存中多個程序存在時,如果不對人們熟悉的“程序”的概念加以擴充,就無法刻畫多個程序共同運行時系統呈現出的特徵。

  • 多道程序設計:是指允許多個作業(程序)同時進入計算機系統的內存並啓動交替計算的方法。

  • 也就是說,內存中多個相互獨立的程序均處於開始和結束之間。

  • 從宏觀上看是並行的,多道程序都處於運行過程中,但尚未運行結束;

  • 從微觀角度上看是串行的,各道程序輪流的佔用CPU交替的執行。

  • 引入多道程序設計技術可以提高CPU的利用率,充分發揮計算機硬部件的並行性。

多道程序系統中,程序具有:並行、制約以及動態的特徵。程序概念難以便是和反映系統中的情況,所以引入了進程這一概念。

1.2 程序是什麼

說起進程,就不得不說下程序。先看定義:程序是指令和數據的有序集合,其本身沒有任何運行的含義,是一個靜態的概念。系統實際上是出於不斷變化的狀態中,程序不能反映這種動態性。

而進程則是在處理機上的一次執行過程,它是一個動態的概念。這個不難理解,其實進程是包含程序的,進程的執行離不開程序,進程中的文本區域就是代碼區,也就是程序。

1.3 進程是什麼

1.3.1 進程的概念
進程的定義: 進程是據有獨立功能的程序在某個數據集合上的一次運行活動,也是操作系統進行資源分配和保護的基本單位。

在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。

從原理角度上看:進程是支持程序執行的一種系統機制,它對處理器上運行程序的活動規律進行抽象。

從實現角度看:進程是一種數據結構,用來準確的刻畫運行程序的狀態和系統動態變化狀況。

簡單的來講進程的概念主要有兩點

  1. 進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。
  2. 進程是一個 “執行中的程序”。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成爲一個活動的實體,我們稱其爲進程。

1.3.2 進程的類型

  • 系統進程:操作系統用來管理資源的進程,當系統進程處於運行態時,CPU處於管態,系統之間的關係由操作系統負責。

  • 用戶進程:操作系統可以獨立執行的的用戶程序段,當用戶進程處於運行態時,CPU處於目態,用戶進程之間的關係由用戶負責。

1.3.3 進程控制塊
進程的三個組成部分

  • a. 程序

  • b. 數據

  • c. 進程控制塊(PCB):爲了管理和控制進程,系統在創建每個進程時,都爲其開闢一個專用的存儲區,用以記錄它在系統中的動態特性。系統根據存儲區的信息對進程實施控制管理。進程任務完成後,系統收回該存儲區,進程隨之消亡,這一存儲區就是進程控制塊

PCB隨着進程的創建而建立,撤銷而消亡。系統根據PCB感知一個進程的存在,PCB是進程存在的唯一物理標識(這一點可以類比作業控制塊JCB)

進程控制塊的內容
PCB在不同的語言中,可能用不同的數據結構表示。爲了系統管理和控制進程方便,系統常常將所有進程的PCB存放在內存中系統表格區,並按照進程內部標號由小到大順序存放。

整個系統中各進程的的PCB集合可用數組表示。這時進程內部標號可以與數組元素下標聯繫。

各系統預留的PCB空間往往是固定的,如UNIX系統中規定進程數量不超過50個.

操作系統不同,PCB的格式、大小及內容也不盡相同。一般的,應該包含如下四個信息

  • a. 標識信息:進程名

  • b. 說明信息:進程狀態、程序存放位置

  • c. 現場信息:通用寄存器內存、控制寄存器內存、斷點地址

  • d. 管理信息:進程優先數、隊列指針

1.3.4 進程的重要特徵

  1. 動態特徵:進程對應於程序的運行,動態產生、消亡,在其生命週期中進程也是動態的、

  2. 併發特徵:任何進程都可以同其他進程一起向前推進

  3. 獨立特徵:進程是相對完整的調度單位,可以獲得CPU,參與併發執行

  4. 交往特徵:一個進程在執行過程中可與其他進程產生直接或間接關係

  5. 異步特徵:每個進程都以相對獨立、不可預知的速度向前推進

  6. 結構特徵:每個進程都有一個PCB作爲他的數據結構

進程最基本的特徵是併發和共享特徵

1.3.5 進程的狀態與轉換
進程的三種基本狀態

  • 運行狀態:獲得CPU的進程處於此狀態,對應的程序在CPU上運行着

  • 阻塞狀態:爲了等待某個外部事件的發生(如等待I/O操作的完成,等待另一個進程發來消息),暫時無法運行。也成爲等待狀態

  • 就緒狀態:具備了一切運行需要的條件,由於其他進程佔用CPU而暫時無法運行

進程狀態之間的轉換
在這裏插入圖片描述
a. 運行狀態 ===> 阻塞狀態:例如正在運行的進程提出I/O請求,由運行狀態轉化爲阻塞狀態

b. 阻塞狀態 ===> 就緒狀態:例如I/O操作完成之後,由阻塞狀態轉化爲就緒狀態

c. 就緒狀態 ===> 運行狀態:例如就緒狀態的進程被進程調度程序選中,分配到CPU中運行,由就緒狀態轉化爲運行狀態

d. 運行狀態 ===> 就緒狀態:處於運行狀態的進程的時間片用完,不得不讓出CPU,由運行狀態轉化爲就緒狀態

1.4 進程與程序的區別

A.進程是一個動態的概念

進程是程序的一次執行過程,是動態概念

程序是一組有序的指令和數據集和,是靜態概念

B.進程有自己的生命週期

當操作系統要完成某個任務時,它會創建一個進程。當進程完成任務之後,系統就會撤銷這個進程,收回它所佔用的資源。從創建到撤銷的時間段就是進程的生命週期。而程序可以作爲一種軟件資料永久保存。

C.進程之間存在併發性

併發是指兩個或多個事件在同一時間間隔內發生。在多道程序環境下,併發性是指在一段時間宏觀上有多個程序在同時運行,但在單處理機系統中,每一時刻卻僅能只有一道程序在執行,故微觀上這些程序只能時分時交替執行。

進程是一個動態的概念,是一個可以獨立運行的單位。在一個系統中,同時會存在多個進程。他們輪流佔用CPU和各種資源。

D.進程與程序之間無一一對應關係

不同的進程可以包含同一程序,同一程序在執行中也可以產生多個進程。

不同的進程可以執行同一個程序
區分進程的條件:所執行的程序和數據集合。

兩個進程即使執行在相同的程序上,只要他們運行在不同的數據集合上,他們也是兩個進程。

一個進程可以執行多個程序
比如Word,它可以同時進行打字、拼寫檢查、打印等事情。打開word是一個進程,而編寫word則執行了多個程序。(不知道是否恰當)

E.進程間存在着相互制約

進程是系統中資源分配和運行調度的單位,在對資源的共享和競爭中,必然相互制約,影響各自向前推進的速度。

F.程序是記錄在介質上指令的有序集合,而進程則由程序、數據和進程控制塊(Process Control Block, PCB)3部分組成

G. 進程可以創建子進程,程序不能創建子程序

一個用戶進程在運行過程中可以創建一個或多個子進程爲其服務。當一個進程創建另一個進程時,生成進程稱爲父進程,被生成進程稱爲子進程,父進程還可以創建多個子進程,從而形成樹狀族系關係。

二、線程簡介

在這裏插入圖片描述

2.1 線程概念的引入

如果說操作系統中引入進程的目的是爲了使多個程序併發執行,以便改善資源利用率和提高系統效率,那麼,在進程之後再引入線程概念則是爲了減少程序併發執行時所付出的時空開銷,使得併發粒度更細、併發性更好。解決問題的基本思路是:把進程的兩項功能“獨立分配資源”和“被調度分配執行”分離開來,前一項任務仍然由進程完成,作爲系統資源分配和保護的獨立單位,無須頻繁切換;後一項任務交給稱作線程的實體來完成,線程作爲系統調度和分配的基本單位,會被頻繁的調度和切換。在這種思想的指導下產生了多線程的概念,及多線程(結構)進程。

2.2線程是什麼

2.2.1 線程的概念
線程,有時被稱爲輕量進程(Lightweight Process,LWP),是程序執行流的最小單元。是被系統獨立調度和分派的基本單位。

是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。線程有就緒、阻塞和運行三種基本狀態。

一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。就緒狀態是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機;運行狀態是指線程佔有處理機正在運行;阻塞狀態是指線程在等待一個事件(如某個信號量),邏輯上不可執行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。

進程可以簡單的理解爲一個可以獨立運行的程序單位。它是線程的集合,進程就是有一個或多個線程構成的,每一個線程都是進程中的一條執行路徑。

2.2.2 線程的重要特徵

  1. 線程是輕量級的進程

  2. 線程沒有獨立的地址空間(內存空間)

  3. 線程是由進程創建的(寄生在進程)

  4. 一個進程可以擁有多個線程–>這就是我們常說的多線程編程

  5. 獨立調度和分配的基本單位
    在多線程OS中,線程是能獨立運行的基本單位,因而也是獨立調度和分派的基本單位。由於線程很“輕”,故線程的切換非常迅速且開銷小(在同一進程中的)。

  6. 可併發執行
    在一個進程中的多個線程之間,可以併發執行,甚至允許在一個進程中所有線程都能併發執行;同樣,不同進程中的線程也能併發執行,充分利用和發揮了處理機與外圍設備並行工作的能力。

  7. 共享進程資源
    在同一進程中的各個線程,都可以共享該進程所擁有的資源,這首先表現在:所有線程都具有相同的地址空間(進程的地址空間),這意味着,線程可以訪問該地址空間的每一個虛地址;此外,還可以訪問進程所擁有的已打開文件、定時器、信號量機構等。由於同一個進程內的線程共享內存和文件,所以線程之間互相通信不必調用內核。

  8. 線程是一種輕型實體
    線程中的實體基本上不擁有系統資源,只是有一點必不可少的、能保證獨立運行的資源。

線程的實體包括程序、數據和TCB。線程是動態概念,它的動態特性由線程控制塊TCB(Thread Control Block)描述。TCB包括以下信息:

(1)線程狀態。

(2)當線程不運行時,被保存的現場資源。

(3)一組執行堆棧。

(4)存放每個線程的局部變量主存區。

(5)訪問同一個進程中的主存和其它資源。

用於指示被執行指令序列的程序計數器、保留局部變量、少數狀態參數和返回地址等的一組寄存器和堆棧。

2.2.3線程的狀態
線程的狀態有:運行態、就緒態、阻塞態、終止態。線程的狀態轉換與進程類似。

三、進程與線程的聯繫

多線程環境中進程可定義爲操作系統中除處理器以外的資源分配和保護的基本單位,它有一個獨立的虛擬地址空間,用來容納進程映像,並以進程爲單位對各種資源,如文件、I/O設備等資源實施保護。

線程是進程中能夠併發執行的實體,是進程的組成部分,也是處理器調度和分派的基本單位。

允許進程包含多個線程,這些線程共享進程所獲得的內存空間和資源,可以爲完成某一項任務而協同工作。

進程可以分爲兩部分:資源集合和線程集合。進程要支撐線程運行,爲線程提供虛擬地址空間和各種資源。

進程封裝了管理信息,包括對指令代碼、全局數據、打開的文件和信號量等共享部分的管理。

線程封裝了執行信息,包括狀態信息、寄存器、執行棧(用戶棧指針與核心棧指針)和局部變量、過程調用參數、返回值等私有部分的管理。

由於線程具有傳統進程的許多特徵,所以也把線程稱爲輕量進程。

從一定意義上講,進程就是一個應用程序在處理機上的一次執行過程,它是一個動態的概念,而線程是進程中的一部分,進程包含多個線程在運行。
程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成爲一個活動的實體,我們稱其爲進程。
通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。在引入線程的操作系統中,通常都是把進程作爲分配資源的基本單位,而把線程作爲獨立運行和獨立調度的基本單位。由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間併發執行的程度。

四、進程與線程的區別

進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程。

1.調度 :從上面的定義可以看出一個是調度和分派的基本單位,一個是擁有資源的基本單位

2.共享地址空間,資源:進程擁有各自獨立的地址空間,資源,所以共享複雜,需要用IPC,同步簡單; 線程共享所屬進程的資源,共享簡單,但同步複雜,要通過加鎖等措施。

3.佔用內存,cpu: 進程佔用內存多,切換複雜,CPU利用率低; 線程佔用內存少,切換簡單,CPU利用率高。

4.相互影響: 進程間不會相互影響; 一個線程掛掉會導致整個進程掛掉。

一個程序至少有一個進程, 一個進程至少有一個線程。
線程的劃分尺度小於進程,使得多線程程序的併發性高。
進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器爲其執行上下文
多線程主要是爲了節約CPU時間,發揮利用,根據具體情況而定。線程的運行中需要使用計算機的內存資源和CPU。
進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統資源,
只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。

補充協程

協程是一種用戶態的輕量級線程,協程的調度完全由用戶控制。協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操作棧則基本沒有內核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快。
協程在子程序內部可中斷的,然後轉而執行別的子程序,在適當的時候再返回來接着執行。協程不是被操作系統內核所管理,而完全是由程序所控制(也就是在用戶態執行)。這樣帶來的好處就是性能得到了很大的提升,不會像線程切換那樣消耗資源。
在這裏插入圖片描述

協程的應用

有哪些編程語言應用到了協程呢?我們舉幾個栗子:

Lua語言

Lua從5.0版本開始使用協程,通過擴展庫coroutine來實現。

Python語言

正如剛纔所寫的代碼示例,python可以通過 yield/send 的方式實現協程。在python 3.5以後, async/await 成爲了更好的替代方案。

Go語言

Go語言對協程的實現非常強大而簡潔,可以輕鬆創建成百上千個協程併發執行。

Java語言

如上文所說,Java語言並沒有對協程的原生支持,但是某些開源框架模擬出了協程的功能,有興趣的小夥伴可以看一看Kilim框架的源碼:

https://github.com/kilim/kilim

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