C++web服務器開發 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 網站建設 >

C++web服務器開發

發表時(shí)間:2019-8-14

發布人(rén):融晨科技

浏覽次數:68

C++web服務器開發

1. 首先介紹一下這(zhè)個(gè)項目;這(zhè)個(gè)項目是(shì)通過C++11編寫的(de)web服務器,模型爲(wéi / wèi)Reactor+非阻塞I/O(epoll作爲(wéi / wèi)I/O多路複用實現方式)+線程池,支持get、head請求,支持HTTP長連接,并實現了(le/liǎo)優雅關閉連接。

I/O多路複用是(shì)什麽技術呢? I/O多路複用(multiplexing)的(de)本質是(shì)通過一種機制(系統内核緩沖I/O數據),讓單個(gè)進程可以(yǐ)監視多個(gè)文件描述符,一旦某個(gè)描述符就(jiù)緒(一般是(shì)讀就(jiù)緒或寫就(jiù)緒),能夠通知程序進行相應的(de)讀寫操作。(包括select、poll、epoll)

文件描述符 文件描述符(File descriptor)是(shì)計算機科學中的(de)一個(gè)術語,是(shì)一個(gè)用于(yú)表述指向文件的(de)引用的(de)抽象化概念。
文件描述符在(zài)形式上(shàng)是(shì)一個(gè)非負整數。實際上(shàng),它是(shì)一個(gè)索引值,指向内核爲(wéi / wèi)每一個(gè)進程所維護的(de)該進程打開文件的(de)記錄表。當程序打開一個(gè)現有文件或者創建一個(gè)新文件時(shí),内核向進程返回一個(gè)文件描述符。在(zài)程序設計中,一些涉及底層的(de)程序編寫往往會圍繞着文件描述符展開。但是(shì)文件描述符這(zhè)一概念往往隻适用于(yú)UNIX、Linux這(zhè)樣的(de)操作系統。

select、poll和(hé / huò)epoll的(de)區别 select函數隻能輪詢linux操作系統提供的(de)fd_set這(zhè)個(gè)類型的(de)變量,poll函數輪詢的(de)是(shì)pollfd這(zhè)個(gè)類型的(de)數組,這(zhè)個(gè)數組可以(yǐ)自己定義長度,而(ér)不(bù)是(shì)上(shàng)面select函數隻能輪詢定長爲(wéi / wèi)FD_SETSIZE的(de)fd_set變量。epoll不(bù)再是(shì)輪詢,而(ér)是(shì)給每個(gè)文件描述符上(shàng)發生的(de)io事件設置一個(gè)回調函數。

2.定時(shí)器是(shì)怎麽實現的(de)?還有什麽實現方式?
定時(shí)器用來(lái)處理超時(shí)的(de)請求和(hé / huò)長時(shí)間不(bù)活躍的(de)連接,使用stl裏的(de)priority_queue,基于(yú)小根堆的(de)定時(shí)器關閉超時(shí)請求,并采用惰性删除的(de)方式,時(shí)間的(de)到(dào)來(lái)不(bù)會喚醒線程,而(ér)是(shì)每次循環的(de)最後進行檢查,如果超時(shí)了(le/liǎo)再删,因爲(wéi / wèi)這(zhè)裏對超時(shí)的(de)要(yào / yāo)求并不(bù)會很高,如果此時(shí)線程忙,那麽檢查時(shí)間隊列的(de)間隔也(yě)會短,如果不(bù)忙,也(yě)給了(le/liǎo)超時(shí)請求更長的(de)等待時(shí)間。還可以(yǐ)使用STL中的(de)set。

3.實現一個(gè)無鎖隊列? 用原子(zǐ)操作

4.eventfd是(shì)什麽?有什麽好處?
eventfd是(shì)系統提供的(de)一個(gè)輕量級的(de)進程間通信的(de)系統調用,eventfd實現了(le/liǎo)線程的(de)異步喚醒(eventfd()會返回一個(gè)文件描述符,如果該進程被fork的(de)時(shí)候,這(zhè)個(gè)文件描述符也(yě)會複制過去,這(zhè)時(shí)候就(jiù)會有多個(gè)的(de)文件描述符指向同一個(gè)eventfd對象)

5.雙緩沖區異步日志是(shì)什麽?爲(wéi / wèi)什麽要(yào / yāo)這(zhè)樣做?對這(zhè)個(gè)日志系統有沒有進行壓力測試?
基本思路是(shì)準備兩塊buffer:A和(hé / huò)B, 前端負責往buffer A填數據(日志消息), 後端負責将buffer B的(de)數據寫入文件;當buffer A寫滿之(zhī)後, 交換A和(hé / huò)B, 讓後端将buffer A的(de)數據寫入文件, 而(ér)前端則往buffer B填入新的(de)日志消息, 如此往複。
好處:前端不(bù)是(shì)将一條條日志消息分别送給後端,而(ér)是(shì)将多條日志消息拼接成一個(gè)大(dà)的(de)buffer傳送給後端,相當于(yú)批處理,減少了(le/liǎo)線程喚醒的(de)開銷。

6.什麽是(shì)優雅關閉連接?
就(jiù)是(shì)read()到(dào)0,要(yào / yāo)透明的(de)傳遞這(zhè)個(gè)行爲(wéi / wèi)而(ér)不(bù)是(shì)直接暴力close()

7.epoll的(de)邊沿觸發(et)和(hé / huò)水平觸發(lt)有什麽區别? lt模式下,默認不(bù)可讀,隻有epoll通知你可讀才是(shì)可讀,否則不(bù)可讀。
et模式下,默認可讀。你可以(yǐ)随便讀,直到(dào)發生EAGAIN。可讀時(shí)讀和(hé / huò)不(bù)讀,怎麽讀都由你自己決定,中間epoll不(bù)管。
EAGAIN後不(bù)可讀了(le/liǎo),等到(dào)再次可讀,epoll會再通知一次。
ET模式要(yào / yāo)比LE複雜許多,它對用戶提出(chū)了(le/liǎo)更高的(de)要(yào / yāo)求,即每次讀,必須讀到(dào)不(bù)能再讀(出(chū)現EAGAIN),每次寫,寫到(dào)不(bù)能再寫(出(chū)現EAGAIN)。而(ér)LT則簡單的(de)多,可以(yǐ)選擇也(yě)這(zhè)樣做,也(yě)可以(yǐ)爲(wéi / wèi)編程方便,比如每次隻read一次(muduo就(jiù)是(shì)這(zhè)樣做的(de),這(zhè)樣可以(yǐ)減少系統調用次數)。

8.epoll爲(wéi / wèi)什麽高效,相比select和(hé / huò)poll

  1. 減少了(le/liǎo)用戶态和(hé / huò)内核态之(zhī)間的(de)文件描述符拷貝
  2. 減少了(le/liǎo)對就(jiù)緒文件描述符的(de)遍曆

9.假如服務器要(yào / yāo)升級,又不(bù)想讓用戶感覺到(dào)服務器升級了(le/liǎo),該怎麽做?
不(bù)間斷的(de)提供服務,參考nginx的(de)平滑升級

10.Reactor模式是(shì)什麽?
反應器設計模式(Reactor pattern)是(shì)一種爲(wéi / wèi)處理并發服務請求,并将請求提交到(dào)一個(gè)或
者多個(gè)服務處理程序的(de)事件設計模式。當客戶端請求抵達後,服務處理程序使用多路分配策略,由一個(gè)非阻塞的(de)線程來(lái)接收所有的(de)請求,然後派發這(zhè)些請求至相關的(de)工作線程進行處理。

相關案例查看更多