標籤:資料 部分 自己的 做了 服務 核心管理 相同 web伺服器 並發編程
優雅的並發編程範式,完善的並發支援,出色的並發效能是go語言區別於其他語言的一大特色.
1.並發基礎
win和linux 出現之前,程式員並沒有並發的概念.因為命令式程式設計語言是以串列為基礎的,程式會順序執行每條指令,整個過程只有一個上下文,即一個調用棧,一個堆.
並發則意味著程式在運行時有多個執行內容,對應著多個調用棧.每一個進程在運行時都有自己的調用棧和堆,有一個完整的上下文,而作業系統在調用進程的時候,會儲存被調度進程的上下文,等該進程獲得時間片後,再回複該進程的上下文到系統中.從作業系統層面來看,多進程是可以並發的.
2.並發情境
一方面我們需要靈敏響應的圖形化使用者介面,一方面程式還需要執行大量的運算或IO密集操作,而我們需要介面響應與運算同時執行.
當web伺服器面對大量使用者請求時,需要更多的web伺服器工作單元來分別響應使用者.
事物處於分布式環境上,相同的工作單元在不同的電腦上處理著被分區的資料.
電腦的CPU從單核心向多核心的發展,而我們的程式都是串列的.電腦硬體的能力沒有得到發揮.
程式因為IO操作被阻塞,整個程式處於停滯狀態,其他IO無關的任務無法執行.
3.並發優勢
並發能客觀地表現問題模型
並發可以充分利用CPU核心的優勢,提高程式的執行效率
並發能充分利用CPU與其他硬體裝置固有的非同步性
4.並發主流實現模型
多進程:是作業系統層面進行並發的基本模式,也是開銷最大的模式.好處在於簡單,進程間互不影響,壞處在於系統開銷大,因為所有的進程都是由核心管理的.
多線程:在大部分作業系統上都屬於系統層面的併發模式,也是我們使用最多最有效一種模式.它比多進程的開銷小很多,但是其開銷依舊很大,並且在高併發模式下,效率會有影響.
基於回調的非阻塞/非同步IO:這種架構源於多線程的危機.通過事件驅動的方式使用非同步I/O,是伺服器持續運轉,且儘可能地少用線程,降低開銷,在node.js中得到了很好的實踐.但是這種模式編程比多線程還要複雜,因為它把流程做了分割,對於問題的反應不夠自然.
協程:本質上是一種使用者態線程,不需要作業系統進行搶佔式調度,且在真正的實現中寄存於線程中.因此系統開銷極度小,可以有效提高線程的任務並發性,而避免多線程的缺點,優點是需要語言的支援,如果不支援,則需要使用者在程式中自行實現調度器,目前原生支援協程的語言還很少.
go 並發編程(1)