c++ 等待子线程结束_?进程、线程、以及它们之间的区别与联系
一、進程簡介
1.1 進程概念的引入
計算機中,CPU是最寶貴的資源,為了提高CPU的利用率,引入了多道程序設計的概念。當內存中多個程序存在時,如果不對人們熟悉的“程序”的概念加以擴充,就無法刻畫多個程序共同運行時系統呈現出的特征。
多道程序設計:是指允許多個作業(程序)同時進入計算機系統的內存并啟動交替計算的方法。也就是說,內存中多個相互獨立的程序均處于開始和結束之間。
從宏觀上看是并行的,多道程序都處于運行過程中,但尚未運行結束;
從微觀角度上看是串行的,各道程序輪流的占用CPU交替的執行。
引入多道程序設計技術可以提高CPU的利用率,充分發揮計算機硬部件的并行性。
多道程序系統中,程序具有:并行、制約以及動態的特征。程序概念難以便是和反映系統中的情況,所以引入了進程這一概念。
1.2 程序是什么
說起進程,就不得不說下程序。先看定義:程序是指令和數據的有序集合,其本身沒有任何運行的含義,是一個靜態的概念。系統實際上是出于不斷變化的狀態中,程序不能反映這種動態性。
而進程則是在處理機上的一次執行過程,它是一個動態的概念。這個不難理解,其實進程是包含程序的,進程的執行離不開程序,進程中的文本區域就是代碼區,也就是程序。
1.3 進程是什么
1.3.1 進程的概念
進程的定義: 進程是據有獨立功能的程序在某個數據集合上的一次運行活動,也是操作系統進行資源分配和保護的基本單位。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
從原理角度上看:進程是支持程序執行的一種系統機制,它對處理器上運行程序的活動規律進行抽象。
從實現角度看:進程是一種數據結構,用來準確的刻畫運行程序的狀態和系統動態變化狀況。
簡單的來講進程的概念主要有兩點:第一,進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲著活動過程調用的指令和本地變量。第二,進程是一個 “執行中的程序”。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成為一個活動的實體,我們稱其為進程。
1.3.2 進程的類型
- 系統進程:操作系統用來管理資源的進程,當系統進程處于運行態時,CPU處于管態,系統之間的關系由操作系統負責。
- 用戶進程:操作系統可以獨立執行的的用戶程序段,當用戶進程處于運行態時,CPU處于目態,用戶進程之間的關系由用戶負責。
1.3.3 進程控制塊
- 進程的三個組成部分
PCB隨著進程的創建而建立,撤銷而消亡。系統根據PCB感知一個進程的存在,PCB是進程存在的唯一物理標識(這一點可以類比作業控制塊JCB)
- 進程控制塊的內容
整個系統中各進程的的PCB集合可用數組表示。這時進程內部標號可以與數組元素下標聯系。
各系統預留的PCB空間往往是固定的,如UNIX系統中規定進程數量不超過50個(這一點我有點懷疑)
操作系統不同,PCB的格式、大小及內容也不盡相同。一般的,應該包含如下四個信息a. 標識信息:進程名b. 說明信息:進程狀態、程序存放位置c. 現場信息:通用寄存器內存、控制寄存器內存、斷點地址d. 管理信息:進程優先數、隊列指針
1.3.4 進程的重要特征
1. 動態特征:進程對應于程序的運行,動態產生、消亡,在其生命周期中進程也是動態的、
2. 并發特征:任何進程都可以同其他進程一起向前推進
3. 獨立特征:進程是相對完整的調度單位,可以獲得CPU,參與并發執行
4. 交往特征:一個進程在執行過程中可與其他進程產生直接或間接關系
5. 異步特征:每個進程都以相對獨立、不可預知的速度向前推進
6. 結構特征:每個進程都有一個PCB作為他的數據結構
進程最基本的特征是并發和共享特征
1.3.5 進程的狀態與轉換
- 進程的三種基本狀態
b. 阻塞狀態:為了等待某個外部事件的發生(如等待I/O操作的完成,等待另一個進程發來消息),暫時無法運行。也成為等待狀態
c. 就緒狀態:具備了一切運行需要的條件,由于其他進程占用CPU而暫時無法運行
- 進程狀態之間的轉換
b. 阻塞狀態 ===> 就緒狀態:例如I/O操作完成之后,由阻塞狀態轉化為就緒狀態
c. 就緒狀態 ===> 運行狀態:例如就緒狀態的進程被進程調度程序選中,分配到CPU中運行,由就緒狀態轉化為運行狀態
d. 運行狀態 ===> 就緒狀態:處于運行狀態的進程的時間片用完,不得不讓出CPU,由運行狀態轉化為就緒狀態
1.4 進程與程序的區別
A.進程是一個動態的概念
進程是程序的一次執行過程,是動態概念
程序是一組有序的指令和數據集和,是靜態概念
B.進程有自己的生命周期
當操作系統要完成某個任務時,它會創建一個進程。當進程完成任務之后,系統就會撤銷這個進程,收回它所占用的資源。從創建到撤銷的時間段就是進程的生命周期。而程序可以作為一種軟件資料永久保存。
C.進程之間存在并發性
并發是指兩個或多個事件在同一時間間隔內發生。在多道程序環境下,并發性是指在一段時間宏觀上有多個程序在同時運行,但在單處理機系統中,每一時刻卻僅能只有一道程序在執行,故微觀上這些程序只能時分時交替執行。進程是一個動態的概念,是一個可以獨立運行的單位。在一個系統中,同時會存在多個進程。他們輪流占用CPU和各種資源。
D.進程與程序之間無一一對應關系
不同的進程可以包含同一程序,同一程序在執行中也可以產生多個進程。
- 不同的進程可以執行同一個程序
兩個進程即使執行在相同的程序上,只要他們運行在不同的數據集合上,他們也是兩個進程。
- 一個進程可以執行多個程序
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.相互影響: 進程間不會相互影響; 一個線程掛掉會導致整個進程掛掉。
- 一個程序至少有一個進程, 一個進程至少有一個線程。
- 線程的劃分尺度小于進程,使得多線程程序的并發性高。
- 進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
- 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
- 從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
(如有錯誤,還望指正)
參考文章:https://www.cnblogs.com/tianlangshu/p/5224178.html
https://www.cnblogs.com/fuchongjundream/p/3829508.html
https://blog.csdn.net/qwe6112071/article/details/70473905
總結
以上是生活随笔為你收集整理的c++ 等待子线程结束_?进程、线程、以及它们之间的区别与联系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果 Studio Display 16
- 下一篇: s3c2440移植MQTT