muduo原始碼閱讀(四) Buffer的設計

2021-09-24 17:07:06 字數 1535 閱讀 6402

muduo的圖示:

muduo的io模型採用的是阻塞式的,因此執行緒只能阻塞在 seletc/poll/epoll_wait 當中,而不能阻塞的write/read函式中,這麼一來,應用層的緩衝是必須的。每乙個tcp socket都要配備乙個input buffer和乙個 output buffer。

具體場景舉例 outputbuffer的必要性

目的:應用程式要傳送100kb資料,

方法:呼叫write(),但是作業系統只一次接受了80kb(受tcp的adertised window控制),而因為不能阻塞,程式也不能在此等待,也並不知道作業系統何時來接收剩餘的20kb,此時該如何做?

除此之外,在關閉連線時,也要等outputbuffer中的資料都發出去以後,才能斷開連線。

(在tcpconnectio::shutdown中沒有直接關閉tcp連線)

inputbuffer必要性 粘包

假設,傳送方此時傳送了2kb資料,則接收的情況可能是:

分兩次收到,一次600b,一次1400b

分兩次收到,一次1400b,一次600b

分三次收到,一次600b,一次800b,一次600b,

還有很多很多的無數種可能性…

解決的方案:接收到的資料先放到inputbuffer裡面,等構成了乙個完整的資料報,載通知業務程式讀取。(如何判斷當前是乙個完整的資料報,這是由業務程式決定的,有乙個codec的函式)

更加側重易用性,不具有執行緒安全性,因為任何乙個buffer不會暴露給其他執行緒。

1. 展現給使用者的是一塊連續的記憶體,方便使用者編寫。

2. 緩衝區的大小可以自動增長,以適應不同大小的訊息

3. 內部用std::vector來儲存資料,並提供相應的訪問函式

誰是直接使用buffer的:tcpconnection使用者**inputbuffer: 讀者 : 客戶端應用層** 寫入者: tcpconnection(readfd)

outputbuffer: 讀者 : tcpconnection 寫入者: 客戶端應用**(send)

prependable:這個prependable的作用就是在readable前面留了幾個位元組,一開始是8個位元組,它的作用是如果我需要在資料流的前面加幾個位元組,那麼就可以直接在這一塊加上,而不需要對整個buffer進行移動。比如:一開始我不知道接受了多少個位元組,接收完以後需要在資料頭加上位元組數。這樣就可以直接在prependable上面加上去。

採用vector緩衝區的設計採用vector ,vector可以動態的分配記憶體,並且,採用的是capcity()

機制,就是說第一次分配了這個區間記憶體大小以後, 就不會變小,後面可以減少分配的次數。

underscore 原始碼閱讀 四

keys one two three 檢索object擁有的所有可列舉屬性的名稱。我們知道,在js中本就提供了幾個方法如for.in.object.keys來遍歷物件的屬性,為什麼underscore還是要封裝乙個api呢?這其實是為相容ie9版本下的乙個bug做的封裝 在ie9以下的版本中,以下 ...

STL原始碼閱讀 四

deque的記憶體管理,分配一段記憶體 m map用來儲存指向快取區域的指標,每當快取區域buffer不足時,分配一段新的快取區域,然後 將指向該區域的指標新增到 m map中。buffer大小的分配原則是,當sizeof tp 512時,分配的快取大小sizeof tp 否則,分配的快取大小為si...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...