最近想研究一下memcached實現,主要目的是熟悉和學習Linux C的開發,這個對android native開發和服務端的開發都是相通的,下面只是簡單的看了下memcached.h和memcached.c main入口函數的源碼,先把大概的理解記錄一下,還有很多細節沒有深入瞭解,慢慢來把。整個過程看的還是比較吃力的,對libc的庫函數很不瞭解。
memcached版本1.4.9
Memcached.h
主要定義了memcached主要的數據結構和方法。
比如幾個主要的結構定義:
1. memcached鏈接conn
2. memcached存儲結構_stritem
3. memcached的設置結構settings
4. 全局狀態stats
5. 。。。。。。
Memcached.c main函數代碼閱讀
main函數基本流程:
1. 判斷libevent版本,需要大於1.3
2. 截獲SIGINT信號的處理(這個爲什麼截獲,還沒有深入瞭解)
3. 初始化settings結構的一些信息,主要是memcached運行時的一些參數
4. 初始化udp處理線程數
5. 初始化sasl處理協議(對sasl不太瞭解)
6. 設置tcp和udp的端口
7. core文件的訪問的設置
8. 檢查和設置打開文件的數目
9. 用戶權限的判斷,禁止用root權限運行
10. 如果支持sasl驗證,進行響應初始化
11. 守護進程處理,忽略SIGHUP信號的處理(守護進程不處理SIGHUP?這個在確認一下)
12. 處理內存翻頁,鎖定進程內存翻頁到交換區(mlockall)
這個是爲了什麼?禁止翻頁是不是優化訪問速度?
13. 初始化libevent主線程
14. 初始化一些全局狀態(stats_init)
15. 初始化chunk(slabs_init)??
打問號,需要繼續看代碼
16. 初始化連接池conn_init
17. 忽略SIGPIPE信號,避免因爲訪問關閉管道導致進程退出
18. 初始化工作線程(thread_init)
19. 創建assoc 維護線程? assoc還沒高明白
20. 初始化時序clock_handler,這個還不太明白
21. socket初始化(需要繼續看代碼細化過程)
22. 保存進程文件save_pid
23. 開始事件循環event_base_loop
24. 一些資源清理