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執行緒
- 主執行緒初始化後,連線便進入conn_listening狀態,等待連線。
- 當有連線連入,主執行緒通過dispatch_conn_new()向管道寫入字元c,將連線分發給某個worker執行緒,worker執行緒收到,連線進入conn_new_cmd等待狀態。
3 資料讀入
- conn_new_cmd等待新的連線,當連線寫入時,如果當前請求過多,可能對其他worker執行緒造成飢餓,更改事件型別為EV_WRITE,退出。
- 如果連線不多,且有未讀資料,說明上一次有未處理完的命令,進入conn_parse_cmd,以便繼續處理命令。
- 如果連線不多,且是新連線,表明沒有未讀資料,則連線進入conn_waiting狀態等待資料(命令)到來。
- 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原始碼分析之儲存機制Slabs(7)
文章列表: 《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