程序的出現是為了更好的利用cpu資源使到併發成為可能。假設有兩個任務a和b,當a遇到io操作,cpu默默的等待任務a讀取完操作再去執行任務b,這樣無疑是對cpu資源的極大的浪費。聰明的老大們就在想若在任務a讀取資料時,讓任務b執行,當任務a讀取完資料後,再切換到任務a執行。注意關鍵字切換,自然是切換,那麼這就涉及到了狀態的儲存,狀態的恢復,加上任務a與任務b所需要的系統資源(記憶體,硬碟,鍵盤等等)是不一樣的。自然而然的就需要有乙個東西去記錄任務a和任務b分別需要什麼資源,怎樣去識別任務a和任務b等等。登登登,程序就被發明出來了。通過程序來分配系統資源,標識任務。如何分配cpu去執行程序稱之為排程,程序狀態的記錄,恢復,切換稱之為上下文切換。程序是系統資源分配的最小單位,程序占用的資源有:位址空間,全域性變數,檔案描述符,各種硬體等等資源。
執行緒的出現是為了降低上下文切換的消耗,提高系統的併發性,並突破乙個程序只能幹一樣事的缺陷,使到程序內併發成為可能。假設,乙個文字程式,需要接受鍵盤輸入,將內容顯示在螢幕上,還需要儲存資訊到硬碟中。若只有乙個程序,勢必造成同一時間只能幹一樣事的尷尬(當儲存時,就不能通過鍵盤輸入內容)。若有多個程序,每個程序負責乙個任務,程序a負責接收鍵盤輸入的任務,程序b負責將內容顯示在螢幕上的任務,程序c負責儲存內容到硬碟中的任務。這裡程序a,b,c間的協作涉及到了程序通訊問題,而且有共同都需要擁有的東西-------文字內容,不停的切換造成效能上的損失。若有一種機制,可以使任務a,b,c共享資源,這樣上下文切換所需要儲存和恢復的內容就少了,同時又可以減少通訊所帶來的效能損耗,那就好了。是的,這種機制就是執行緒。執行緒共享程序的大部分資源,並參與cpu的排程, 當然執行緒自己也是擁有自己的資源的,例如,棧,暫存器等等。此時,程序同時也是執行緒的容器。執行緒也是有著自己的缺陷的,例如健壯性差,若乙個執行緒掛掉了,整乙個程序也掛掉了,這意味著其它執行緒也掛掉了,程序卻沒有這個問題,乙個程序掛掉,另外的程序還是活著。
程序,執行緒,協程不斷突破,更高效的處理阻塞,不斷地提高cpu的利用率。但是並不是說,執行緒就一定比程序快,而協程就一定不執行緒要快。具體還是要看應用場景。可以簡單粗暴的把應用分為io密集型應用以及cpu密集型應用。
多核cpu,cpu密集型應用
此時多執行緒的效率是最高的,多執行緒可以使到全部cpu核心滿載,又避免了協程間切換造成效能損失。當cpu密集型任務時,cpu一直在利用著,切換反而會造成效能損失,即便協程上下文切換消耗最小,但也還是有消耗的。
多核cpu,io密集型應用
此時採用多執行緒多協程效率最高,多執行緒可以使到全部cpu核心滿載,而乙個執行緒多協程,則更好的提高了cpu的利用率。
單核cpu,cpu密集型應用
單程序效率是最高,此時單個程序已經使到cpu滿載了。
單核cpu,io密集型應用
多協程,效率最高。例如,看了上面應該也是知道的了
並行就是指同一時刻有兩個或兩個以上的「工作單位」在同時執行,從硬體的角度上來看就是同一時刻有兩條或兩條以上的指令處於執行階段。所以,多核是並行的前提,單執行緒永遠無法達到並行狀態。可以利用多執行緒和度程序到達並行狀態。另外的,python的多執行緒由於gil的存在,對於python來說無法通過多執行緒到達並行狀態。
對於併發的理解,要從兩方面去理解,1.併發設計 2.併發執行。先說併發設計,當說乙個程式是併發的,更多的是指這個程式採取了併發設計。
併發設計的標準:使多個操作可以在重疊的時間段內進行,這裡的重點在於重疊的時間內, 重疊時間可以理解為一段時間內。例如:在時間1s秒內, 具有io操作的task1和task2都完成,這就可以說是併發執行。所以呢,單執行緒也是可以做到併發執行的。當然啦,並行肯定是併發的。乙個程式能否併發執行,取決於設計,也取決於部署方式。例如, 當給程式開乙個執行緒(協程是不開的),它不可能是併發的,因為在重疊時間內根本就沒有兩個task在執行。當乙個程式被設計成完成乙個任務再去完成下乙個任務的時候,即便部署是多執行緒多協程的也是無法達到併發執行的。
並行與併發的關係:併發的設計使到併發執行成為可能,而並行是併發執行的其中一種模式。
程序 執行緒 協程
多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...
程序 執行緒 協程
程序是系統資源分配的最小單位,系統由乙個個程序 程式 組成。一般情況下,包括文字區域 text region 資料區域 data region 和堆疊 stack region 檔案描述符表 程序每次開啟乙個檔案,系統就會在該程序的使用者檔案描述符表中分配乙個相應的表項,表項的索引返回給該程序,用於...
執行緒 程序 協程
執行緒是作業系統中進行運算排程的最小單位。執行緒被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序可以併發多個執行緒,每條執行緒並行執行不同的任務。乙個執行緒是乙個execution context 執行上下文 即乙個cpu執行時所需要的一串指令。每個獨立...