執行緒和程序的區別是什麼?

時間 2021-05-06 03:20:55

1樓:import 潘多拉

主機=廚房

CPU核心=廚師

程序=灶台

幾個執行緒=灶台上幾個爐子

乙個廚師,可以用乙個灶台,用乙個爐子給你煮一鍋粥;

也可以用多個灶台,每個灶台上架鍋子同時給你炒菜;

速度快的廚師,很短的時間內可以做出一桌子菜,但是他很累,你要給他打扇。

2樓:YIFEI

看到有人發的阮一峰的文章,好像車間的比喻有些地方還是不太貼切,比如執行緒比作車間的工人。

下面是我的理解。

乙個程序可以模擬成乙個車間,多程序就是多個車間。

每個執行緒相當於車間內的一條生產,多執行緒就是乙個車間內有多條生產線。

不同車間之間需要運送貨物,可以人工搬運、傳送帶、貨車等,

相當於程序間管道、訊息佇列、共享記憶體等IPC通訊。

每個車間內有需要加工的材料,不同生產線都可以使用這些材料,

相當於執行緒間可以共享程序的一些資源,比如堆區資料、檔案描述符等,

於是產生了資源爭用,需要一些同步互斥的手段。

這個工廠內只有乙個工人,就相當於CPU,他可以選擇去不同的生產線去工作,

在不同的生產線之間切換,就相當於cpu的時間片輪轉。

工人每次只能在一條生產線工作,說明執行緒是cpu排程的基本單位,並且對於核心來說,只有執行緒的概念,而沒有程序的概念。

工人在不同生產線之間切換是相對容易的,不同車間之間的切換是比較麻煩的。

乙個車間發生了事故,另乙個車間一般還能繼續工作。

而一條生產線著了火,其他生產線可能就會受影響。

3樓:Hello world

程序是資源的擁有者,執行緒不是

其他差不多,cpu上下文資訊啊什麼的。執行緒就是簡易版本輕型程序。

大三那本白色的《作業系統》第二章就有,多讀幾遍就懂了。

4樓:chainhelen

這件事說穿了,是資源隔離粒度不同。這裡資源粒度就是記憶體。(我覺得不要背那些什麼控制代碼,棧啊啥的資源名詞。)

程序通過設定cr3暫存器擁有完整的虛擬記憶體空間;而執行緒(linux task)最核心改變的是eip暫存器,並沒有隔離出新的虛擬記憶體空間。這也是造成它們切換成本不同的最大原因。(當然跟協程比,都得陷入核心態。

)我覺得理解上還是把cpu只作為計算工具(儘管它提供了缺頁異常啥的),因為真正幹資源隔離這件事的還是作業系統;cpu只是個麼得感情的指令工具。

5樓:布加迪威圖

我們脫離開書本,在實際應用中,尤其是是Linux中,程序和執行緒本質是一樣的

這裡不想貼大段的書本知識,沒有太多意義

在Linux核心中,並沒有對執行緒和程序有明顯區分,雖然程序使用fork()進行新建,執行緒使用pthread()進行新建,但是本質上他們的資料結構都是task_struct,是一樣的

而區別在於記憶體和files共享

當建立乙個程序的時候,mm_struct會指向另外一塊位址,使用copy-on-write進行複製

而建立乙個執行緒的時候,mm_struct會指向父程序的同一塊虛擬記憶體區域,所以會有資源衝突問題

不論執行緒和程序,在linux中的建立都是很快速的

6樓:mao.gang

現在計算機的設計而言,乙個程式有幾種狀態,駐留在硬碟上,或其它儲存外設上的狀態,駐留在記憶體中的狀態,被載入cpu執行時的狀態, 程序就是應用程式駐留在記憶體時的一種狀態,執行緒就是將相關這個程序的的相關資源叫執行緒上下文載入進入cpu進行執行的狀態。通常乙個程序都有乙個主線程。 程序這種狀態,和作業系統一起分享計算機的各種裝置訊號,就是監聽響應,只要使用者通過某種情況喚醒某個程序,那麼該程序的主線程可能就會有相應的指令被載入cpu進行執行,這就是響應使用者的輸入了。

比如滑鼠,鍵盤,遊戲控制手柄,聲音等。

7樓:LCACchen

一般作業系統都支援同時執行多個任務,乙個任務通常就是乙個程式,每個執行中的程式被稱為乙個程序,當乙個程式執行時,內部可能包含多個順序執行流,每個順序執行流就是乙個執行緒

8樓:泛舟

程序是cpu資源分配的最小單位,執行緒是cpu排程的最小單位程序之間的上下文切換開銷大, 執行緒開銷小.

目前, 作業系統僅排程執行緒, 而非程序, 所以才說執行緒是CPU排程的最小單元.

程序上下文切換僅僅指的是, 屬於不同程序的執行緒間上下文切換的過程. 該過程僅多了一步: 重置程序虛擬位址暫存器MMU, 清空CPU快取.

因此同一程序間的執行緒都共享資源, 所以沒有上述那一步.

很多系統都支援程序間交流(IPC), 如通過pipes和sockets; 而執行緒之間的溝通可通過共享資源來完成.

9樓:法科奧勒夫斯基

乙個程序對應乙個main()函式,在main()中如果想讓同一作用域下一前一後兩個迴圈體同步執行怎麼辦?再開乙個執行緒!兩個迴圈體都想訪問兩個迴圈體之前定義的乙個變數怎麼辦?

執行緒鎖!......

這個思路對嗎?各路大神。

10樓:

看了一遍排在前面的答案,類似」程序是資源分配的最小單位,執行緒是CPU排程的最小單位「這樣的回答感覺太抽象,都不太容易讓人理解。

做個簡單的比喻:程序=火車,執行緒=車廂

執行緒在程序下行進(單純的車廂無法執行)

乙個程序可以包含多個執行緒(一輛火車可以有多個車廂)

不同程序間資料很難共享(一輛火車上的乘客很難換到另外一輛火車,比如站點換乘)

同一程序下不同執行緒間資料很易共享(A車廂換到B車廂很容易)

程序要比執行緒消耗更多的計算機資源(採用多列火車相比多個車廂更耗資源)

程序間不會相互影響,乙個執行緒掛掉將導致整個程序掛掉(一列火車不會影響到另外一列火車,但是如果一列火車上中間的一節車廂著火了,將影響到所有車廂)

程序可以拓展到多機,程序最多適合多核(不同火車可以開在多個軌道上,同一火車的車廂不能在行進的不同的軌道上)

程序使用的記憶體位址可以上鎖,即乙個執行緒使用某些共享記憶體時,其他執行緒必須等它結束,才能使用這一塊記憶體。(比如火車上的洗手間)-"互斥鎖"

程序使用的記憶體位址可以限定使用量(比如火車上的餐廳,最多隻允許多少人進入,如果滿了需要在門口等,等有人出來了才能進去)-「訊號量」

11樓:何冬冬

有了程序和執行緒這兩個玩意兒,你就可以既要... 又要... 還想...老哥,美滋滋哦!

什麼叫單程序?

乙個國家只有一條路。

什麼叫多程序?

乙個國家有很多條路。

什麼叫單程序單執行緒?

乙個國家只有一條路,並且每條是單車道。

什麼叫多程序單執行緒?

乙個國家有很多條路,並且每條是單車道。

什麼叫多程序多執行緒?

乙個國家有很多條路,並且每條是10車道或者100車道或者1000車道,甚至非常多個車道。

所以,作業系統可以開非常多個程序,每個程序又可以分出來非常多個執行緒。

12樓:小冰冰我來了

把上面所有前輩的答案看一遍,應該就能理解了,剛才我也試著描述。但是發現了新的問題:①同一程序下的不同執行緒之間是什麼關係,遞進?

並列?②多開怎麼描述,舉個例子:電腦上只有乙個qq應用程式,但是手機上可以有兩個qq(多開),不確定的理解:

視作不同的程式?

13樓:劉攀

從職責劃分來看,程序是一種主存資源的管理和排程,執行緒主管cpu的執行。系統管理著多項任務(程序),多個任務並不是共同執行的,而是輪流在執行,每次任務的切換都會儲存當前任務的上下文,載入下個任務的上下文,然而執行緒的執行共享相同的上下文環境。

從粒度大小來看,乙個程序管理著整個任務,多個執行緒共同管理乙個任務,所以程序是執行緒的超集。個人認為這個超集概念不是很合理,用管理者和員工的關係來形容更合適,但超集二字更方便讀者去描述這種微妙關係。

14樓:幹總院

假設程序1,分為A,B,C三個執行緒他們擁有1的資源程序2,分為D,E,F三個執行緒他們擁有2的資源假設在執行A的時候,需要系統呼叫,產生中斷。根據某種排程演算法,讓出處理機讓另乙個執行緒使用,那麼,就有一定的可能性選擇BC,或者選擇DEF,如果選擇BC,那麼上下文的切換開銷會小,如果選擇了DEF,上下文的切換會大。

如果沒有執行緒,產生中斷之後,程序1被掛起,無論什麼排程演算法,都會切換到其他程序,其開銷是大的。

從數學期望上看,引入執行緒的系統的開銷比只有程序的開銷小,當執行緒是排程的基本單位而程序是擁有資源的基本單位,系統的併發性是提高的

15樓:林瘋

比如說:乙個老師出了一道題目給乙個同學解答,這個同學可以看成是乙個執行緒,為了解答的更快,再增加乙個同學同時解答,就相當於增加了乙個執行緒,以次類推。而解答的過程就可看成是程序。

5/10:修正一下最後一句

老師出題到同學解答,這整個過程可看成是乙個程序,而不單是解答的過程。

16樓:Fun Lee

The process model is based on two independent concepts: resource grouping and execution. Sometimes it is useful to separate them; this is where threads come in....

One way of looking at a process is that it isa way to group related resources together. A process has an address space containing program text and data, as well as other resources. These resource may include open files, child processes, pending alarms, signal handlers, accounting information, and more.

By putting them together in the form of a process, they can be managed more easily. The other concept a process has isa thread of execution, usually shortened to just thread. The thread has a program counter that keeps track of which instruction to execute next.

It has registers, which hold its current working variables. It has a stack, which contains the execution history, with one frame for each procedure called but not yet returned from. Although a thread must execute in some process, the thread and its process are different concepts and can be treated separately.

Processes are used to group resources together; threads are the entities scheduled for execution on the CPUFrom section 2.2.2 The Classical Thread Model in Modern Operating Systems 3e by Tanenbaum

總的來說,執行緒就是建立在程序上的一次程式執行單位。而程序雖然包含程式,但它的作用不是去執行程式,而是負責資源分配,

和 的區別是什麼?

Hell 感覺就是我為我之前的行為感到抱歉 感情更誠懇真摯或者說莊重?就,和朋友鬧著玩的時候我錯了,或者不小心撞到別人時說的對不起。情景設計。和朋友打鬧撞到路人 你正對路人,90度行禮,向對方道歉。氣氛嚴肅你 可能回頭看了路人一眼,隨口禮貌性的道歉 對直到現在已經告一段的事情的表達歉意時,用 對當下...

和 的區別是什麼?

草牧子謙 今天恰好在看一些關於敬語的內容,順便來回答一下這一題。日語的敬語一般分為 尊敬語謙譲語丁寧語 三類。尊敬語是對句子主語的尊敬,謙讓語是說話人對自身行為的謙虛的說法,而丁寧語是對聽話人表示尊敬。這裡特別說明一下丁寧語。現代日語表示敬體的助動詞 就是丁寧語的一種。丁寧語的使用和主語是沒有關係的...

和 的區別是什麼?

柳老師31 1 是用在當說話人表達的意思是 給自己某物的時候。例如 世民 請給我點水。變為間接引語就是 世民說給他點水。動作的指向是指向說話人本身的,這種情況下是用 2 是用在當說話人表達的意思是 給除了說話人 聽話人之外的第三者某物時。例如 世民 請給玄英點水。變為間接引語就是 世民說請給玄英點水...