更多關於zeromq的解釋,以及zeromq的功能請參考下面幾個連接html
ØMQ(ZeroMQ)簡介 ,ØMQ - The Guide ,ZeroMQ 的模式git
zeromq幾乎全部I/O操做都是異步的,每一個zmq i/o 線程(與實際線程不一樣)都有與之綁定的Poller,Poller採用經典的Reactor模式實現,Poller根據不一樣操做系統平臺使用不一樣的網絡I/O模型(select、poll、epoll、devpoll、kequeue等)。在zeromq中,zmq_socket也被當作是一個zmq io線程。每一個線程內含一個信箱,用於線程與線程間傳遞命令(後面會詳細講),在建立zmq io線程時,會把信箱句柄加到Poller中,用於監聽是否有命令到達。當client端開始發起鏈接或者server端開始監聽時,會在主線程建立zmq_connector或者zmq_listener,主線程使用zmq_socket的mailbox發送命令給io線程,將其綁定到io線程中,io線程會把zmq_connector或者zmq_listener含有的句柄加入Poller中,以偵聽讀寫事件。Client端與Server端都是經過Session來管理鏈接和通訊,一個session表明一次會話,每一個Session都會關聯到相應的讀/寫管道, 主線程收發消息只是分別從管道中讀/寫數據。Session並不實際跟kernel交換I/O數據,而是經過plugin到Session中的Engine來與kernel交換I/O數據。github
zmq的內部架構涉及到zmq全局變量的管理,併發模型,線程模型(主線程,i/o線程,回收線程,zmq_socket線程,存活於線程中的對象),對象回收模型(對象樹),消息的組織等,要想比較順手的讀懂源碼,仍是須要先了解一下這些結構,在zmq的官方站點已經給出來了詳細的講解,也有前輩進行了翻譯:算法
Internal Architecture of libzmq,ZeroMQ的內部架構網絡
http://www.aosabook.org/en/zeromq.html,<摘錄>開源軟件架構-ZeroMQsession
下面這幅zmq的基本流程圖有助於總體把握zmq的流程,這幅圖是由前輩總結的,來源於ZeroMQ研究與應用分析,(不知道是不是原創,有不少同樣的博文,分不清原創是誰),不過新版的zmq已經不建議使用zmq_init初始化上下文語境了,新版建議使用zmq_new來建立上下文,關於新版zmq的一個詳細流程在第4節會給出。多線程
序列圖有助於理解對象狀態變遷,下圖描述的是客戶端的對象狀態變遷。zmq_socket以ZMQ_REQ模式實例化,用以進行tcp通訊:架構
void *requester = zmq_socket (context, ZMQ_REQ); zmq_connect (requester, "tcp://localhost:5555");
①、object_t,主要用於發送命令和處理命令,全部繼承object_t的子類都具有該類的功能併發
②、io_thread_t,內含一個poller,可監聽句柄的讀、寫、異常狀態,繼承自object_t,具備接收命令、處理命令、發送命令的功能異步
③、io_object_t,能夠獲取一個io_thread_t的poller,從而具有poller功能,全部繼承自該類的子類都具備pollere功能,可監聽句柄的讀、寫、異常狀態
④、reaper_t,zmq的回收線程
⑤、own_t,zmq的對象樹結點,或者說多叉樹的結點,其主要用於對象的銷燬,能夠想到,對象的銷燬就是這棵樹的銷燬過程,必需要使用深度優先的算法來銷燬。關於zmq對象樹在Internal Architecture of libzmq有詳細講解
⑥、tcp_connector_t,zmq_socket的鏈接器,使用她來創建tcp鏈接
⑦、tcp_listener_t,zmq_socket的監聽器
⑧、stream_engine,負責處理io事件中的一種----網絡事件,把網絡字節流轉換成zeromq的msg_t消息傳遞給session_base_t。另一些和版本兼容相關的雜務也stream_engine處理的。stream_engine_t處理完雜務,到session_base_t就只看見msg_t了。
⑨、session_base_t,管理zmq_socket的鏈接和通訊,主要與engine進行交換
⑩、socket_base_t,zeromq的socket,在zmq中,被當成一種特殊的」線程「,具備收發命令的功能
參考資料
Internal Architecture of libzmq