由於自己第一次讀開源**,所以完全沒有方法,所以第一步是瘋狂google
brpc學習最佳實踐
如何閱讀源**
最終找到一篇比較好的文章
如何閱讀乙份源**?
目前自己的大計畫是一年能夠改寫brpc
所以小計畫是當前乙個月先搞清楚brpc的基本框架,了解基本結構
制定以上計畫的原因如下:
閱讀技巧
然後跟著brpc學習 慢慢來的,
2023年09月28日16:33:07 發現其中autoreset<>類是第乙個簡單易懂的類___繼續加油
宣告在iobuf.h
,然後實現在iobuf_inl.h
和iobuf.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 存放管理類基本命...
第一周學習總結
第一周,我們有學習,計算機的發展,起源,計算機的各種進化,還有計算機的概念,計算機的語言,計算機的組成這些等等。讓我深刻的意識到這是很龐大的一門課程,同時也對我們接下來要學習的課程充滿了期待。對於我自己來說,第一周的學習我還是覺得挺不錯的,挺開心的,能認識到這麼多的朋友,這麼多的知識,讓我對計算機有...