进程、线程简介
以下內容源于網絡資源的學習整理,如有侵權,請告知刪除。
參考博客
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html(通俗理解)
https://blog.csdn.net/chen_geng/article/details/51613445(表格總結,推薦)
https://blog.csdn.net/java_zero2one/article/details/51477791(并發和并行)
https://www.cnblogs.com/reality-soul/p/6397021.html(單進程和多進程的代碼示例)
https://blog.csdn.net/zqixiao_09/article/details/50298693
https://blog.csdn.net/linux0231/article/details/24523129
https://blog.csdn.net/earbao/article/details/53106419
之前關于進程的學習要點總結:https://pan.baidu.com/s/1dktsSp2D8YIinhD2DUdUYQ
?
?
一、并發、并行
(1)并發:是指一個處理器同時處理多個任務,是邏輯上的同時發生(即假象)。
- 程序假裝同時執行多個操作(每個小時間片執行一個操作,多個操作快速切換執行)。
(2)并行:是指多個處理器(或者多核處理器)同時處理多個不同的任務,是物理上的同時發生。
(3)比喻:并發是一個人同時吃三個饅頭,而并行是三個人同時吃三個饅頭。
(4)
當有多個線程在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處于掛起狀態。這種方式我們稱之為并發(Concurrent)。
當系統有一個以上CPU時,則線程的操作有可能非并發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶占CPU資源,可以同時進行,這種方式我們稱之為并行(Parallel)。
?
二、對比進程與線程
| ? | 進程,process | 線程,thread |
| 定義 | 資源(CPU時間、內存等)分配的最小單位 | 程序執行的最小調度單位 |
| 區別 | 1、獨立的地址空間。每創建一個進程,就會給該進程分配一個4G的虛擬內存空間。 2、進程是建立在虛擬內存的基礎之上的。 | 1、沒有獨立的地址空間(同一進程內的線程共享進程的地址空間)。 2、主要是為了將進程的資源申請和調度屬性分開。 |
| 聯系 | 1、一個進程有幾個線程組成。 2、同一個進程中的多個線程之間可以并發執行。 3、一個線程死掉就等于整個進程死掉。 4、線程與同屬一個進程的其他的線程共享進程所擁有的全部資源。 | |
| OS而言 | 1、uCOS只有線程的概念。uCOS的整個程序可以理解為一個進程,而其中的任務(一個個函數)就可以理解為一個個線程,有自己的堆棧和局部變量,但沒有單獨的地址空間。 2、對于windows,linux等,其有進程和線程。 | |
| 線程的優勢 | 一、優勢 1、與進程相比,它是一種非常"節儉"的多任務操作方式。 (1)對進程而言,創建一個新的進程必須分配給它獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工作方式。 (2)對一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。 ? 2、與進程相比,線程間的通信機制更方便。 (1)對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。 (2)對一個進程中的多個線程,由于它們共享數據空間,所以一個線程的數據可以直接為其它線程所用,這不僅快捷,而且方便。 ? 3、提高應用程序響應。
4、使多CPU系統更加有效。
5、改善程序結構。
二、線程可以有效地提高系統的執行效率,但并不是在所有計算機系統中都是適用的,如某些很少做進程調度和切換的實時系統。使用線程的好處是有多個任務需要處理 機處理時,減少處理機的切換時間;而且,線程的創建和結束所需要的系統開銷也比進程的創建和結束要小得多。最適用使用線程的系統是多處理機系統和網絡系統或分布式系統。 | |
| 區分進程、用戶線程、內核線程 | ||
| uCOS/Linux狀態區別 | 線程只有 3 個基本狀態:就緒,執行,阻塞。 線程存在 5 種基本操作來切換線程的狀態:派生,阻塞,激活,調度,結束。 | ? 進程至少有 5 種基本狀態: 初始態,執行態,等待狀態,就緒狀態,終止狀態。 |
?
三、進程、線程的補充說明
(1)線程理解
線程,在網絡或多用戶環境下,一個服務器通常需要接收大量且不確定數量用戶的并發請求,為每一個請求都創建一個進程顯然是行不通的——無論是從系統資源開銷方面或是響應用戶請求的效率方面來看。因此,操作系統中線程的概念便被引進了。線程是進程的一部分,一個沒有線程的進程可以被看作是單線程的。線程有時又被稱為輕權進程或輕量級進程,是?CPU 調度的一個基本單位。
(2)線程和進程大致的區別
進程的執行過程是線狀的,盡管中間會發生中斷或暫停,但該進程所擁有的資源只為該線狀執行過程服務。一旦發生進程上下文切換,這些資源都是要被保護起來的。這是進程宏觀上的執行過程。
進程又可有單線程進程與多線程進程兩種。單線程進程的執行過程在宏觀上是線性的,微觀上也只有單一的執行過程;而多線程進程在宏觀上的執行過程同樣為線性的,但微觀上卻可以有多個執行操作(線程),如不同代碼片段以及相關的數據結構集。線程的改變只代表了 CPU 執行過程的改變,而沒有發生進程所擁有的資源變化。除CPU 之外,計算機內的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。
我們知道,進程有一個進程控制塊 PCB、相關程序段、(該程序段對其進行操作的)數據結構集。與進程控制表和 PCB 相似,每個線程也有自己的線程控制表 TCB ,而這個TCB 中所保存的線程狀態信息則要比 PCB 表少得多,這些信息主要是相關指針用堆棧(系統棧和用戶棧),寄存器中的狀態數據。
進程擁有一個完整的虛擬地址空間,不依賴于線程而獨立存在;反之,線程是進程的一部分,沒有自己的地址空間,與進程內的其他線程一起共享分配給該進程的所有資源。
線程可以有效地提高系統的執行效率,但并不是在所有計算機系統中都是適用的,如某些很少做進程調度和切換的實時系統。使用線程的好處是有多個任務需要處理 機處理時,減少處理機的切換時間;而且,線程的創建和結束所需要的系統開銷也比進程的創建和結束要小得多。最適用使用線程的系統是多處理機系統和網絡系統 或分布式系統。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。?
?從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
(3)摘取自http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html的評論區
?
四、多進程的代碼示例
#include <unistd.h> #include <sys/types.h> #include <stdio.h> void print_exit() { printf("the exit pid:%d/n",getpid() ); } main () { pid_t pid; atexit( print_exit ); //注冊該進程退出時的回調函數 pid=fork(); if (pid < 0) printf("error in fork!"); else if (pid == 0) printf("i am the child process, my process id is %d/n",getpid()); else { printf("i am the parent process, my process id is %d/n",getpid()); sleep(2); wait(); } }運行結果:
i am the child process, my process id is 15806
the exit pid:15806
i am the parent process, my process id is 15805
the exit pid:15805
說明:
(1)fork函數,功能是產生子進程。fork失敗返回-1,成功返回0。
fork產生子進程的體現,就是它會返回2次:
一次返回0,順序執行下面的代碼。這是子進程。
一次返回子進程的pid,也順序執行下面的代碼,這是父進程。
(2)wait表明父進程等待子進程的終結后,處理其task_struct結構,否則會產生僵尸進程。
(3)atexit( print_exit );?需要的參數是函數的調用地址。
?
五、多線程的代碼示例
?
?
總結
- 上一篇: win7 由ie8升级ie11时安装不成
- 下一篇: C语言ASCII码转换