在bufferevent出現之前,我們通常先檢測資料源輸入buffer内是否有資料,如果有資料那麼就将其中的資料寫入到自己定義的緩沖區中。這樣可能會發生頻繁讀寫的問題。如果我們希望資料源中輸入buffer積攢到一定量資料的時候再進行讀寫,那麼就需要使用bufferevent了。圖1顯示了不使用bufferevent時對資料源進行讀寫的結構。
![]() |
圖1 不使用bufferevent的資料讀寫 |
bufferevent的實作使得在使用者定義的緩沖區和資料源之間又添加了一層,并且提供了一些機制使使用者可以更高效的使用資料源的buffer。如圖2所示,
|
圖2 使用bufferevent的資料讀寫 |
支撐bufferevent機制的最重要的結構體是struct evebuffer. 該結構體定義了一個輸入buffer和一個輸出buffer。其中輸入buffer是用來緩存從資料源的輸入buffer中讀取的資料,輸入buffer是用來緩存從使用者自定義緩沖區寫入的資料。 當某個條件滿足時,bufferevent對資料源進行讀操作,這個讀操作使用的是作業系統提供的接口,将資料源輸入buffer中的資料讀取到bufferevent的輸入buffer中,在完成這個動作之後調用使用者編寫的函數(read_cb)執行相應的操作,比如說将bufferevent輸入buffer中的資料讀取到使用者定義的緩沖區或者檢視bufferevent的輸入buffer中的資料等等。 當某個條件滿足時,比如網絡套接口可寫,bufferevent通過調用作業系統提供搞得接口将其輸出buffer寫入到資料源的輸出buffer中,然後調用使用者編寫的函數(write_cb)執行相應的操作。 到此為止,我們已經知道了libevent中為什麼單獨建立bufferevent機制,也知道了bufferevent機制的概況。在下一節我們将介紹怎樣建立一個bufferevent。