不輟集

Go內存模型

本文講述在何種情況下,一個協程(goroutine)中寫入的變量值可被另一個協程中觀察到。

先發生(happens before)

讓我們來理清下時間的發生順序。

如果事件 e1在事件 e2 之前發生,那麼事件 e2 在事件 e1 之後發生。同樣,如果 e1 既不在事件 e2 之前也不在 e2 之後發生,那麼事件 e1 和 e2 同時發生。

接續讀落

網絡I/O

區分幾個概念:

  • 同步(synchronous)和異步(asynchronous)是消息通知的機制,是從消息發送方的角度看;
  • 阻塞(blocking)和非阻塞(non-blocking)是線程等待通知的過程,是從接收方的角度看。
    多路復用是指單一線程監聽多個文件描述符(file descriptor)。
  • 邊緣觸發(edge-trigger)和水平觸發(level-trigger)是當文件描述符關聯的內核緩衝區變化時通知應用程序的兩種方式。邊緣觸發是當狀態變化時通知,水平觸發是只要滿足條件就一直通知。
    epoll 默認是使用水平觸發,但提供邊緣觸發模式。
    所謂水平觸發,就是只要達到某個限定的水平就一直通知;而邊緣觸發是處在上升沿或下降沿的時候觸發。

接續讀落

Go調度器

現在有三種常見的線程模型,包括:

  1. N:1,即 N 個用戶線程對應一個系統線程,節省上下文(context switch)切換開銷;
  2. 1:1,即 1 個用戶線程對應一個系統線程,充分利用多個核心(multi-core);
  3. M:N,即 M 個用戶線程對應 N 個系統線程,節省上下文開銷並充分利用多個核心。

Go的線程調度模型就是 M:N。

接續讀落

Unicode 字符集及UTF編碼入門

開始介紹 Unicode 之前,我們先來做一道不定項選擇題。

問題1:請問以下說法正確的是()

A. 所有中文字符都可用 UTF-8 編碼,並佔用 3 個字節。
B. 字符串可以直接轉成字節數組,字節數組可以直接轉成字符串。
C. 文本的編碼順序跟其書寫順序一致,不一定是按從左到右從上到下順序。
D. 帶 BOM 的文本一定是 UTF-8 編碼,不帶 BOM 的文本不一定是 UTF-8 編碼。
E. Unicode、GBK 和 UTF-8 都是不同的編碼方式。
F. UTF-16 不兼容 ASCII 碼
G. 十進制的數字可以轉成二進制,因此不需要編碼。

答案文章末尾揭曉,如果著急想對答案可以先翻到末尾核對;如果想知道為什麼,那就帶著問題繼續往下看吧。

字符集

Unicode 是一種國際通用的字符集。

什麼是字符?計算機中的字符分為兩種:打印字符和非打印字符。打印字符包括數字、字母、漢字、假名、標點符號等等,非打印字符又稱之為控制字符,常見的有:回車(’\r’,U+000D)、換行(’\n’,U+000A)等等。

問題2:數字 123 由()個字符組成?

什麼是字符集?字符集就是字符的集合,不同的字符集包含的字符類型和數量可能不一樣。Unicode 是字符集的一種。

字符之所以能被計算機處理,其中最為關鍵的是字符能夠被正確地編碼和解碼。字符的編碼是字符在對應字符集中的序號。此序號是一個整數,稱之為字符碼點 (code point)。不同的字符集可能會對同樣的字符有不同的碼點表示,甚至沒有表示(並不是所有字符在字符集中都有定義)。

接續讀落

介紹Go程序性能分析工具 pprof

pprof 是 program profiling(程序分析)的縮寫,是 Go程序中重要的性能分析工具,包含兩個部分:

  1. 數據採集,由編譯到程序中的 pprof 庫實現。pprof 庫主要是指 “runtime/pprof” 包,另有 “net/http/pprof” 包引用 “runtime/pprof” 並以 HTTP 接口形式提供實時性能數據。
  2. 數據分析,使用 go tool pprof <source> 工具分析採集到的數據。

接續讀落