在上一篇里,我介紹了如何應用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中的應用...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285687.html
標籤:其他
上一篇:白嫖SSL證書部署(結合寶塔)
下一篇:基于Linux的TCP網路聊天室
