執行緒與程序的總體區別
程序和執行緒的總體區別
程序
什麼是程序?
- 程式的一個執行例項
- 正在執行的程式
- 核心觀點:擔當分配系統資源(cpu時間或記憶體)的實體。
程序就是一個程式在一個數據集上的一次動態執行過程。
程序由以下三部分組成:
1、程式:我們編寫的程式用來描述程序要完成哪些功能以及如何完成。
2、資料集:資料集則是程式在執行過程中需要的資源,比如圖片、音視訊、檔案等。
3、程序控制塊:程序控制塊是用來記錄程序的外部特徵,描述程序的執行變化過程,系統可以用它來控制和管理程序,它是系統感知程序存在的唯一標記。
執行緒
什麼是執行緒?
- 在一個程式裡的一個執行路徑
- 一個程序內部的控制序列
- 一切程序至少都有一個執行執行緒
執行緒是作業系統能夠進行運算排程的最小單位,是一串指令的集合。它被包含在程序之中,是程序中的實際運作單位。
一個執行緒指的是程序中一個單一順序的控制流。一個程序中可以併發多條執行緒,每條執行緒並行執行不同的任務。
執行緒工作方式:多個執行緒可以共享一個cpu,cpu在每個執行緒上執行一會兒,讓我們感覺到是多工在執行,但其實同一時間同一核心只能運算一個東西。
執行緒與程序區別:
- 程序是資源的集合,執行緒是真正負責執行的指令集。
- 一個執行緒就是一堆暫存器的組合。
- 一個程序是進行運算時候一堆相關資源的集合。
1、兩者工作方式
- 程序不能單獨執行,它只是資源的集合。
- 程序要操作CPU,必須要先建立一個執行緒。
- 所有在同一個程序裡的執行緒,是同享同一塊程序所佔的記憶體空間。
2、兩者關係
- 程序中第一個執行緒是主執行緒,主執行緒可以建立其他執行緒。其他執行緒也可以建立執行緒。執行緒之間是平等的。
- 程序有父程序和子程序,獨立的記憶體空間,唯一的識別符號:pid。
- 一個執行緒可以控制和操作同一程序裡的其他執行緒,但是程序只能操作子程序
3、兩者速度
- 程序快還是執行緒快?沒有可比性,程序要一個執行緒帶起來。
- 啟動一個執行緒快還是程序快?啟動執行緒快,執行緒就是一堆指令。
- 執行緒共享記憶體空間,程序的記憶體是獨立的。
4、兩者建立
- 父程序生成子程序,相當於複製一份記憶體空間,程序之間不能直接訪問,需要中間代理實現。
- 建立新執行緒很簡單,建立新程序需要對父程序進行一次複製。
- 一個執行緒可以控制和操作同級執行緒裡的其他執行緒,但是程序只能操作子程序。
5、兩者互動
- 同一個程序裡的執行緒之間可以直接訪問。
- 兩個程序想通訊必須通過一箇中間代理來實現。
程序和執行緒的優缺點比較
1、多程序模式穩定性高
因為一個子程序崩潰了,不會影響主程序和其他子程序。(當然主程序掛了所有程序就全掛了,但是主程序只負責分配任務,掛掉的概率低)著名的Apache最早就是採用多程序模式。
2、多程序模式建立程序的代價大
在Unix/Linux系統下,用fork呼叫還行,在Windows下建立程序開銷巨大。另外,作業系統能同時執行的程序數也是有限的,在記憶體和CPU的限制下,如果有幾千個程序同時執行,作業系統連排程都會成問題。華陽男性丁丁會勃起困難的原因?
3、多執行緒模式通常比多程序快
多執行緒比多程序快一點,但是也快不到哪去,而且,多執行緒模式致命的缺點就是任何一個執行緒掛掉都可能直接造成整個程序崩潰,因為所有執行緒共享程序的記憶體。在Windows上,如果一個執行緒執行的程式碼出了問題,你經常可以看到這樣的提示:“該程式執行了非法操作,即將關閉”,其實往往是某個執行緒出了問題,但是作業系統會強制結束整個程序。
4、多執行緒效率高
在Windows下,多執行緒的效率比多程序要高,所以微軟的IIS伺服器預設採用多執行緒模式。由於多執行緒存在穩定性的問題,IIS的穩定性就不如Apache。為了緩解這個問題,IIS和Apache現在又有多程序+多執行緒的混合模式,真是把問題越搞越複雜。