1. 程式人生 > >程序與執行緒的總結和區別

程序與執行緒的總結和區別

對於程序和執行緒的區別,很多面試或者筆試都有涉及到。我想很多朋友跟我一樣,對他們都僅限於一些很粗很廣的定義和區分,對於很多細節一下子回答出來還是有一定難度的。下面我將對程序和執行緒做一個系統的總結,供大家參考。如文中有不妥的地方,歡迎大家指正。

 一、概念上區分

程式:程式本身只是指令、資料及其組織形式的描述,是一個靜態的概念。

程序:程序是作業系統的基礎,也是程式的基本執行實體,是一個動態的概念。若干程序有可能與同一個程式相關係,且每個程序皆可以同步(循序)或非同步(平行)的方式獨立執行。在面向程序設計的系統中,如早期的UNIXLinux2.4及更早的版本)中,程序是程式的基本執行實體也是系統分配和排程資源的基本單元

;在面向執行緒設計的系統中,(如當代多數作業系統、Linux2.6及更新的版本)中,程序本身不是基本執行單位,而是執行緒的容器,在資源排程和分配上與面向程序設計的系統唯一區別是:程序是分配和排程除CPU以外的資源的基本單元,而執行緒才是分配和排程CPU的基本單元

執行緒:是作業系統進行CPU排程的最小單元。寄生於程序中,是程序的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。在UNIXSUN系統中被稱為輕量級執行緒,但輕量級執行緒更多的是指核心執行緒,而把使用者執行緒稱為執行緒。每個程序至少有一個執行緒,如果程式只有一個執行緒,那就是程序本身。

二、基本狀態以及狀態轉換

1、程序

程序的基本狀態:就緒、執行、阻塞

         就緒狀態:指程序獲得了除CPU以外的所有必要資源,只要獲得CPU資源便可執行。

         執行狀態:此時,程序正在執行計算任務,處理指定的操作。

         阻塞狀態:正在執行的程序,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。引起程序阻塞的事件可有多種,例如,等待I/O完成、申請緩衝區不能滿足、等待信件(訊號)等。

程序的狀態轉換:

程序的狀態轉換圖


(1) 就緒→執行

處於就緒狀態的程序,當程序排程程式為之分配了處理機後,該程序便由就緒狀態轉變成執行狀態。

(2)

執行→就緒

處於執行狀態的程序在其執行過程中,因分配給它的一個時間片已用完而不得不讓出處理機,於是程序從執行狀態轉變成就緒狀態。或者優先順序更高的程序佔用了CPU資源。

(3) 執行→阻塞

正在執行的程序因等待某種事件(或者說必要的系統資源)發生而無法繼續執行時,便從執行狀態變成阻塞狀態。

(4) 阻塞→就緒

處於阻塞狀態的程序,若其等待的事件已經發生,於是程序由阻塞狀態轉變為就緒狀態

2、執行緒

執行緒的基本狀態:就緒、阻塞、執行三中狀態。其狀態轉換與程序類似,此處不再闡述。

要重點說明的是執行緒的阻塞狀態

阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種:

①  等待阻塞:執行的執行緒執行pthread_cond_wait()方法,系統將其放入等待佇列;

②  同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒佔用;

③  其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了I/O請求時;當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。

注:呼叫Sleepjoin時,不會釋放所佔用的資源,所以會進入阻塞狀態;呼叫Wait時,會釋放所佔用的資源,所以會進入等待佇列。

三、資源管理

1.      一個程序在建立時包括以下資源:

① ;該儲存空間包括程式碼段、特點的程序資料,呼叫堆疊、堆疊(用於儲存執行時運數中途產生的資料)。

②  分配給該程序的資源的作業系統描述符,諸如檔案描述符Unix術語)或檔案控制代碼Windows)、資料來源和資料終端。

③  安全特性,諸如程序擁有者和程序的許可權集(可以容許的操作)。

④  處理器狀態(內文),諸如暫存器內容、物理儲存器定址等。當程序正在執行時,狀態通常儲存在暫存器,其他情況在儲存器。

2.     一個程序中的執行緒共享的資源:

①  程序的程式碼段;

②  開啟的檔案描述符;

③  程序的當前目錄;

④  程序使用者ID、程序組ID;

⑤  程序的公有資料(訊號量、互斥量等等);

3.     執行緒獨有的資源有

①  執行緒ID

②  暫存器組;

③  執行緒的堆疊;

④  錯誤返回碼;

⑤  執行緒的訊號遮蔽碼;

⑥  執行緒的優先順序;

四、引入執行緒的原因

①  執行緒的排程比程序的排程代價小,同時建立執行緒比建立程序的代價低;

②  提高併發性,改善整個程式的吞吐量。在單個程序需要完成多個任務時,需要把任務序列化,有了多執行緒則可將相互獨立的任務處理,為每個任務分配獨立的執行緒即可,當然需要考慮資料同步和競爭問題。

③  一個程序的所有執行緒可以自動共享程序的資源,而在多程序中需使用系統的複雜機制才能實現記憶體、檔案描述符的共享。

④  互動的程式同樣可以利用多執行緒實現相應響應時間的改善,多執行緒可以把程式中的輸入輸出與其他處理部分分開。

⑤  充分發揮多處理器的功能。通過多執行緒設計,每個執行緒在一個處理器上執行,從而實現應用程式的併發性,改善每個處理器的利用率。

此外,補充一點關於程序切換的知識。

進行程序切換就是從正在執行的程序中收回處理器,然後再使待執行程序來佔用處理器。所謂處理器回收,實質上就是把程序存放在處理器的暫存器中的中間資料找個地方存起來,從而把處理器的暫存器騰出來讓其他程序使用。那麼被中止執行程序的中間資料存在何處好呢?當然這個地方應該是程序的私有堆疊。

讓程序來佔用處理器,實質上是把某個程序存放在私有堆疊中暫存器的資料(前一次本程序被中止時的中間資料)再恢復到處理器的暫存器中去,並把待執行程序的斷點送入處理器的程式指標PC,於是待執行程序就開始被處理器運行了,也就是這個程序已經佔有處理器的使用權了。

例如:這就像多個同學要分時使用同一張課桌一樣,所謂要收回正在使用課桌同學的課桌使用權,實質上就是讓他把屬於他的東西拿走;而賦予某個同學課桌使用權,只不過就是讓他把他的東西放到課桌上罷了。

在切換時,一個程序儲存在處理器各暫存器中的中間資料叫做程序的上下文,所以程序的切換實質上就是被中止執行程序與待執行程序上下文的切換。在程序未佔用處理器時,程序的上下文是儲存在程序的私有堆疊中的。

與程序切換不同,執行緒的切換開銷則小很多,只需要儲存和恢復執行緒的暫存器記憶體,棧的切換也是通過暫存器的切換來完成的。可見,執行緒的切換比程序的切換代價要低很多。

參考文獻:

[4]      Tanenbaum A S, 坦尼鮑姆,向群,.現代作業系統[M].機械工業出版社, 2005..

[5]      http://uule.iteye.com/blog/1100799.

相關推薦

程序執行理解關係

程序 執行緒的含義 程序就是一個程式在一個數據集上的一次動態執行過程。 程序一般由程式、資料集、程序控制塊三部分組成。我們編寫的程式用來描述程序要完成哪些功能以及如何完成;資料集則是程式在執行過程中所需要使用的資源;程序控制塊用來記錄程序的外部特徵,描述程序的執行變化過程,系統可以利用它

程序執行的簡單區別

我自己理解的程序與執行緒的區別: 1.子程序之間相對獨立,除了彼此間的通訊,幾乎不會影響到對方, 就像每個人在自己單獨的房間裡辦公一樣。 2。子執行緒之間的交集比較大。 相對程序而言,執行緒是一個更加接近於執行體的概念, 它可以與同進程中的其他執行緒共享資料,但擁有自己的棧空間,擁有獨立的

程序執行總結(比較全面)

1.程序和執行緒 1.1 概述: 程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位. 執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不

程序執行之間的區別

我們在討論程序與執行緒的區別之前,首先我們要清楚程序與執行緒的概念。  什麼是程序? 程序是併發執行程式在執行過程中資源分配和管理的基本單位(資源分配的最小單位),是指令+資料+資源的一個集合。程序可以理解為程式的一次例項化,應用程式一旦執行,就是一個程序。每個程序都有自己獨立的地

【Linux程序排程】程序執行的本質區別

簡而言之,執行緒是程序的一部分,程序是程式的一部分。 異同: 1、程序是資源分配的基本單位,而執行緒是排程的基本單位; 2、程序與程序之間是獨立的,一個程序的異常終止不會影響其它程序,而執行緒與執行

程序執行總結區別

對於程序和執行緒的區別,很多面試或者筆試都有涉及到。我想很多朋友跟我一樣,對他們都僅限於一些很粗很廣的定義和區分,對於很多細節一下子回答出來還是有一定難度的。下面我將對程序和執行緒做一個系統的總結,供大家參考。如文中有不妥的地方,歡迎大家指正。  一、概念上區分 程式:

Linux程序執行區別 詳細總結

首先,簡要了解一下程序和執行緒。對於作業系統而言,程序是核心之核心,整個現代作業系統的根本,就是以程序為單位在執行任務。系統的管理架構也是基於程序層面的。在按下電源鍵之後,計算機就開始了複雜的啟動過程,此處有一個經典問題:當按下電源鍵之後,計算機如何把自己由靜止啟動起來的?本

程序執行區別聯絡以及優缺點

什麼是執行緒? -在一個程式裡的一個執行路線就叫做執行緒。更準確的定義是:執行緒是“一個程序內部的控制序列”。 -一切程序至少都有一個執行執行緒 -執行緒也被叫做輕量級程序 什麼是程序? -程序是程式的一個執行的例項。 -程序是正在執行的程式。 -程序是能分配處理器並由處

CIL鎖,GIL執行池的區別,程序執行池,同步非同步

一.GIL鎖 什麼是GIL? 全域性直譯器鎖,是加在直譯器上的互斥鎖 GC是python自帶的記憶體管理機制,GC的工作原理:python中的記憶體管理使用的是應用計數,每個數會被加上一個整型的計數器,表示這個資料被引用的次數,當這個整數變為0時則表示該資料已經沒有人使用,成為了垃圾資料,當記憶體佔用達到

程序執行區別聯絡

程序概念   程序是表示資源分配的基本單位,又是排程執行的基本單位。例如,使用者執行自己的程式,系統就建立一個程序,併為它分配資源,包括各種表格、記憶體空間、磁碟空間、I/O裝置等。然後,把該程序放人程序的就緒佇列。程序排程程式選中它,為它分配CPU以及其它有關資源,該程序才真正執行。所以,

程序間,執行間的通訊方式及程序執行區別

近日想總結下程序間,執行緒間的通訊方式,在網上搜索了下,感覺寫的很好,照搬過來,當做加深記憶。 幾種程序間的通訊方式 (1) 管道(pipe):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有血緣關係的程序間使用。程序的血緣關係通常指父子程序關係。 (2)有名管道(named p

作業系統——程序執行區別以及如何選擇

1.定義 在對執行緒和程序進行比較之前,我們先看一下它們的定義。 程序:是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位,是資源分配的最小單位。 執行緒:是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的

程序執行區別聯絡、程序執行的通訊方式.md

一、為什麼引入程序? 程序是為了提高CPU的執行效率,減少因為程式等待帶來的CPU空轉以及其他計算機軟硬體資源的浪費而提出來的。 二、為什麼引入執行緒? 為了減少程序切換和建立的開銷,提高執行效率和節省

Java多執行的實現(程序執行的概念、Java繼承Thread類實現多執行、Java實現Runnable介面實現多執行、ThreadRunnable的區別、實現Callable介面實現多執行

1 程序與執行緒 1.1 程序與執行緒的概念 什麼是程序?   程序: 作業系統中一個程式的執行週期。(比如我們想要在電腦上登入QQ,從雙擊qq按鈕---->關閉qq這個過程就是一個程序)   多程序: 同一時刻跑多個程式。   在DOS(磁碟作業系統時

001.多執行-程序執行區別

什麼是程序?顧名思義,就是進行中的程式,也就是執行中的程式。我們開啟電腦的工作管理員可以看到: 此時,執行中的360瀏覽器,Google瀏覽器等都是獨立的一個程序,他們擁有相應的系統資源,比如:CPU

執行的那些事兒(2)-- 程序執行區別聯絡

  在進行多執行緒程式設計之前我們先解決一個基本問題:什麼是執行緒、什麼是程序,他們之間有什麼區別與聯絡。 (1)程序:執行環境                   執行緒:執行單位         用書面一點的知說,程序是一個計算機中程式執行的一個實體,執行緒是作業系

程序執行區別

定義: 一、程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,是系統進行資源分配和排程的一個獨立單位。 二、執行緒是程序的一個實體,是CPU排程和分派的基本單位,他是比程序更小的能獨立執行的基本單位,執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少

《計算機作業系統》總結二(程序執行

作業系統(計算機)程序和執行緒管理 主要內容: 程序與執行緒 程序概念;程序的狀態與轉換程序控制;程序組織程序通訊;執行緒概念與多執行緒模型處理器排程 排程的基本概念;排程時機、切換與過程排程的基本準

Linux中程序執行的概念以及區別

linux程序與執行緒的區別,早已成為IT界經常討論但熱度不減的話題。無論你是初級程式設計師,還是資深專家,都應該考慮過這個問題,只是層次角度不同罷了。對於一般的程式設計師,搞清楚二者的概念並在工作中學會運用是其思考的主要問題;對於資深工程師,如何在系統層面實現兩種技術及其各自的效能和實現代價是其思考的主要問

程序執行的關係區別

程序,是併發執行的程式在執行過程中分配和管理資源的基本單位,是一個動態概念,竟爭計算機系統資源的基本單位。每一個程序都有一個自己的地址空間,即程序空間或(虛空間)。程序空間的大小 只與處理機的位數有關,一個 16 位長處理機的程序空間大小為 216 ,而 32 位處理機