原创 批量重命名文件

爲了避免 vscode ide跳轉到 golang plan9 代碼,需要把所有 “plan9” 到文件重命名,加上後綴.bak。 #! /bin/bash find .local/go/src -name "*plan9*"

原创 一鍵安裝gcc 和 docker

寫了一個腳本,自動化gcc 和 docker安裝過程。 優點: 自動化 快速 不依賴網絡 屏蔽配置細節 缺點: 對安裝過程無感知 只能安裝固定版本docker( docker ce 18),gcc( 9.1) gcc 腳本

原创 文件操作爲啥需要及時手動 close?

目前知道的原因: 文件打開後保存在操作系統buffer中,如果程序異常退出,造成系統資源浪費。 使用 file.close(),能夠讓os及時將buffer中的數據flush到文件裏。 防止在頻繁open操作的場景下的file

原创 多線程導致的內存泄漏

Joinable threads VS Detached threads 線程有兩種運行模式: Joinable Mode Detached Mode Joinable Thread & pthread_join() #inc

原创 內存釋放free函數如何知道內存大小

想知道free如何工作那肯定需要知道malloc如何工作,正所謂怎麼來的就怎麼回去。 使用malloc分配內存時候根據參數指定的大小,分配一塊內存,然後返回這塊內存的起始位置給調用者,這就是調用者拿到的所謂的指針。 起始這個指針並

原创 pre-binary 安裝docker

由於公司centos開發機有網絡完全設置,總是存在網絡不通或者外網不通或者yum源不全等各種各樣等問題,導致我安裝docker環境處處碰壁。 現在這裏記錄一下我是用 pre-binaries 離線安裝docker的過程。 1. 準備

原创 語義化版本編號

原创 linux進程虛擬內存

在現代操作系統中,進程之間共享使用cpu和內存,但是內存資源有限,爲了更加高效地使用內存,現代操作系統提供一個內存抽象—虛擬內存。虛擬內存巧妙地利用內存,地址轉換,磁盤文件和操作系統內核來爲每一個進程提供足夠大的統一的私有地址空間。虛

原创 爲啥redis是單線程的?

看到網上一些討論,現在在這裏整理一下。 多線程編程複雜並且線程之間需要加鎖,影響性能 CPU並不是瓶頸,網絡纔是瓶頸。redis 是一個server,通過網絡io與多個client交互。 多線程並不意味着更快。redis設計成單線程

原创 虛擬機實現(C語言)

reference: https://felixangell.com/blog/implementing-a-virtual-machine-in-c/ 介紹 這裏寫篇文章介紹一下用C語言實現虛擬機。我喜歡從事底層程序的工作, 比

原创 C語言實現協程(coroutine)

Donald Knuth 說過: “子程序就是協程的一種特例。” 編程過程中,最常用的就是函數調用,這時對於調用方來說,被調函數就是子程序(subroutine)。可以把協程理解相互配合工作的函數,函數之間可以相互切換,並且能夠從

原创 執行機器碼

首先生成機器碼 爲下面函數生成機器碼: // mul.c int mul(int a, int b) { return a*b; } 然後編譯彙編之,生成 object 文件: gcc -c mul.c -o mul.o 從

原创 達夫設備(duff's device)

達夫設備(Duff’s device)是 c 編程語言裏將循環展開的編程技巧。 具體就是使用 switch 和 loop 結合,將 case 寫在 loop 裏面。 下面代碼展示裏其執行過程: #include <stdio.h> #

原创 使用 dlv 調試 golang 程序

使用 dlv 前 取消編譯時優化 go build -gcflags='all=-N -l' 取消測試用例編譯時優化 go test -c --gcflags='all=-N -l' 使用 dlv to be contin

原创 共享內存

方式1 使用mmap #include <sys/mman.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #incl