基於事件方式實現的高效網絡庫

一個網絡處理通常是我們通過epoll接收讀事件,然後從網絡層讀取數據放入緩存中,在從緩存中讀出數據,進行協議解析分發處理消息。一個消息過來通常是需要進行應答的,所以我們還需要將回覆信息進行封包發送到網絡層。

1、網絡接收相對比較慢,消息傳遞情況比較複雜,我們通常是需要進行緩存,然後分發,linux下通常是使用epoll進行消息接收。

2、緩存需要很好的設計,儘量防止多次拷貝處理。

3、通常網絡處理都是多線程的方式。

(1)1、一種方式是通過多個epoll進行消息接收,一個epoll佔用一個線程。

2、或者一個主epoll進行連接處理,接收到消息讀寫事件後,將描述符分發給各個子epoll 進行socket 讀寫處理,每個子epoll是一個線程。

3、也可以一個epoll進行連接,等待事件響應,一旦有讀寫事件就將其插入事件隊列,然後一個線程裏循環處理事件隊列,也可以開多個線程處理事件隊列。(libevent實現方式)

(2)緩存可以設計成池,提前分配好內存,如果消息是固定長度的,直接一次性分配好,如果不固定長度,則可以使用鏈表緩存的方式,分配多個固定長度地址塊,根據消息進行依次分配,這種方式比較好的解決了,分配一個大內存需要不斷進行移動拷貝的處理。

(3)消息分發,這個其實也可以設計成多線程進行消息處理,可以根據連接進行hash,每個session都有一個唯一id,hash(id)%(線程數)然後給到不同的線程進行消息處理。做成任務線程池。

一個網絡庫可以分爲幾個模塊(內存分配模塊緩存池管理、epoll模塊、session連接管理、dispatch任務分發處理)

 

讀者可以參考一下我自己的網絡庫設計實現方式:

https://github.com/Addision/EventServer/tree/master/SeNet

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