也談如何寫一個Webserver(三)


  在上一篇里,我介紹了如何應用socketepoll來組織和管理從客戶端(如,瀏覽器)傳入的連接,通過設置非阻塞連接讓Webserver有更好的性能.

 

  下面,我介紹一下在我寫的Webserver Maestro用的線程池.Maestro整體的結構是epoll輪詢加上線程池處理傳入連接中攜帶的http message.雖然線程池是和連接一起使用的,但其實它應該是一個獨立可以處理任何任務的實體,所以,在實現時,合理的設計是可以提升應用的整體性能的.網上有很多通過簡單輪詢或單一隊列控制的線程池,但這些線程池都不能自動伸縮來實時調整所使用的資源.雖然他們很好用,但我還是希望能更好的利用資源,動態調整線程數目,所以我選用了其他的設計思路.我采用的線程池采用的設計是,由一個Master線程控制和監控多個工作線程的方式,好處是能夠根據Workload增加或減少工作線程的數目,有更好的伸縮性,更有效地利用硬件資源(CPU,內存).

 

整個線程池只有三個函數:

 

hpool_t *thpool_new(int size);

void thpool_delete(thpool_t *p);

void thpool_add_task(thpool_t *p,
                     void (*routine)(void *),
                     void *arg);

 

使用起來也是非常簡單,先用thpool_new()初始化,然后通過thpool_add_task()加入需要執行的任務;使用完畢后,再通過thpool_delete()將線程池銷毀.

 

  如果讀者看過了thpool.c里相應的實現,可能會比較疑惑,因為會看到類似內核鏈表的東西.其實,大家不用太理會這些宏,他們只是借來用用而已,整個線程池仍然應該是user space的,這些宏只是用來提升性能用的,不會影響的整個線程池的設計邏輯.大家只需知道怎么用這個線程池的三個函數就可以了.

 

  我會在第四篇內容里介紹現在流行JWT(Json Web Token)在Webserver中的應用...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM