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