好久沒有更新博客了,離上一篇博客有小半年的時間了,今天的主題就聊聊Golang吧。
Go最近兩年是門特別火的語言,想必大家也知道他是谷歌一眾大神開發(fā)出來的一種高并發(fā)、跨平臺的靜態(tài)語言,號稱“二十一世紀的C語言”,確實他的語法跟C很相似,語法比較簡單,有其他語言基礎的童鞋上手也比較容易,下面先談談他的語言特性:
- 靜態(tài)類型和編譯型:
變量或常量申明時必須指定類型且不可改變;程序必須通過編譯生成可執(zhí)行的二進制文件。 - 跨平臺:
支持大部門主流的計算架構和操作系統(tǒng),下載相應平臺的語言安裝包即可。 - 自動垃圾回收機制
程序運行過程中創(chuàng)建的對象由Go的運行時系統(tǒng)全權負責回收,這是高級語言必有得特性,與Java類似。 - 并發(fā)編程:
有自己的并發(fā)編程模型,主要由goroutine和channel組成,還有go關鍵字。 - 多編程范式:
支持函數(shù)式編程和面向對象編程。
聊完基本特性,接下來我們看看目前主流語言所采用的多線程模型。線程主要分為用戶線程和內核線程,用戶線程由各語言代碼所支持,而內核線程是由操作系統(tǒng)內核所支持。多線程模型主要就是用戶線程與內核線程的連接方式:
- 多對一模型(M : 1):多個用戶級線程映射到一個內核級線程,線程管理在用戶空間完成。
thread_1.png
優(yōu)點:線程上下文切換都發(fā)生在用戶空間,避免模態(tài)切換(mode switch),從而對于性能有 積極的影響。
缺點:所有的線程基于一個內核調度實體即內核線程,多核處理器得不到更好的利用。 -
一對一模型(1 : 1):每個用戶級線程映射到一個內核級線程。
thread_2.png
優(yōu)點:多處理器硬件下,內核空間線程模型支持了真正的并行,當一個線程被阻塞后,允許另一個線程繼續(xù)執(zhí)行,所以并發(fā)能力較強。
缺點:每創(chuàng)建一個用戶級線程都需要創(chuàng)建一個內核級線程與其對應,這樣創(chuàng)建線程的開銷比
較大,會影響到應用程序的性能。 -
多對多模型(M : N):內核線程和用戶線程的數(shù)量比為 M : N,綜合了前兩種的優(yōu)點。
thread_3.png
優(yōu)點:這種模型實際上是多個線程被綁定到了多個內核線程上,這使得大部分的線程上下文切換都發(fā)生在用戶空間,而多個內核線程又可以充分利用處理器資源。
Go實現(xiàn)了多對多模型(M : N)線程模型,Golang內部的調度器(scheduler)可以讓多核CPU中的每個CPU執(zhí)行一個goroutine(協(xié)程的一種實現(xiàn)),所以想理解goroutine的并發(fā)機制原理就需要了解Go的調度器的工作原理。


