一、進程
操作系統中最核心的概念是進程,分佈式系統中最重要的問題是進程間通訊。
進程是「程式執行的一個範例」 ,擔當分配系統資源的實體。進程建立必須分配一個完整的獨立地址空間。
進程切換只發生在內核態,兩步:1 切換頁全域性目錄以安裝一個新的地址空間 2 切換內核態堆疊和硬體上下文。 另一種說法類似:1 儲存CPU環境(暫存器值、程式計數器、堆疊指針)2修改記憶體管理單元MMU的暫存器 3 轉換後備緩衝器TLB中的地址轉換快取內容標記爲無效
二、執行緒
書中的定義:執行緒是進程的一個執行流,獨立執行它自己的程式程式碼。
維基百科:執行緒(英語:thread)是操作系統能夠進行運算排程的最小單位。
執行緒上下文一般只包含CPU上下文及其他的執行緒管理資訊。執行緒建立的開銷主要取決於爲執行緒堆疊的建立而分配記憶體的開銷,這些開銷並不大。執行緒上下文切換髮生在兩個執行緒需要同步的時候,比如進入共用數據段。切換隻CPU暫存器值需要儲存,並隨後用將要切換到的執行緒的原先儲存的值重新載入到CPU暫存器中去。
使用者級執行緒主要缺點在於對引起阻塞的系統呼叫的呼叫會立即阻塞該執行緒所屬的整個進程。內核實現執行緒則會導致執行緒上下文切換的開銷跟進程一樣大,所以折衷的方法是輕量級進程(Lightweight)。在linux中,一個執行緒組基本上就是實現了多執行緒應用的一組輕量級進程。我理解爲 進程中存在使用者執行緒、輕量級進程、內核執行緒。
語言層面實現輕量級進程的比較少,stackless python,erlang支援,java並不支援
三、協程
協程的定義?顏開、許式偉均只說協程是輕量級的執行緒,一個進程可輕鬆建立數十萬計的協程。仔細研究下,個人感覺這些都是忽悠人的說法。從維基百科上看,從Knuth老爺子的基本演算法捲上看「子程式其實是協程的特例」。子程式是什麼?子程式(英語:Subroutine, procedure, function, routine, method, subprogram),就是函數嘛!所以協程也沒什麼了不起的,就是種更一般意義的程式元件,那你記憶體空間夠大,建立多少個函數還不是隨你麼?
協程可以通過yield來呼叫其它協程。通過yield方式轉移執行權的協程之間不是呼叫者與被呼叫者的關係,而是彼此對稱、平等的。協程的起始處是第一個入口點,在協程裡,返回點之後是接下來的入口點。子例程的生命期遵循後進先出(最後一個被呼叫的子例程最先返回);相反,協程的生命期完全由他們的使用的需要決定。
1、多進程與多執行緒比較
執行緒是bai指進程內的du一zhi個執行單元,也是進程內的可排程實體。dao執行緒與進程的區別:
1) 地址空間:執行緒是進程內的一個執行單元,進程內至少有一個執行緒,它們共用進程的地址空間,而進程有自己獨立的地址空間
2) 資源擁有:進程是資源分配和擁有的單位,同一個進程內的執行緒共用進程的資源
3) 執行緒是處理器排程的基本單位,但進程不是
4) 二者均可併發執行
5) 每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口,但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制
2、協程與多執行緒進行比較
1) 一個執行緒可以多個協程,一個進程也可以單獨擁有多個協程,這樣python中則能使用多核CPU。
2) 執行緒進程都是同步機制 機製,而協程則是非同步
3) 協程能保留上一次呼叫時的狀態,每次過程重入時,就相當於進入上一次呼叫的狀態
3、執行緒與進程與協程的比較
進程擁有自己獨立的堆和棧,既不共用堆,亦不共用棧,進程由操作系統排程。
執行緒擁有自己獨立的棧和共用的堆,共用堆,不共用棧,執行緒亦由操作系統排程(標準執行緒是的)。
協程和執行緒一樣共用堆,不共用棧,協程由程式設計師在協程的程式碼裡顯示排程。
進程和其他兩個的區別還是很明顯的。
協程和執行緒的區別是:協程避免了無意義的排程,由此可以提高效能,但也因此,程式設計師必須自己承擔排程的責任,同時,協程也失去了標準執行緒使用多CPU的能力。