brpc第一周學習分享

2021-10-09 23:24:30 字數 3537 閱讀 5471

由於自己第一次讀開源**,所以完全沒有方法,所以第一步是瘋狂google

brpc學習最佳實踐

如何閱讀源**

最終找到一篇比較好的文章

如何閱讀乙份源**?

目前自己的大計畫是一年能夠改寫brpc

所以小計畫是當前乙個月先搞清楚brpc的基本框架,了解基本結構

制定以上計畫的原因如下:

閱讀技巧

然後跟著brpc學習 慢慢來的,

2023年09月28日16:33:07 發現其中autoreset<>類是第乙個簡單易懂的類___繼續加油

宣告在iobuf.h,然後實現在iobuf_inl.hiobuf.cpp

size_t iobuf::

cutn

(std::string* out, size_t n)

const size_t len =

length()

;if(n > len)

const size_t old_size = out-

>

size()

; out-

>

resize

(out-

>

size()

+ n)

;return

cutn(&

(*out)

[old_size]

, n)

;}

這個cntn在if (n > len)處的操作有點迷惑,因為憑空就把n縮小了

brpc之iobuf中說道:

cut_until,從前到後開始cut,直到遇到字元匹配到delim,如果沒有匹配到返回-1; 需要注意的地方時,這個地方delim字串的長度不能超過unsiged long的長度,因為brpc中將字串hash到乙個unsigned long型的整數,然後遍歷匹配的時候,也將iobuf中的字串hash到乙個unsigned long型別的整數,與delim進行比較;這個地方比較精巧的是,hash的時候使用位移操作,向左移,後面的字串會把前面的字串沖掉,因此複雜度從 o(n*m) 降到o(n),其中n為block中字串的長度,m為delim的長度;

我一開始不懂,後面想到其實可能是因為這個hash只能對字元一直加和,但是不能取模,因為取模就會導致類似hash碰撞的事情,所以就不一定是真的字元匹配了(我猜的)

看一下實現**,主要做了三件事:

迴圈block,準備好readv函式的引數位址(將block的可寫首位址和可寫長度依次獲取,放入到iovec的陣列中)

呼叫pread函式將讀取到的內容寫入到上面準備的位址,獲取讀取的總長度nr;

整理現有的block,因為現有的block可能很多寫滿了。

ssize_t ioportal::

(int fd, off_t offset, size_t max_count)

if(prev_p !=

null

)else

} vec[nvec]

.iov_base = p-

>data + p-

>size;

vec[nvec]

.iov_len = std::

min(p-

>

left_space()

, max_count - space)

; space +

= vec[nvec]

.iov_len;

++nvec;

if prev_p = p;

p = p-

>portal_next;

}while(1

);ssize_t nr =0;

if(offset <0)

else

if(nr <=0)

return nr;

} size_t total_len = nr;do;

_push_back_ref

(r);

_block-

>size +

= len;

if(_block-

>

full()

)}while

(total_len)

;return nr;

}inline ssize_t ioportal::

(int fd, size_t max_count)

hash

template

<

typename _k,

typename _t,

typename _h,

typename _e,

bool _s>

_t& flatmap<_k, _t, _h, _e, _s>

::operator

(const key_type& key)

new(

&first_node)

bucket

(key)

;return first_node.

element()

.second_ref()

;}if(

_eql

(first_node.

element()

.first_ref()

, key)

) bucket *p = first_node.next;if(

null

== p)

// fail to resize is ok

}++_size;

bucket* newp =

new(_pool.

get())

bucket

(key)

; first_node.next = newp;

return newp-

>

element()

.second_ref()

;}while(1

)if(null

== p-

>next)

// fail to resize is ok

}++_size;

bucket* newp =

new(_pool.

get())

bucket

(key)

; p-

>next = newp;

return newp-

>

element()

.second_ref()

;}p = p-

>next;

}}

2023年10月01日19:22:10 今天花了一段時間看完了官方參考資料:

感覺很有計算含量,所以明天繼續看一下**___2023年10月02日19:01:46 決定暫時巨集觀層面先學習,所以這個細緻**暫緩

todo未懂含義_c_murmurhash or c_md5

第一周學習

msg dic for k,v in msg dic.items print f 商品名稱 商品 end while true shoppingcar input 請輸入你要購買的商品 strip if shoppingcar not in msg dic or shoppingcar is non...

第一周學習

1.根目錄,位於目錄的最頂端,是所有檔案和目錄的父目錄,其自身沒有父目錄。2.boot 引導檔案存放目錄,核心檔案 vmlinuz 引導載入器 bootloader,grub 都存放於此目錄。3.bin 存放使用者基本命令,不能關聯至獨立分割槽,os啟動就會用到的程式。4.sbin 存放管理類基本命...

第一周學習總結

第一周,我們有學習,計算機的發展,起源,計算機的各種進化,還有計算機的概念,計算機的語言,計算機的組成這些等等。讓我深刻的意識到這是很龐大的一門課程,同時也對我們接下來要學習的課程充滿了期待。對於我自己來說,第一周的學習我還是覺得挺不錯的,挺開心的,能認識到這麼多的朋友,這麼多的知識,讓我對計算機有...