ZMQ原始碼分析(二) 網路 執行緒模型

2021-07-09 14:20:16 字數 2608 閱讀 3441

zmq封裝了select,poll,epoll,queue,kqueue等各個平台上基礎的網路模型,但是在windows上沒有封裝iocp模型,而是使用select,這對zmq在windows上會造成一些效能影響,畢竟select模型的效能相對較低。雖然這些模型的原理和操作都不相同,但是zmq封裝了這些差異,抽象出統一的實現介面,下面我們以linux下的epoll模型為例進行分析,zmq中封裝epoll模型的類為epoll_t,他繼承自poller_base_t:

class poller_base_t

;typedef

std::multimap

timers_t;

timers_t timers;

// load of the poller. currently the number of file descriptors

// registered.

atomic_counter_t load;

poller_base_t (const poller_base_t&);

const poller_base_t &operator = (const poller_base_t&);

};

poller_base主要是封裝定時器操作,他用乙個multimap來記錄所有的timer,在execute_timers從頭開始遍歷timer看是否有到時間的定時器,由於multimap是有序的,所以每次遍歷檢查到第乙個沒有到達的定時器之後就可以停止遍歷了。

class epoll_t : public poller_base_t

;// list of retired event sources.

typedef

std::vector

retired_t;

retired_t retired;

// if true, thread is in the process of shutting down.

bool stopping;

// handle of the physical thread doing the i/o work.

thread_t worker;

epoll_t (const epoll_t&);

const epoll_t &operator = (const epoll_t&);

};

epoll_t的變數中包含乙個worker作為工作執行緒,zmq的執行緒操作主要封裝在thread_t中,在windows上使用原生的執行緒庫,在linux等其他平台上是使用pthread來現實。epoll_t 定義了乙個poll_entry_t結構體作為handle_t,當需要使用epoll監聽乙個描述符時需要首先呼叫add_fd方法:

zmq::epoll_t

::handle_t zmq::epoll_t

::add_fd (fd_t fd_, i_poll_events *events_)

epoll方法的內部會構造乙個poll_entry_t物件,然後將對應的描述符和epoll_event新增進epoll_fd中,之後對該描述符的所有操作都是通過handle_t來進行的:

void set_pollin (handle_t handle_);

void reset_pollin (handle_t handle_);

void set_pollout (handle_t handle_);

void reset_pollout (handle_t handle_);

每次在工作執行緒中呼叫epoll_wait後都會根據描述符的具體事件呼叫對用的event事件,event事件是在add_fd方法內註冊的,任何想要監聽描述符事件的類都需要繼承i_poll_events,比如之後要講的listener(用於監聽連線),conneter(檢測連線),socket_base(監聽mailbox中的命令),stream_engine(監聽網路資料)等。

struct i_poll_events

// called by i/o thread when file descriptor is ready for reading.

virtual

void in_event () = 0;

// called by i/o thread when file descriptor is ready for writing.

virtual

void out_event () = 0;

// called when timer expires.

virtual

void timer_event (int id_) = 0;

};

在zmq把各種網路模型typedef為poller_t,又把poller_t封裝在乙個io_thread中,io_thread中除了乙個poller外還包含乙個mailbox,mailbox的作用將在之後進行分析。下圖是zmq執行緒模型示意圖,這裡先簡單看一下,之後在分析socket,session時會具體分析。

Hbase WAL執行緒模型原始碼分析

hbase的wal機制是保證hbase使用lsm樹儲存模型把隨機寫轉化成順序寫,並從記憶體read資料,從而提高大規模讀寫效率的關鍵一環。wal的多生產者單消費者的執行緒模型讓wal的寫入變得安全而高效。在文章 wal在regionserver呼叫過程 中從 層面闡述了乙個client的 寫 操作是...

Memcached原始碼分析之網路模型篇

memcached 採用多執行緒的工作方式,主線程接收連線,然後把連線平攤給 工作執行緒,工作執行緒處理業務邏輯,memcached 使用 libevent 處理網路 事件,主線程和工作執行緒都有乙個 event base,這是 libevent 的核心資料 結構,event base 能夠監聽多個...

quartz原始碼分析 執行引擎和執行緒模型

title quartz原始碼分析 執行引擎和執行緒模型 date 2017 09 09 23 14 48 categories quartz tags quartz,原始碼分析 toc 軟體版本 quartz 2.2.3 類名 從上述配置檔案可以看出quartz配置了乙個執行緒池,實現名稱為 th...