ZMQ zero-copy

zero-copy 基本思想:

       數據報從網絡設備到用戶程序空間傳遞的過程中,減少數據拷貝次數,減少系統調用,實現CPU的零參與,徹底消除CPU在這方面的負載。實現零拷貝用到的最主要技術是DMA數據傳輸技術和內存區域映射技術。

       傳統的網絡數據報處理,需要經過網絡設備到操作系統內存空間,系統內存空間到用戶應用程序空間這兩次拷貝,同時還需要經歷用戶向系統發出的系統調用。而零拷貝技術則首先利用DMA技術將網絡數據報直接傳遞到系統內核預先分配的地址空間中,避免CPU的參與;同時,將系統內核中存儲數據報的內存區域映射到檢測程序的應用程序空間,檢測程序直接對這塊內存進行訪問,從而減少了系統內核向用戶空間的內存拷貝,同時減少了系統調用的開銷,實現了真正的“零拷貝”。

       還有一種方式是在用戶空間建立一緩存,並將其映射到內核空間,類似於linux系統下的kiobuf技術。


ZMQ zero-copy:

       ZMQ 的API可以讓你直接發送和接收消息,不用考慮緩存的問題。 消息是由ZMQ在後臺收發的,所以使用零拷貝需要一些額外的工作。

       做零拷貝時,使用zmq_msg_init_data()函數創建一條消息,其內容指向某個已經分配好的內存區域,然後將該消息傳遞給zmq_send()函數。創建消息時,你還需要提供一個用於釋放消息內容的函數,ZMQ會在消息發送完畢時調用。

       在接收消息的時候無法使用零拷貝:ZMQ會將收到的消息放入一塊內存區域供你讀取,但不會將消息寫入程序指定的內存區域。

       ZMQ的多段消息很好地支持零拷貝。在傳統消息系統中,你需要將不同緩存中的內容保存到同一個緩存中,然後才能發送。ZMQ會將來自不同內存區域的內容作爲消息的一個幀進行發送。而且在ZMQ內部,一條消息會作爲一個整體進行收發,因而非常高效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章