首先來一句概括的總論:程序和執行緒都是乙個時間段的描述,是cpu工作時間段的描述。是執行中的程式指令的一種描述,這需要與程式中的**區別開來。
另外注意這裡我說的程序執行緒概念,和程式語言中的api介面對應的程序/執行緒是有差異的。
下面細說背景:
cpu+ram+各種資源(比如顯示卡,光碟機,鍵盤,gps, 等等外設)構成我們的電腦,但是電腦的執行,實際就是cpu和相關暫存器以及ram之間的事情。
乙個最最基礎的事實:cpu太快,太快,太快了,暫存器僅僅能夠追的上他的腳步,ram和別的掛在各匯流排上的裝置則難以望其項背。那當多個任務要執行的時候怎麼辦呢?輪流著來?或者誰優先順序高誰來?不管怎麼樣的策略,一句話就是在cpu看來就是輪流著來。而且因為速度差異,cpu實際的執行時間和等待執行的時間是數量級的差異。比如工作1秒鐘,休息乙個月。所以多個任務,輪流著來,讓cpu不那麼無聊,給流逝的時間增加再多一點點的意義。這些任務,在外在表現上就彷彿是同時在執行。
乙個必須知道的事實:執行一段程式**,實現乙個功能的過程之前 ,當得到cpu的時候,相關的資源必須也已經就位,就是萬事俱備只欠cpu這個東風。所有這些任務都處於就緒佇列,然後由作業系統的排程演算法,選出某個任務,讓cpu來執行。然後就是pc指標指向該任務的**開始,由cpu開始取指令,然後執行。
這裡要引入乙個概念:除了cpu以外所有的執行環境,主要是暫存器的一些內容,就構成了的程序的上下文環境。程序的上下文是程序執行的環境。當這個程式執行完了,或者分配給他的cpu時間片用完了,那它就要被切換出去,等待下一次cpu的臨幸。在被切換出去做的主要工作就是儲存程式上下文,因為這個是下次他被cpu臨幸的執行環境,必須儲存。
串聯起來的事實:前面講過在cpu看來所有的任務都是乙個乙個的輪流執行的,具體的輪流方法就是:先載入程序a的上下文,然後開始執行a,儲存程序a的上下文,調入下乙個要執行的程序b的程序上下文,然後開始執行b,儲存程序b的上下文
。。。。
*****==== 重要的東西出現了*****===
程序和執行緒就是這樣的背景出來的,兩個名詞不過是對應的cpu時間段的描述,名詞就是這樣的功能。
執行緒是什麼呢?
程序的顆粒度太大,每次的執行都要進行程序上下文的切換。如果我們把程序比喻為乙個執行在電腦上的軟體,那麼乙個軟體的執行不可能是一條邏輯執行的,必定有多個分支和多個程式段,就好比要實現程式a,實際分成 a,b,c等多個塊組合而成。那麼這裡具體的執行就可能變成:
程式a得到cpu =》cpu載入上下文,開始執行程式a的a小段,然後執行a的b小段,然後再執行a的c小段,最後cpu儲存a的上下文。
這裡a,b,c的執行是共享了a程序的上下文,cpu在執行的時候僅僅切換執行緒的上下文,而沒有進行程序上下文切換的。程序的上下文切換的時間開銷是遠遠大於執行緒上下文時間的開銷。這樣就讓cpu的有效使用率得到提高。這裡的a,b,c就是執行緒,也就是說執行緒是共享了程序的上下文環境,的更為細小的cpu時間段。執行緒主要共享的是程序的位址空間。
到此全文結束,再乙個總結:
程序和執行緒都是乙個時間段的描述,是cpu工作時間段的描述,不過是顆粒大小不同。
注意這裡描述的程序執行緒概念和實際**中所說的程序執行緒是有區別的。程式語言中的定義方式僅僅是語言的實現方式,是對程序執行緒概念的物化。
執行緒和程序的區別
易於排程。執行緒切換比程序切換要快。虛擬記憶體空間,io裝置等 開銷小。建立執行緒比建立進行要快,所需開銷小。進展用少量資源,如棧和暫存器。提高併發性。程序可以建立多個執行緒來執行統一程式的不同任務。有利於充分發揮多處理器的功能。通過建立多執行緒的程序,每個執行緒在乙個處理器上執行,從而實現了應用程...
執行緒和程序的區別
這個問題我查了不下4次,每次都是突然想到查一下,當時明白,完了又會混淆 首先我們知道 程序 執行緒 執行緒 在乙個程式裡面的多個任務,比如賣票系統,他有退票和賣票的功能,我們就可以給他稱之為執行緒。程序 我們開啟任務管理器可以看到的是我們在系統上執行的程式稱之為執行緒 總之,乙個程式必須有乙個程序,...
執行緒和程序的區別
1.計算機的核心是cpu,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。2.假定工廠的電力有限,一次只能供給乙個車間使用。也就是說,乙個車間開工的時候,其他車間都必須停工。背後的含義就是,單個cpu一次只能執行乙個任務。3.程序就好比工廠的車間,它代表cpu所能處理的單個任務。任一時刻,cpu...