1. 程式人生 > >讀Muduo原始碼筆記---2

讀Muduo原始碼筆記---2

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/事務 數量

      併發數:

 系統同時處理的request/事務數

      響應時間:  一般取平均響應時間

QPS(TPS)= 併發數/平均響應時間