Go 語言入門很簡單 -- 15. Go 并發基礎知識 #私藏項目實操分享#
在操作系統中,進程和線程的執行都具有并發性。
并發是指向一段時間內,多個任務可以共享系統資源,同時執行。
并行是指從某個時刻開始,多個任務同時執行。
程序的順序執行
如果在程序中,語句一條語句一條語句順序排列的,如果系統中只有一個程序,那么程序執行時也是按照程序語句排列先后次序,一條一條地執行下去。這種方式就像工廠生產流水線加工方式那樣,這種程序設計方式就叫做順序程序設計。
在單任務、單處理機系統環境中,內存中只有一道程序作業在執行,一個程序完成后,下一個程序作業才能進入內存繼續執行。
這種順序執行的程序有三個特點:
嚴格順序執行。每條程序語句的執行都以前一條語句的結束為前提條件
一個程序在計算機中運行時獨占全部系統資源。只有程序本身的動作才能改變程序的運行環境。
程序的執行結果與程序的運行速度無關。即處理機在執行程序任何兩條語句之間的停頓,對程序的運算結果不發生影響。
這三個特點概括起來就是程序的封閉性和可再現性。
封閉性:程序一旦運行起來,其計算結果僅僅取決于程序本身,即運行結果唯一。
可再現性:指同一程序可反復執行,且每次執行結果相同。
程序的并發執行
程序的順序執行限制系統內存中只有一道程序作業,這顯然限制了系統性能的發揮,且資源利用率不高。
現代操作系統都支持程序的并發執行。
所謂并發執行是指在同一時間間隔內,多個程序可以“同時”執行。
在單處理機系統中,進程(或線程)通過時間片或者讓出控制權來實現任務切換,以達到“同時”運行多個程序的目的。
這種方式叫做程序并發執行,但實際上任何時刻都只有一個任務被執行,其他任務則通過某個算法來排隊準備執行。
即宏觀上多個程序任務是“同時”執行,但微觀上各任務還是一個一個地順序執行。
程序的并發執行可以使得多個程序可以共享系統資源,提高系統資源利用率,還可以增加系統吞吐量。
同時,系統的并發執行和資源共享也使得系統環境變得非常復雜,不像順序執行那么簡單。
程序的并發執行基本是由操作系統提供的,Go 在語言層面就支持并發特性。
程序的并行執行
和并發執行不同,程序的并行執行是指同一時刻,多個程序可以同時執行。在多處理機系統中,可以讓多個進程,或同一進程內的多個線程做到真正意義上的同時執行,它們之間不需要排隊(這是在理想情況下,系統中進程(線程)的數量可能超過處理機的數量,這是依然需要排隊)。在這種情況下,多個程序才能達到真正意義上的“同時”執行,即并行執行。
進程的概念
進程是在并發環境下,程序的一次動態執行過程。它由進程控制塊(PCB)、程序和數據三部分組成,進程在它的生命周期內可能處于執行、就緒、阻塞三種基本狀態。
在多任務操作系統中,多個進程可以并發執行,而且進程是系統資源分配的基本單位。系統中每個進程都有自己的內存映像區,且互不影響,所以管理簡單,但缺點是系統開銷大。所以,系統能同時創建的進程數量是有限的,不能太多。
線程的概念
由于進程的系統開銷大,操作系統的設計者們又提出來更小的獨立運行的單位——線程。
通過線程來提高系統內程序并發執行的程度,從而進一步提高系統的吞吐量。
在操作系統中,線程是由進程創建的,所以它繼承了進程的部分資源,且具有進程的一些基本特征。所以多個線程之間也可以并發執行,且比進程的系統開銷小。
但是,和進程一樣,線程依然是由系統內核管理的,所以在高并發情況下,系統能創建的線程數量依然有限,效率也不高。
協程的概念
協程本質上是一種用戶態線程,不需要操作系統進行搶占式調度,而且在真正的實現中寄存于線程中。因此,協程系統開銷極小,可以有效提高線程任務的并發性,避免高并發模式下線程的缺點。
協程最大優勢在于其“輕量級”,可以輕松創建上百萬個而不會導致系統資源衰竭,而系統最多能創建的進程、線程的數量卻少得多。
使用協程的有點是編程簡單,結果清晰。但缺點是需要語言的支持,如果語言不支持,則需要用戶在程序中自行實現調度。
目前,原生支持協程的語言還很少。
Goroutine
Go 語言在語言級別支持輕量級線程,叫做 Goroutine,Go 語言標準庫提供的所有系統調用操作(包括同步I/O操作),都會讓出處理機給其他 Goroutine。這使得輕量級線程的切換管理不依賴于系統的進程和線程,也不依賴于 CPU 的核心數量。
Go 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。