×

怎么實(shí)現(xiàn)一個網(wǎng)站的Web Server(上)

  • 作者:新網(wǎng)
  • 來源:新網(wǎng)
  • 瀏覽:100
  • 2018-02-24 17:41:00

Web Server中文名稱叫網(wǎng)頁服務(wù)器或web服務(wù)器。WEB服務(wù)器也稱為WWW(WORLD WIDE WEB)服務(wù)器,主要功能是提供網(wǎng)上信息瀏覽服務(wù)。那么怎么實(shí)現(xiàn)一個網(wǎng)站的Web Server?

 Web Server中文名稱叫網(wǎng)頁服務(wù)器web服務(wù)器。WEB服務(wù)器也稱為WWW(WORLD WIDE WEB)服務(wù)器,主要功能是提供網(wǎng)上信息瀏覽服務(wù)。那么怎么實(shí)現(xiàn)一個網(wǎng)站的Web Server?

t011536ca23134543af.jpg
單線程 + Non-Blocking
 
Vino 整體采用了基于事件驅(qū)動的單線程 + Non-Blocking 模型。采用單線程模型,避免了系統(tǒng)分配多線程及線程之間通信的開銷,同時降低了內(nèi)存的耗用。由于采用了單線程模型,為了更好的提高線程利用率,Vino 將默認(rèn) Blocking 的 I/O 設(shè)置為 Non-Blocking I/O,即在線程讀/寫數(shù)據(jù)的過程中,如果緩沖區(qū)為空/緩沖區(qū)滿,線程不會阻塞,而是立即返回,并設(shè)置 errno。
 
Vino 最初的靈感來源于 Computer Systems: A Programmer\'s Perspective 一書講述網(wǎng)絡(luò)編程時實(shí)現(xiàn)的一個簡單的 Web Server,每到來一個請求,Web Server 都會 fork 一個進(jìn)程去處理。顯然,在高并發(fā)的場景下,這種模型是不合理的。每次 fork 進(jìn)程會帶來巨大的開銷,并且系統(tǒng)中進(jìn)程的數(shù)量是有限的。同時,伴隨多進(jìn)程帶來的進(jìn)程調(diào)度的開銷也不可小覷,CPU 會花費(fèi)大量的時間用于決定調(diào)用哪一個進(jìn)程。進(jìn)程調(diào)度引發(fā)的進(jìn)程上下文之間的切換,也需要耗費(fèi)相當(dāng)大的資源。
 
很容易聯(lián)想到采用多線程模型來替代多進(jìn)程模型,相比于多進(jìn)程模型,多線程模型占用的系統(tǒng)資源會大大降低,但是本質(zhì)上并沒有減小線程調(diào)度帶來的開銷。為了減小由線程調(diào)度導(dǎo)致的開銷,我們可以采用線程池模型,即固定線程的數(shù)量,但是問題依舊存在:因?yàn)?Linux 默認(rèn) I/O 是阻塞(Blocking)的,如果線程池中所有的線程同時阻塞于正在處理的請求,那么新到來的請求就沒有線程去處理了。因此,如果我們用 Non-Blocking 的 I/O 替換默認(rèn)的 Blocking I/O,線程將不會阻塞于數(shù)據(jù)的讀寫,問題便可得到解決。
 
HTTP Keep-Alive
 
Vino 支持 HTTP 長連接(Persistent Connections),即多個請求可以復(fù)用同一個 TCP 連接,以此減少由 TCP 建立/斷開連接所帶來的性能開銷。每到來一個請求,Vino 會對請求進(jìn)行解析,判斷請求頭中是否存在 Connection: keep-alive 請求頭。如果存在,在處理完一個請求后會保持連接,并對數(shù)據(jù)緩沖區(qū)(用于保存請求內(nèi)容,響應(yīng)內(nèi)容)及狀態(tài)標(biāo)記進(jìn)行重置,否則關(guān)閉連接。
 
以上就是小編對于怎么實(shí)現(xiàn)一個網(wǎng)站的Web Server的解答。
 

免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

免費(fèi)咨詢獲取折扣

Loading