原创 share memory linux

1. 創建共享內存 int shmid =shmget((key_t) key ,size_t size, int flag); //key表示當前共享內存的key,單獨表示共享內存的id //size表示要開闢的共享內存大小 /

原创 C++查看環境變量

一 #include<stdio.h> #include<stdlib.h> #include<string.h> extern char **environ; int main(int argc, char **argv) {

原创 zooKeeper和ZAB協議總結一下

zookeeper的主備同步和leader選舉是通過ZAB協議來完成的。寫一下能夠記得更牢一些。 因爲ZK大多數是讀,少部分寫,所以讀都是讀follower。寫的是leader 數據同步的過程類似於二階段提交 Client 寫數

原创 nginx worker進程

1. ioctl一些參數 #include <sys/ioctl.h> ioctl(int fd, int request, ...) fcntl(int fd, int request, ...) // fd 爲需要對哪個文件

原创 對於RCU的衍生思考-- 設計一個線程安全的鏈表

只考慮單鏈表,直接對各種情況進行分析, 對於Insert,需要關注的點在於,先要對new_node 進行初始化。且Insert的時候要加鎖,意味着同時只有一個元素寫鏈表。至於爲什麼看後面的圖吧,深入理解linux內核講的挺好的。

原创 Nginx事件模塊init

首先在nginx裏面最重的是下述三個模塊 ngx_events_module, ngx_event_core_module, ngx_epoll_module, ngx_events_module 這個模塊屬於core_modul

原创 優雅地reload

今天做項目,借鑑nginx的代碼,做了一個優雅的重啓,在重啓過程中不斷服務,保持系統可用性。具體的過程如下 1. 註冊信號量 程序在運行過程中,當kill -s SIGUSR1 pid的shell語句執行時,程序接收到該信號,

原创 HAProxy Tips

1 size=(size+align+1)&-align //size 是align的整數倍 因爲size&-align等於比n*align . n*align< size. 假設align的最低位1爲第x位,那麼x-1

原创 Linux 掛在windows 目錄小技巧

首先要檢查在linux的目錄受否存在如下的文件,如果不存在,需要安裝 /sbin/mount.cifs 在windows 下建立共享文件夾 linux下執行以下語句 sudo mount -t cifs //192.

原创 雙向鏈表操作

看agent代碼,對雙向鏈表的插入,應該是如下的過程 注意當r不存在即p->next == NULL的時候, 3步驟省略 點贊 收藏 分享 文章舉報 abel_qiu 發

原创 Epoll 小結(Nginx)

1. 數據結構 //表示一個要監聽的事件 //其中events表示監聽的標誌位 EPOLLIN EPOLLOUT //表示被觸發後的data struct epoll_event{ uint32_t events;

原创 rocksDB的LRU cache 三兩說

先講單shard的LRU cache,主要有3個數據結構 LRUHandle 作爲LRU的一個個體元素,其數據結構如下,next,prev是在LRU的雙向列表的next和prev,next_hash是在hash_table用來解決

原创 cacheline 優化

今天看rockdb的代碼, 看到整個程序在分配內存和釋放的內存的時候,並不是直接用的malloc 或者 new 等,而是使用cacheline_aligned_alloc,瞭解了一下相關原理,內存load到緩存的時候 ,是按照ca

原创 c++ 定時器實現

1. setitimer方法 nginx 實現, 在這段代碼中,定義了itimerval的數據結構,並設置這個數據結構的值,從而定時器的間隔時間,settimer的函數第一個參數表示經過timer就會觸發sigalarm事件, 然

原创 對順序鎖的思考

今天讀到順序鎖的概念,似乎對之前被問到的鎖優化問題,有了一些新的理解,可以用這個來解決。其主要使用的套路是一個版本號和內存屏障。版本號用來保證寫的可見性,而內存屏障在一定程度上保證順序性。 先來說說他爲什麼滿足線程安全吧。 首先原