Go 優勢

目錄

    討論下目前語言的優劣,密集型計算的發展方向,面向併發的內存模型的演進,從幾個角度來分析下:

    1. CPU
      早期語言(C語言),CPU都是以單核的形式順序執行機器指令。順序執行意味着在同一時刻只能在一個cpu順序執行。
      單核CPU發展停滯,編程語言逐漸開始朝着多核並行化的方向發展,而Go也是在多核環境下原生支持併發的編程語言典範。

    2. 內存
      常見的並行編程模型有多線程、消息傳遞等。由於多線程併發模型可以自然對應到多核的處理器,主流的操作系統因此也都提供了系統級的多線程支持,同時從概念上講多線程似乎也更直觀,因此多線程編程模型逐步被吸納到主流的編程語言特性或語言擴展庫中。

    每個系統級線程都會有一個固定大小的棧(一般默認可能是2MB),這個棧主要用來保存函數遞歸調用時的參數和局部變量。固定了棧的大小導致了兩個問題:

    • 對於很多隻需要很小的棧空間的線程是一個巨大的浪費;
    • 是對於少數需要巨大棧空間的線程又面臨棧溢出的風險

    針對這兩個問題的解決方案是:要麼降低固定的棧大小,提升空間的利用率;要麼增大棧的大小以允許更深的函數遞歸調用,但這兩者是無法兼得的

    一個Goroutine會以一個很小的棧啓動(可能是2KB或4KB),當遇到深度遞歸導致當前棧空間不足時,Goroutine會根據需要動態地伸縮棧的大小(主流實現中棧的最大值可達到1GB)。因爲啓動的代價很小,所以我們可以輕易地啓動成千上萬個Goroutine。

    1. 調度
      線程是系統調度的最小單元,實現搶佔式的任務,在共享變量和線程間通信比較複雜。 而協程受程序本身調度,Go語言共享變量的支持很完善,且gorutine間的通信有通道、信號等,消息隊列的通信在golang語言中運用非常強大,個人覺得在很多
      以往開發習慣上帶來便利。
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章