1. 程式人生 > >Memcached原始碼分析——連線狀態變化分析(drive_machine)

Memcached原始碼分析——連線狀態變化分析(drive_machine)

這篇文章主要介紹Memcached中,基於libevent構造的主執行緒和worker執行緒所處理連線的狀態互相轉換的過程(不涉資料的存取等操作),也就是drive_machine的主要業務邏輯了。狀態轉換過程沒有涉及所有狀態,同時,由於自己能力問題,一些狀態轉換還可能有錯,還請各位前輩指正。轉換條件限定:TCP,ASCII協議。(狀態不包括conn_swallow,二進位制協議才會用到此狀態)

1 總攬

首先介紹連線,連線是Memcached自己定義的連線conn。的所有狀態,drive_machine()主要就是對這些狀態的轉換進行操作:

enum conn_states {
    conn_listening,  /**< the socket which listens for connections /主執行緒等待連結*/
    conn_new_cmd,    /**< Prepare connection for next command /worker執行緒等待命令*/
    conn_waiting,    /**< waiting for a readable socket /worker執行緒等待sdf中有可讀資訊*/
    conn_read,       /**< reading in a command line /worker執行緒讀命令*/
    conn_parse_cmd,  /**< try to parse a command from the input buffer /woker執行緒*/
    conn_write,      /**< writing out a simple response /worker執行緒*/
    conn_nread,      /**< reading in a fixed number of bytes /worker執行緒由於命令沒讀完,繼續讀取*/
    conn_swallow,    /**< swallowing unnecessary bytes w/o storing /worker執行緒,ASCII協議不涉及此狀態*/
    conn_closing,    /**< closing this connection */
    conn_mwrite,     /**< writing out many items sequentially /worker執行緒,響應內容中寫出*/
    conn_max_state   /**< Max state value (used for assertion) /用於標記conn_states邊界,超出說明states有錯*/
};

在Memcached.c的main()中,主執行緒以及worker執行緒完成必要初始化,繫結相應libevent事件,隨後主執行緒監聽繫結監聽相應埠,正式做好迴圈的準備。下圖是總體連線狀態的總體轉換圖。

2 接收連線分發給worker執行緒

  1. 主執行緒初始化後,連線便進入conn_listening狀態,等待連線。
  2. 當有連線連入,主執行緒通過dispatch_conn_new()向管道寫入字元c,將連線分發給某個worker執行緒,worker執行緒收到,連線進入conn_new_cmd等待狀態。

3 資料讀入

  1. conn_new_cmd等待新的連線,當連線寫入時,如果當前請求過多,可能對其他worker執行緒造成飢餓,更改事件型別為EV_WRITE,退出。
  2. 如果連線不多,且有未讀資料,說明上一次有未處理完的命令,進入conn_parse_cmd,以便繼續處理命令。
  3. 如果連線不多,且是新連線,表明沒有未讀資料,則連線進入conn_waiting狀態等待資料(命令)到來。
  4. conn_waiting,執行緒等待連線中的後續資料,如果有資料會設定當前socket fd為讀事件EV_READ,確保後續內容的讀入。在conn_read中,呼叫try_read_network()嘗試從socket fd中讀東西,如果沒有資料則返回conn_waiting,如果有資料則進入conn_parse_cmd,等待處理命令。

4 命令解析

相關推薦

Memcached原始碼分析——連線狀態變化分析drive_machine

這篇文章主要介紹Memcached中,基於libevent構造的主執行緒和worker執行緒所處理連線的狀態互相轉換的過程(不涉資料的存取等操作),也就是drive_machine的主要業務邏輯了。狀態轉換過程沒有涉及所有狀態,同時,由於自己能力問題,一些狀態轉換還可能有錯,還請各位前輩指正。轉換條件限定:T

Memcached原始碼分析之儲存機制Slabs7

文章列表: 《Memcached原始碼分析 - Memcached原始碼分析之總結篇(8)》前言 這一章我們重點講解Memcached的儲存機制Slabs。Memcached儲存Item的程式碼都是在slabs.c中來實現的。 在解讀這一章前,我們必須先了

mysql狀態分析之show global status

http 運行 global 系統性能 數據量 -- ror 必須 request mysql> show global status;可以列出MySQL服務器運行各種狀態值,我個人較喜歡的用法是show status like ‘查詢值%‘;一、慢查詢mysql&g

JUC原始碼分析-執行緒池篇:ThreadPoolExecutor

在多執行緒程式設計中,任務都是一些抽象且離散的工作單元,而執行緒是使任務非同步執行的基本機制。隨著應用的擴張,執行緒和任務管理也變得非常複雜,為了簡化這些複雜的執行緒管理模式,我們需要一個“管理者”來統一管理執行緒及任務分配,這就是執行緒池。本章開始,我們將逐個分析 JUC

Android 實時監測監聽網路連線狀態變化

看了網上的很多,都不是自己想要的。所以自己就參考著寫了一個。 實現這個的方法很多,我是想的這種,如果哪有不足,有bug的地方希望大家指出,共同進步。。。。 先簡單說一下思路:網路變化時系統會發出廣播。所以我們監聽這個廣播,利用介面回撥通知activity做

jQuery原始碼分析——常用正則表示式RegExp

常用的數字正則(嚴格匹配) 正則 含義 ^[1-9]\d*$ 匹配正整數 ^-[1-9]\d*$ 匹配負整數 ^-?[1-9]\d*$ 匹配整數 ^[1-9]\d*|0$ 匹配非負整數(正整數 +

原始碼分析篇--Java集合操作2

4、兩大集合介面 在Java集合中,有兩大集合,一個是Collection介面及其實現類,另一個是Map介面及其實現類。下面給出這兩種集合的框架圖。如下所示。 4.1Collection介面框架圖 4.2Map介面框架圖 從上面兩個框架圖可以看出,Cllection介面和Map介面是

原始碼分析篇--Java集合操作1

一、集合框架 1、集合框架體系圖 2、集合的概念  Java集合是使程式能夠儲存和操縱元素不固定的一組資料。 所有Java集合類都位於java.uti包中。與Java陣列不同,Java集合中不能存放基本資料型別,只能存放物件的引用。但是在JDK5.0以後的版本當中,JAVA增加了“自動裝箱

原始碼分析篇--Java集合操作6順序表的擴容原理

2.6.4 順序表的擴容原理之add()方法的實現原理 add()方法用於將元素動態新增到ArrayList容器中。將資料儲存在list後,我們可以通過該list進行CRUD操作。我們知道,list(列表)的底層是由陣列設計的,因此,陣列具備了哪些優缺點,list就具備了哪些優缺點。我們知道

netlink監聽網路變化程式碼轉載+流程分析原創+轉載+資料結構以及相關巨集的解析原創

一.netlink監聽網路變化程式碼(Linux下使用NetLink 監聽網路變化) #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h>

Android 8.0系統原始碼分析--Binder程序間通訊

 開始我們的沉澱之路,老羅的書中第二章講的是Android HAL層的知識,而且直接自己實現了一個虛擬的freg驅動程式,後面的幾節是分別從native、java層如何訪問這個虛擬的驅動程式介面,我這裡沒有這樣的環境,所以就不分析這節了,第三章的智慧指標我對比8.0系統原

jQuery原始碼分析--event事件繫結

上文提到,jquery的事件繫結有bind(),delegate()和one()以及live()方式。我用的jQuery2.1.3版本,live()已經被廢棄了。 bind(),delegate()和one()的內部原始碼。 //7491行 bind

【Java8原始碼分析】併發包-ConcurrentHashMap

一、CAS原理簡介 Java8中,ConcurrentHashMap摒棄了Segment的概念,而是啟用了一種全新的方式實現:利用CAS演算法。它沿用了HashMap的思想,底層依然由“陣列”+連結串列+紅黑樹的方式實現。 那什麼CAS演算法呢?以前採用鎖的

springMVC原始碼分析--頁面跳轉RedirectView

跳轉的示例:@RequestMapping("/index") public String index(Model model,RedirectAttributes attr){ attr.addAttribute("attributeName", "attribute

Java併發包原始碼學習之執行緒池ThreadPoolExecutor原始碼分析

Java中使用執行緒池技術一般都是使用Executors這個工廠類,它提供了非常簡單方法來建立各種型別的執行緒池: public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorService

Vue學習之原始碼分析--Vue.js依賴收集

為什麼要依賴收集 先看下面這段程式碼 new Vue({ template: `<div> <span>text1:</span> {{text1}}

LAV Filter 原始碼分析 3: LAV Video 1

LAV Video 是使用很廣泛的DirectShow Filter。它封裝了FFMPEG中的libavcodec,支援十分廣泛的視訊格式的解碼。在這裡對其原始碼進行詳細的分析。LAV Video 工程程式碼的結構如下圖所示直接看LAV Video最主要的類CLAVVideo

(萊昂氏unix原始碼分析導讀-36) 快取管理

                                      by cszhao1980 理解了上述內容,下面的這些程式就不難理解了。 首先是函式brelse(buf bp),該函式將傳入的快取歸還到AV佇列中,函式採用尾插法, 即快取會插到AV佇列的隊尾——

Berkeley DB 原始碼分析 (2) --- Btree的實現 1

II. Type Dictionary 1. BTREE The DB handle's DB->bt_internal structure, stores per-process and per-dbhandle btree info and function pointers. 2. BTMET

springMVC原始碼分析--HttpMessageConverter寫write操作

簡單的返回值處理示例使用@ResponseBody進行註解:@ResponseBody @RequestMapping("/get") public Object get(){ Product product = new Product(); product.se