原创 docker推拉時的數據交換詳解

前言 docker用了這麼久了, 有沒有想過, 在執行docker push 和 docker pull命令的時候, 數據是如何傳遞的呢? 換句話說, 如果要實現一個鏡像倉庫, 針對推拉的服務, 如何實現接口呢? 根據OCI 分發規範文檔

原创 一種計數算法

前言 常見的一個問題: 給定一個整形數組, 統計其中有多少唯一的元素. 常見的思路有哪些呢? 元素去重並統計, 利用哈希表進行去重計數. 數組排序後統計 以上空間複雜度均與元素數量關聯, 如果允許損失精度, 是否可以使用較低的空間佔用來

原创 使用Go實現一個百行聊天服務器

前段時間, redis作者不是整了個c語言版本的聊天服務器嘛, 地址, 代碼量攏共不過百行. 於是, 心血來潮下, 我也整了個Go語言版本. 簡單來說就是實現了一個聊天室的功能. 將所有註釋空行都去掉, 剛好100行實現. 廢話不多說, 先

原创 正則表達式使用文檔

通過網站 https://regex101.com/ 可以測試正則表達式的匹配結果及匹配過程. 本文章拋開各個編程語言實現差異, 僅做正則本身的介紹, 會盡量將正則這玩意說明白, 使得你看完這邊文章後對正則基本可以運用自如. 溫馨提示, 這

原创 GPU掃盲

前言 相信對於軟件工程師來說, CPU並不陌生. 人工智能以及機器學習帶火了GPU. 經常聽到的就是, GPU計算比CPU快, 但具體是怎麼快的卻從未刨根問底. 之前在聽到GPU的時候, 我有過這樣的疑問: GPU是什麼? 爲什麼比CPU

原创 容器鏡像靜態掃描原理

前言 有這樣一個工具, 可以對鏡像進行掃描, 拿出其中包含的軟件包、lib庫(pip包等)、危險文件等, 並能夠識別出哪些包是存在漏洞的. 比如trivy工具. 那麼他們是如何做到這件事情的呢? 正好最近在研究這塊, 索性就簡單談一談(其實

原创 Docker鏡像存儲

前言 在之前的文章中有說過容器目錄的隔離機制. 今天來分析一下鏡像的文件系統. Docker 已經用了很久了, 也知道鏡像存儲的時候是分層存儲的(從docker pull時分層下載就能看出), 但是具體是如何將多層進行聚合並生成最終展示的文

原创 k8s 中 pod 是如何做到網絡共享的

前言 在k8s中, pod是編排的最小單位, 在同一個pod中, 容器之間能夠共享hostname network 等內容. 共享network, 簡單說就是同一個pod中的容器, 可以通過訪問localhost互相訪問, 且端口占用會衝突

原创 容器目錄掛載原理

前言 就我目前的對容器的瞭解, 使用namespace技術實現隔離, 使用cgroups技術實現資源限制. 但是具體是如何實現卻從未深究過. 閒來無事, 挑其中的Mount Namespace來康康, 容器是如何實現目錄隔離的. 目錄隔離

原创 go test main包報錯

前言 先提出問題, 再說明原因. 有如下一段代碼: 當執行go test測試時, 會報如下錯誤: main.test /var/folders/55/47pl3jxx6rg7m0r6xvn4f7wr0000gn/T/go-build27

原创 Go map 內存泄露

前言 在Go中, map這個結構使用的頻率還是比較高的. 其實在所有的語言中, map使用的頻率都是很高的. 之前在使用中, 一直都知道map的內存在元素刪除的時候不會回收, 但一直沒有仔細的研究爲什麼. 今天就來好好揣摩揣摩. func

原创 Go 管道關閉引發的探索

前言 在日常開發中, 經常會使用chan來進行協程之間的通信. 對chan的操作也無外乎讀寫關. 而本次, 就是從chan的關閉而來. 假設我們對外提供的方法如下: type Chan struct { ch chan int } fu

原创 使用非遞歸來實現遞歸

我們應該遇到過很多次類似的題目了吧: 如何將一個遞歸函數使用非遞歸的方式實現.. 今天突然想到一個通用解, 就是可以在循環中模擬函數調用的方式來實現. 調用棧 以計算 1~n 的和舉例, 遞歸實現如下(Python爲例): def add_

原创 Go內存逃逸

前言 很久以前就聽過過內存逃逸這個詞, 最近了解了一下, 才發現是個很簡單的概念. 只要把前言部分看完, 就已經瞭解了. 來吧... 在介紹內存逃逸之前, 我們先用C語言來引出這個概念. 我們的進程在內存中有棧內存和堆內存的概念, 棧內存是

原创 Go內存更新問題

前言 在開始之前, 先來引出問題. 有這樣一段go代碼: func main() { var wg sync.WaitGroup wg.Add(2) var x, y int go func() { defer wg.Done(