知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
您當(dāng)前位置>首頁 » 新聞資訊 » 網(wǎng)站建設(shè) >
C++web服務(wù)器開發(fā)
發(fā)表時(shí)間:2019-8-14
發(fā)布人:葵宇科技
瀏覽次數(shù):67
C++web服務(wù)器開發(fā)
1. 首先介紹一下這個(gè)項(xiàng)目;這個(gè)項(xiàng)目是通過C++11編寫的web服務(wù)器,模型為Reactor+非阻塞I/O(epoll作為I/O多路復(fù)用實(shí)現(xiàn)方式)+線程池,支持get、head請求,支持HTTP長連接,并實(shí)現(xiàn)了優(yōu)雅關(guān)閉連接。
I/O多路復(fù)用是什么技術(shù)呢? I/O多路復(fù)用(multiplexing)的本質(zhì)是通過一種機(jī)制(系統(tǒng)內(nèi)核緩沖I/O數(shù)據(jù)),讓單個(gè)進(jìn)程可以監(jiān)視多個(gè)文件描述符,一旦某個(gè)描述符就緒(一般是讀就緒或?qū)懢途w),能夠通知程序進(jìn)行相應(yīng)的讀寫操作。(包括select、poll、epoll)
文件描述符 文件描述符(File descriptor)是計(jì)算機(jī)科學(xué)中的一個(gè)術(shù)語,是一個(gè)用于表述指向文件的引用的抽象化概念。
文件描述符在形式上是一個(gè)非負(fù)整數(shù)。實(shí)際上,它是一個(gè)索引值,指向內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開文件的記錄表。當(dāng)程序打開一個(gè)現(xiàn)有文件或者創(chuàng)建一個(gè)新文件時(shí),內(nèi)核向進(jìn)程返回一個(gè)文件描述符。在程序設(shè)計(jì)中,一些涉及底層的程序編寫往往會(huì)圍繞著文件描述符展開。但是文件描述符這一概念往往只適用于UNIX、Linux這樣的操作系統(tǒng)。
select、poll和epoll的區(qū)別 select函數(shù)只能輪詢linux操作系統(tǒng)提供的fd_set這個(gè)類型的變量,poll函數(shù)輪詢的是pollfd這個(gè)類型的數(shù)組,這個(gè)數(shù)組可以自己定義長度,而不是上面select函數(shù)只能輪詢定長為FD_SETSIZE的fd_set變量。epoll不再是輪詢,而是給每個(gè)文件描述符上發(fā)生的io事件設(shè)置一個(gè)回調(diào)函數(shù)。
2.定時(shí)器是怎么實(shí)現(xiàn)的?還有什么實(shí)現(xiàn)方式?
定時(shí)器用來處理超時(shí)的請求和長時(shí)間不活躍的連接,使用stl里的priority_queue,基于小根堆的定時(shí)器關(guān)閉超時(shí)請求,并采用惰性刪除的方式,時(shí)間的到來不會(huì)喚醒線程,而是每次循環(huán)的最后進(jìn)行檢查,如果超時(shí)了再刪,因?yàn)檫@里對超時(shí)的要求并不會(huì)很高,如果此時(shí)線程忙,那么檢查時(shí)間隊(duì)列的間隔也會(huì)短,如果不忙,也給了超時(shí)請求更長的等待時(shí)間。還可以使用STL中的set。
3.實(shí)現(xiàn)一個(gè)無鎖隊(duì)列? 用原子操作
4.eventfd是什么?有什么好處?
eventfd是系統(tǒng)提供的一個(gè)輕量級的進(jìn)程間通信的系統(tǒng)調(diào)用,eventfd實(shí)現(xiàn)了線程的異步喚醒(eventfd()會(huì)返回一個(gè)文件描述符,如果該進(jìn)程被fork的時(shí)候,這個(gè)文件描述符也會(huì)復(fù)制過去,這時(shí)候就會(huì)有多個(gè)的文件描述符指向同一個(gè)eventfd對象)
5.雙緩沖區(qū)異步日志是什么?為什么要這樣做?對這個(gè)日志系統(tǒng)有沒有進(jìn)行壓力測試?
基本思路是準(zhǔn)備兩塊buffer:A和B, 前端負(fù)責(zé)往buffer A填數(shù)據(jù)(日志消息), 后端負(fù)責(zé)將buffer B的數(shù)據(jù)寫入文件;當(dāng)buffer A寫滿之后, 交換A和B, 讓后端將buffer A的數(shù)據(jù)寫入文件, 而前端則往buffer B填入新的日志消息, 如此往復(fù)。
好處:前端不是將一條條日志消息分別送給后端,而是將多條日志消息拼接成一個(gè)大的buffer傳送給后端,相當(dāng)于批處理,減少了線程喚醒的開銷。
6.什么是優(yōu)雅關(guān)閉連接?
就是read()到0,要透明的傳遞這個(gè)行為而不是直接暴力close()
7.epoll的邊沿觸發(fā)(et)和水平觸發(fā)(lt)有什么區(qū)別? lt模式下,默認(rèn)不可讀,只有epoll通知你可讀才是可讀,否則不可讀。
et模式下,默認(rèn)可讀。你可以隨便讀,直到發(fā)生EAGAIN??勺x時(shí)讀和不讀,怎么讀都由你自己決定,中間epoll不管。
EAGAIN后不可讀了,等到再次可讀,epoll會(huì)再通知一次。
ET模式要比LE復(fù)雜許多,它對用戶提出了更高的要求,即每次讀,必須讀到不能再讀(出現(xiàn)EAGAIN),每次寫,寫到不能再寫(出現(xiàn)EAGAIN)。而LT則簡單的多,可以選擇也這樣做,也可以為編程方便,比如每次只read一次(muduo就是這樣做的,這樣可以減少系統(tǒng)調(diào)用次數(shù))。
8.epoll為什么高效,相比select和poll
- 減少了用戶態(tài)和內(nèi)核態(tài)之間的文件描述符拷貝
- 減少了對就緒文件描述符的遍歷
9.假如服務(wù)器要升級,又不想讓用戶感覺到服務(wù)器升級了,該怎么做?
不間斷的提供服務(wù),參考nginx的平滑升級
10.Reactor模式是什么?
反應(yīng)器設(shè)計(jì)模式(Reactor pattern)是一種為處理并發(fā)服務(wù)請求,并將請求提交到一個(gè)或
者多個(gè)服務(wù)處理程序的事件設(shè)計(jì)模式。當(dāng)客戶端請求抵達(dá)后,服務(wù)處理程序使用多路分配策略,由一個(gè)非阻塞的線程來接收所有的請求,然后派發(fā)這些請求至相關(guān)的工作線程進(jìn)行處理。
相關(guān)案例查看更多
相關(guān)閱讀
- 云南小程序制作
- 汽車回收管理
- 小程序表單
- 昆明小程序開發(fā)
- 定制小程序開發(fā)
- 昆明網(wǎng)站設(shè)計(jì)
- typescript
- APP
- web開發(fā)
- 云南網(wǎng)站建設(shè)公司
- 退款
- 百度小程序開發(fā)公司
- 怎么做網(wǎng)站
- 網(wǎng)絡(luò)公司電話
- 云南小程序設(shè)計(jì)
- 微信分銷系統(tǒng)
- web前端
- 小程序技術(shù)
- 網(wǎng)站建設(shè)首選
- 百度小程序公司
- 貴州小程序開發(fā)
- 云南網(wǎng)站制作
- 企業(yè)網(wǎng)站
- 云南網(wǎng)站建設(shè)哪家公司好
- 云南企業(yè)網(wǎng)站
- 支付寶小程序被騙
- 江蘇小程序開發(fā)
- 手機(jī)網(wǎng)站建設(shè)
- 云南小程序開發(fā)費(fèi)用
- 網(wǎng)站建設(shè)選