怎么實現一個網站的Web Server(上)
- 作者:新網
- 來源:新網
- 瀏覽:100
- 2018-02-24 17:41:00
Web Server中文名稱叫網頁服務器或web服務器。WEB服務器也稱為WWW(WORLD WIDE WEB)服務器,主要功能是提供網上信息瀏覽服務。那么怎么實現一個網站的Web Server?
Web Server中文名稱叫網頁服務器或web服務器。WEB服務器也稱為WWW(WORLD WIDE WEB)服務器,主要功能是提供網上信息瀏覽服務。那么怎么實現一個網站的Web Server?
單線程 + Non-Blocking
Vino 整體采用了基于事件驅動的單線程 + Non-Blocking 模型。采用單線程模型,避免了系統分配多線程及線程之間通信的開銷,同時降低了內存的耗用。由于采用了單線程模型,為了更好的提高線程利用率,Vino 將默認 Blocking 的 I/O 設置為 Non-Blocking I/O,即在線程讀/寫數據的過程中,如果緩沖區(qū)為空/緩沖區(qū)滿,線程不會阻塞,而是立即返回,并設置 errno。
Vino 最初的靈感來源于 Computer Systems: A Programmer\'s Perspective 一書講述網絡編程時實現的一個簡單的 Web Server,每到來一個請求,Web Server 都會 fork 一個進程去處理。顯然,在高并發(fā)的場景下,這種模型是不合理的。每次 fork 進程會帶來巨大的開銷,并且系統中進程的數量是有限的。同時,伴隨多進程帶來的進程調度的開銷也不可小覷,CPU 會花費大量的時間用于決定調用哪一個進程。進程調度引發(fā)的進程上下文之間的切換,也需要耗費相當大的資源。
很容易聯想到采用多線程模型來替代多進程模型,相比于多進程模型,多線程模型占用的系統資源會大大降低,但是本質上并沒有減小線程調度帶來的開銷。為了減小由線程調度導致的開銷,我們可以采用線程池模型,即固定線程的數量,但是問題依舊存在:因為 Linux 默認 I/O 是阻塞(Blocking)的,如果線程池中所有的線程同時阻塞于正在處理的請求,那么新到來的請求就沒有線程去處理了。因此,如果我們用 Non-Blocking 的 I/O 替換默認的 Blocking I/O,線程將不會阻塞于數據的讀寫,問題便可得到解決。
HTTP Keep-Alive
Vino 支持 HTTP 長連接(Persistent Connections),即多個請求可以復用同一個 TCP 連接,以此減少由 TCP 建立/斷開連接所帶來的性能開銷。每到來一個請求,Vino 會對請求進行解析,判斷請求頭中是否存在 Connection: keep-alive 請求頭。如果存在,在處理完一個請求后會保持連接,并對數據緩沖區(qū)(用于保存請求內容,響應內容)及狀態(tài)標記進行重置,否則關閉連接。
以上就是小編對于怎么實現
一個網站的Web Server的解答。
免責聲明:本文內容由互聯網用戶自發(fā)貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發(fā)現本社區(qū)中有涉嫌抄襲的內容,請發(fā)送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。