程序是系統資源分配的最小單位
執行緒就是執行在程序上下文中的邏輯流。
執行緒是作業系統能夠進行運算排程的最小單位。
相對子例程而言,協程更為一般和靈活,但在實踐中使用沒有子例程那樣廣泛。
根據維基百科對子例程的描述:是乙個大型程式中的某部分**,由乙個或多個語句塊組成。它負責完成某項特定任務,而且相較於其他**,具備相對的獨立性。我可以將子例程理解為乙個函式。
首先,程序提供給應用程式的關鍵抽象為:
從以上描述我可以看出,乙個程序是乙個獨立進行的任務,它占用的系統資源有:位址空間,全域性變數,檔案描述符,硬體資源等。
程序出現的目的,是為了更好的利用cpu資源。例如:
假設有兩個任務a和b,當a遇到io操作,cpu默默的等待任務a讀取完操作再去執行任務b,這樣無疑是對cpu資源的極大的浪費。若在任務a讀取資料時,讓任務b執行,當任務a讀取完資料後,再切換到任務a執行,這樣就可以更好地利用cpu資源。這裡的切換涉及到狀態的儲存,狀態的恢復,需要有乙個東西去記錄任務a和任務b分別需要什麼資源,怎樣去識別任務a和任務b,這時程序就出現了。
因此,通過程序來分配系統資源,標識任務。
如何分配cpu去執行程序稱之為排程,程序狀態的記錄,恢復,上下文切換(簡稱切換)。
其次,若上面提及的任務a是乙個文字程式,需要接受鍵盤輸入,將內容顯示在螢幕上,還需要儲存資訊到硬碟中。
若只有乙個程序,會造成同一時間只能幹一樣事的尷尬(當儲存時,就不能通過鍵盤輸入內容)。若有多個程序,每個程序負責乙個任務,程序a負責接收鍵盤輸入的任務,程序b負責將內容顯示在螢幕上的任務,程序c負責儲存內容到硬碟中的任務。這裡程序a,b,c間的協作涉及到了程序通訊問題,而且有共同都需要擁有的東西-------文字內容,不停的切換造成效能上的損失。若有一種機制,可以使任務a,b,c共享資源,這樣上下文切換所需要儲存和恢復的內容就少了,同時又可以減少通訊所帶來的效能損耗,那就好了。這時執行緒出現了。
因此,執行緒共享程序的大部分資源,並參與cpu的排程。
假設當涉及到大規模的併發請求連線時,例如有一萬個人同時連線我的伺服器,但系統資源有限,如果以執行緒作為處理單元,調內部系統資源的話大部分執行緒都處於等待狀態,但用了協程就可以實現執行緒自己排程,不陷入核心級別的上下文切換。這時協程出現了。
為什麼協程不需要經過核心級別的上下文切換,我是這樣認為的:
程序和執行緒都是作業系統自帶的,協程是有些程式原生支援的,例如go,lua, 有些是後期版本才有的,比如python2.5 c#等。
在此引用一位從事伺服器開發的前輩說的話:
核心只有乙個,執行緒是作業系統排程,協程是使用者態排程。協程不必須是語言整合,例如c語言可以用setjmp/longjmp實現,也可以自己通過改變esp指標換棧實現協程。 協程本身跟高吞吐沒任何關係,基於io多路復用+**就可以實現高併發和高吞吐。引入協程是為了將**邏輯變成線性同步邏輯。
程序 執行緒 協程
多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...
程序 執行緒 協程
程序是系統資源分配的最小單位,系統由乙個個程序 程式 組成。一般情況下,包括文字區域 text region 資料區域 data region 和堆疊 stack region 檔案描述符表 程序每次開啟乙個檔案,系統就會在該程序的使用者檔案描述符表中分配乙個相應的表項,表項的索引返回給該程序,用於...
執行緒 程序 協程
執行緒是作業系統中進行運算排程的最小單位。執行緒被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序可以併發多個執行緒,每條執行緒並行執行不同的任務。乙個執行緒是乙個execution context 執行上下文 即乙個cpu執行時所需要的一串指令。每個獨立...