memcached的學習(8)
阿新 • • 發佈:2018-11-21
2018.6.13
接下來分析memecached服務端的原始碼分析,主要目的是瞭解其中的資料結構,以及緩衝區的替換演算法這一部分。
希望一步一步把memcached的程式碼看懂,找到了一篇參考部落格,對memecached原始碼分析比較透徹,這裡給出連結:https://blog.csdn.net/initphp/article/details/44893869
同樣,採用參考部落格的目錄,按照以下的目錄進行學習:
首先來看下memcached的網路模型部分,主要說明如下:
Memcached分析
1. 網路模型流程分析
Memcached主要是基於Libevent的事件庫來實現網路執行緒模型的。我們先需要下載memcached的原始碼包。
Memcached的網路執行緒模型主要涉及兩個主要檔案:memcached.c 和thread.c檔案。
我們這邊主要分析tcp的模型。memcached也支援udp。
流程
- memcached首先在主執行緒中會建立main_base,memcached的主執行緒的主要工作就是監聽和接收listen和accpet新進入的連線。
- 當memcached啟動的時候會初始化N個worker thread工作執行緒,每個工作執行緒都會有自己的LIBEVENT_THREAD資料結構來儲存執行緒的資訊(執行緒基本資訊、執行緒佇列、pipe資訊)。worker thread工作執行緒和main thread主執行緒之間主要通過pipe來進行通訊。
- 當用戶有連線進來的時候,main thread主執行緒會通過求餘的方式選擇一個worker thread工作執行緒。
- main thread會將當前使用者的連線資訊放入一個CQ_ITEM,並且將CQ_ITEM放入這個執行緒的conn_queue處理佇列,然後主執行緒會通過寫入pipe的方式來通知worker thread工作執行緒。
- 當工作執行緒得到主執行緒main thread的通知後,就會去自己的conn_queue佇列中取得一條連線資訊進行處理,建立libevent的socket讀寫事件。
- 工作執行緒會監聽使用者的socket,如果使用者有訊息傳遞過來,則會進行訊息解析和處理,返回相應的結果。
流程圖
主執行緒的任務流圖及對應的函式:
工作執行緒的任務流圖及對應的函式:
總的來說,網路模型是用libevent的事件來驅動的,事件的不同型別通過註冊回撥函式,呼叫狀態機來完成。
總結與啟發:
學習了memcached的網路模型,主要是服務於多個客戶端TCP連線的網路模型建立,也是CS架構上我們值得學習的一個模型,在設計網路模型的時候可以學習這種框架。