程序的出現是為了更好的利用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密集型應用
多協程,效率最高。例如,看了上面應該也是知道的了
協程與程序,執行緒
我們通常所說的協程coroutine其實是corporateroutine的縮寫,直接翻譯為協同的例程,一般我們都簡稱為協程。在linux系統中,執行緒就是輕量級的程序,而我們通常也把協程稱為輕量級的執行緒即微執行緒。程序是核心排程,而協程是在使用者態排程,也就是說程序的上下文是在核心態儲存恢復的,...
程序 執行緒與協程
程序 執行緒和協程是三個在多工處理中常聽到的概念,三者各有區別又相互聯絡。程序,直觀點說,儲存在硬碟上的程式執行以後,會在記憶體空間裡形成乙個獨立的記憶體體,這個記憶體體有自己獨立的位址空間,有自己的堆,上級掛靠單位是作業系統。作業系統會以程序為單位,分配系統資源 cpu時間片 記憶體等資源 程序是...
程序 執行緒 協程
多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...