不輟集

網絡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> 工具分析採集到的數據。

接續讀落

比較 JSON 和 protobuf 並介紹 protobuf編碼、語法及 protobuf over HTTP 示例

Protocol Buffers(簡稱 protobuf),是 Google 推出的一種數據交換格式,採用 Varint 和 ZigZag 等二進制編碼,數據壓縮效果顯著,可用來傳輸數據或持久化數據。

JSON 是什麼?

JSON 全稱爲 JavaScript Object Notation(JavaScript對象標記),即 JS對象的字符串表示。其採用文本編碼,是現今最通用的數據交換格式。2001年3月,State Software公司的聯合創始人設計了此種格式,並隨後進行了標準化。現在有 ECMA-404(2013年)和 RFC-8259(2017年)兩種標準。

protobuf 是什麼?

protobuf 全稱爲 Protocol Buffers(“協議緩衝”),是一種數據壓縮性能優秀的數據存儲和交換格式。其採用二進制編碼,通常跟 gRPC 一起使用。

2001年 Google公司內部誕生了proto1版本,並隨後在2008年以BSD協議開源了proto2,2016年釋出proto3正式版。

對於 proto2,官方推出了針對 C++、Java、C# 和 Python 語言的 protobuf編譯器 protoc;而在 proto3 中,增加了對 Dart、GO、Kotlin 和 Ruby 的官方支持。另外,第三方有提供對 JavaScript 和 PHP 等等語言的支持。

接續讀落