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