讀Muduo原始碼筆記---2
阿新 • • 發佈:2018-11-04
1、執行緒共享地址空間,從而可以高效地共享資料。
2、非阻塞IO+IO多路複用模型
while(!done) { int timeout_ms=max(1000,getNextTimedCallback()); int retval=::poll(fds,nfds,timeout_ms); if(retval<0) { //處理錯誤,回撥使用者error handler }else{ //處理到期的timers,回撥使用者timers handler if(retval>0) { //處理IO事件,回撥使用者IO event handler } } }
基於事件驅動的程式設計模型本質的缺點,它要求事件回撥函式必須是非阻塞的。對於涉及網路IO的請求響應式協議,它容易割裂業務邏輯,使其散佈於多個回撥函式之中,相對不容易理解和維護。
3、多執行緒伺服器常用模型
3.1 one loop per thread
event loop代表了執行緒的主迴圈,需要讓哪一個執行緒幹活,就把timer或IO channel註冊到哪一個執行緒的loop。
3.2 執行緒池
typedef boost::function<void()>Functor; BlockingQueue<Functor>taskQueue;//執行緒的阻塞佇列 void workerThread() { while(running) { Functor task=taskQueu.task();//this block task(); } } //啟動容量為N的執行緒池: int N=num_of_computing_threads; for(int i=0;i<N;++i) { create_thread(&workerThread); } //使用 Foo foo; boost::function<void()>task=boost::bind(&Foo::calc,&foo); taskQueue.post(task);
4、程序間通訊只用TCP
選擇socket的好處: 跨主機,具有伸縮性。TCP port由一個程序獨佔,且作業系統會自動回收,說明即使程式意外退出,也不會給系統留下垃圾。如果一個程序崩潰了,作業系統會關閉連線,另一個程序幾乎立刻能感知。
tcpdump和wireshark解決程序間協議和狀態爭端的好幫手,也是效能分析器。tcpcopy壓力測試。
一個分散式系統是由執行在多臺機器上的多個程序組成,程序之間採用TCP長連線。
5、系統性能的基本概念
QPS(TPS):每秒鐘request/事務 數量
併發數:
響應時間: 一般取平均響應時間
QPS(TPS)= 併發數/平均響應時間