在上一篇裡,我介紹了如何應用socket和epoll來組織和管理從客戶端(如,瀏覽器)傳入的連線,通過設定非阻塞連線讓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中的應用...