簡述程序與執行緒的區別
在作業系統中,你知道程序與執行緒的區別有哪些?下面是小編為你整理的,供大家閱覽!
程序與執行緒的區別
程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。
執行緒是程序的一個實體, 是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源***如程式計數器,一組暫存器和棧***,但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源。
一個執行緒可以建立和撤銷另一個執行緒,同一個程序中的多個執行緒之間可以併發執行。
程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式 健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。
程序是什麼?
程式並不能單獨執行,只有將程式裝載到記憶體中,系統為它分配資源才能執行,而這種執行的程式就稱之為程序。程式和程序的區別就在於:程式是指令的集合,它是程序執行的靜態描述文字;程序是程式的一次執行活動,屬於動態概念。
在多道程式設計中,我們允許多個程式同時載入到記憶體中,在作業系統的排程下,可以實現併發地執行。這是這樣的設計,大大提高了CPU的利用率。程序的出現讓每個使用者感覺到自己獨享CPU,因此,程序就是為了在CPU上實現多道程式設計而提出的。
有了程序為什麼還要執行緒?
程序有很多優點,它提供了多道程式設計,讓我們感覺我們每個人都擁有自己的CPU和其他資源,可以提高計算機的利用率。很多人就不理解了,既然程序這麼優秀,為什麼還要執行緒呢?其實,仔細觀察就會發現程序還是有很多缺陷的,主要體現在兩點上:
程序只能在一個時間幹一件事,如果想同時幹兩件事或多件事,程序就無能為力了。
程序在執行的過程中如果阻塞,例如等待輸入,整個程序就會掛起,即使程序中有些工作不依賴於輸入的資料,也將無法執行。
如果這兩個缺點理解比較困難的話,舉個現實的例子也許你就清楚了:如果把我們上課的過程看成一個程序的話,那麼我們要做的是耳朵聽老師講課,手上還要記筆記,腦子還要思考問題,這樣才能高效的完成聽課的任務。而如果只提供程序這個機制的話,上面這三件事將不能同時執行,同一時間只能做一件事,聽的時候就不能記筆記,也不能用腦子思考,這是其一;如果老師在黑板上寫演算過程,我們開始記筆記,而老師突然有一步推不下去了,阻塞住了,他在那邊思考著,而我們呢,也不能幹其他事,即使你想趁此時思考一下剛才沒聽懂的一個問題都不行,這是其二。
現在你應該明白了程序的缺陷了,而解決的辦法很簡單,我們完全可以讓聽、寫、思三個獨立的過程,並行起來,這樣很明顯可以提高聽課的效率。而實際的作業系統中,也同樣引入了這種類似的機制——執行緒。
執行緒的優點
因為要併發,我們發明了程序,又進一步發明了執行緒。只不過程序和執行緒的併發層次不同:程序屬於在處理器這一層上提供的抽象;執行緒則屬於在程序這個層次上再提供了一層併發的抽象。如果我們進入計算機體系結構裡,就會發現,流水線提供的也是一種併發,不過是指令級的併發。這樣,流水線、執行緒、程序就從低到高在三個層次上提供我們所迫切需要的併發!
除了提高程序的併發度,執行緒還有個好處,就是可以有效地利用多處理器和多核計算機。現在的處理器有個趨勢就是朝著多核方向發展,在沒有執行緒之前,多核並不能讓一個程序的執行速度提高,原因還是上面所有的兩點限制。但如果講一個程序分解為若干個執行緒,則可以讓不同的執行緒執行在不同的核上,從而提高了程序的執行速度。
例如:我們經常使用微軟的Word進行文字排版,實際上就打開了多個執行緒。這些執行緒一個負責顯示,一個接受鍵盤的輸入,一個進行存檔等等。這些執行緒一起執行,讓我們感覺到我們輸入和螢幕顯示同時發生,而不是輸入一些字元,過一段時間才能看到顯示出來。在我們不經意間,還進行了自動存檔操作。這就是執行緒給我們帶來的方便之處。