原创 deBruijn 序列原理和應用

我們常常使用位圖來標記某塊區域的使用信息, bitmap是一個Uint32類型,bitmap=12,其對應的二進制爲:00000000,00000000,00000000,00001100。如果我們想找到最後的1在第幾個bit位,該如何做

原创 深入理解GO語言:goroutine協程及調度

對操作系統有過一些瞭解就知道linux下的線程其實是task_struct結構, 線程其實並不是真正運行的實體, 線程只是代表一個執行流和其狀態. 真正運行驅動流程往前的其實是CPU. CPU在時鐘的驅動下, 根據PC寄存器從程序中取指令

原创 深入理解GO語言:channel結構及方法

channel是在同一個進程內不同協程之間的通信方式, 最常見的goroutine就是協程。Channel代碼相對簡單,主要就是四個函數:初始化makechan,消息發送chansend,消息接收chanrecv,關閉通道closecha

原创 深入理解GO語言:內存分配

Go語言內置運行時(就是runtime),拋棄了傳統的內存分配方式,改爲自主管理,最開始是基於tcmalloc,雖然後面改動相對已經很大了。使用自主管理可以實現更好的內存使用模式,比如內存池、預分配等等,從而避免了系統調用所帶來的性能問題

原创 深入理解GO語言:map結構原理和源碼分析

Map結構是go語言項目經常使用的數據結構,map使用簡單對於數據量不大的場合使用非常合適。Map結構是如何實現的?我們先從測試程序入手,我們希望分析map的創建、插入、查詢、刪除等流程,因此我們的測試程序就要包括這幾種操作,測試程序如下

原创 深入理解GO語言原理:環境準備-----使用代碼編譯安裝方式來搭建go環境

打算做一期go內部函數實現原理講解,首先要搭建一套go的編譯環境,大家常見的都是直接使用官方發佈應編譯好的文件,這裏我們使用源碼編譯的方式來搭建go環境。 1、準備版本: https://studygolang.com/dl  下載所需要

原创 重溫經典:堆排序

堆排序是利用堆的性質進行排序的過程。堆排序包括構成初始堆和利用堆排序這兩個過程,堆分成大根堆和小根堆,這裏我們使用大根堆來展開討論。 例如我們有如下一組數據和其對應的完全二叉樹: {35、10、17、40、39、9、50、44、16、26

原创 重溫經典:快速排序

快速排序(quick sorting)又稱爲劃分排序。快速排序是對氣泡排序的一種改進,在氣泡排序中,進行元素的比較和交換式是在相鄰的單元中進行,每次只能前移或者後移一個位置,因而總的比較和移動次數較多。在快速排序中,記錄的比較和交換是從兩

原创 傳統存儲SAN、NAS和分佈式存儲、ServerSAN全面解讀

隨着主機、磁盤、網絡等技術的發展,對於存儲空間和性能的要求越來越高,服務器的內置磁盤往往不足以滿足存儲需的要求。因此,在內置存儲之外,服務器需要採用外置存儲的方式擴展存儲空間。 網絡連接存儲(簡稱NAS) 網絡儲存設備 (Network

原创 數據結構:二叉樹、平衡二叉樹、紅黑樹的原理差異和性能分析

樹是數據結構中的重中之重,尤其以各類二叉樹又是其中的難點,二叉樹種類繁多實現各異,我們主要講常見的二叉樹。 1、二叉樹 二叉樹是指樹的度爲2的一種樹。 滿二叉樹:在一棵二叉樹中,當第i層的節點個數爲2^(i-1)時稱此層是滿的,當樹中每一

原创 深入淺出理解reedsolomon庫數據冗餘算法原理和具體實現源碼分析

reedsolomon算法實現需要矩陣和伽羅華域(Galois Field)的一些知識,這兩者在前面都已做了介紹,並且這部分網上很多人都做了詳細說明,這裏再挑重點的部分能使用到的地方介紹一下。 1、伽羅華域運算: 伽羅瓦域,該域本質上是一

原创 糾刪碼(Erasure Code)及其演進LRC(Locally Repairable Codes)原理講解

如何保證存儲可靠性、數據可用性是大規模存儲系統的難點和要點。數據冗餘是保障存儲可靠性、數據可用性的最有效手段,傳統的冗餘機制主要有副本(Replication)和糾刪編碼(Erasure Code,以下簡稱糾刪碼或EC,raid是糾刪碼一

原创 行列式和矩陣:求解逆矩陣的伴隨矩陣法和初等變換法。

1、二階與三階行列式 有如下二元一次方程組 爲消去未知數X2,以a22、a12分別乘上列兩方程的兩端,然後兩個方程相減,得: 類似的消去X1可得: 當a11*a22-a12 *a21 != 0時,方程組的解: (2)式中的分子、分

原创 伽羅華域(Galois Field)有限域元素生成和運算原理

存儲編碼,矩陣等之間的運算都是在伽羅華域(Galois Field,GF,有限域)上進行的,所以要實現底層的運算庫,必須瞭解 GF 上的運算規則。 域: 一組元素的集合,以及在集合上的四則運算,構成一個域。其中加法和乘法必須滿足交換、結合

原创 golang 高性能日誌庫zap架構分析

工欲善其事,必先利其器,一個高性能的日誌庫對於項目的重要性不言而喻。在選擇日誌組件的時候也有多方面的考量:詳細的信息、及時的反饋是必不可少的,但是日誌的性能往往是決定是否可以採用的重要條件,在一個注重性能的程序中,如果日誌效率不高就會成爲