第11章客戶服務(wù)器設(shè)計模式_第1頁
第11章客戶服務(wù)器設(shè)計模式_第2頁
第11章客戶服務(wù)器設(shè)計模式_第3頁
第11章客戶服務(wù)器設(shè)計模式_第4頁
第11章客戶服務(wù)器設(shè)計模式_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第11章客戶/服務(wù)器設(shè)計模式11.1客戶端程序設(shè)計模式11.2迭代式服務(wù)器11.3并發(fā)式服務(wù)器11.4IO復(fù)用式服務(wù)器11.5Reactor模式和Proactor模式11.6I/O框架庫libevent介紹11.1客戶端程序設(shè)計模式客戶端程序相對比較簡單,常見的設(shè)計模式如下:1、停-等模式客戶端在本地操作和網(wǎng)絡(luò)通信之間交替進(jìn)行。主要有兩個缺點:1,阻塞在本地操作時不能及時接收對端關(guān)閉連接等網(wǎng)絡(luò)事件;2、運行效率較低11.1客戶端程序設(shè)計模式客戶端程序相對比較簡單,常見的設(shè)計模式如下:2、非阻塞式IO模式11.1客戶端程序設(shè)計模式客戶端程序相對比較簡單,常見的設(shè)計模式如下:2、非阻塞式IO模式。特點:性能好,代碼稍復(fù)雜11.1客戶端程序設(shè)計模式客戶端程序相對比較簡單,常見的設(shè)計模式如下:3、雙進(jìn)程模式,一個進(jìn)程發(fā),一個進(jìn)程收。特點:代碼簡單11.1客戶端程序設(shè)計模式客戶端程序相對比較簡單,常見的設(shè)計模式如下:4、雙線程模式,一個線程發(fā),一個線程收。特點:代碼簡單11.1客戶端程序設(shè)計模式客戶端程序相對比較簡單,常見的設(shè)計模式如下:4、雙線程模式,一個線程發(fā),一個線程收11.2迭代式服務(wù)器服務(wù)器循環(huán)執(zhí)行:(建立連接)接收數(shù)據(jù)處理數(shù)據(jù)發(fā)送數(shù)據(jù)(斷開連接)特點:適合于大部分的UDP服務(wù)器和短連接簡單服務(wù)的TCP服務(wù)器11.3并發(fā)式服務(wù)器1、每個客戶一個子進(jìn)程特點:簡單,并發(fā)數(shù)受子進(jìn)程數(shù)量限制,進(jìn)程調(diào)度有代價,創(chuàng)建進(jìn)程耗時較長。11.3并發(fā)式服務(wù)器1、每個客戶一個子進(jìn)程特點:簡單,并發(fā)數(shù)受子進(jìn)程數(shù)量限制,進(jìn)程調(diào)度有代價,創(chuàng)建進(jìn)程耗時較長。11.3并發(fā)式服務(wù)器2、預(yù)先派生子進(jìn)程池,accept無上鎖保護(hù)優(yōu)點:無須引入父進(jìn)程執(zhí)行fork的開銷就能處理新到的客戶。缺點:1.如何確定預(yù)先派生多少個子進(jìn)程(可采用動態(tài)調(diào)整子進(jìn)程數(shù)量的方案);2.驚群問題(預(yù)先派生的子進(jìn)程都阻塞在accept調(diào)用上,當(dāng)有新連接到來時,都會被喚醒,盡管只有一個子進(jìn)程將獲得連接)11.3并發(fā)式服務(wù)器2、預(yù)先派生子進(jìn)程池,accept無上鎖保護(hù)11.3并發(fā)式服務(wù)器3、預(yù)先派生子進(jìn)程池,accept使用文件上鎖保護(hù)特點:任意時刻只有一個子進(jìn)程阻塞在accept調(diào)用中,其它子進(jìn)程則阻塞在試圖獲取用于包含accept的鎖上11.3并發(fā)式服務(wù)器3、預(yù)先派生子進(jìn)程池,accept使用文件上鎖保護(hù)11.3并發(fā)式服務(wù)器3、預(yù)先派生子進(jìn)程池,accept使用文件上鎖保護(hù)11.3并發(fā)式服務(wù)器4、預(yù)先派生子進(jìn)程池,accept使用線程上鎖保護(hù)通過共享內(nèi)存,在不同進(jìn)程之間共享互斥鎖。11.3并發(fā)式服務(wù)器4、預(yù)先派生子進(jìn)程池,accept使用線程上鎖保護(hù)通過共享內(nèi)存,在不同進(jìn)程之間共享互斥鎖。11.3并發(fā)式服務(wù)器5、預(yù)先派生子進(jìn)程池,關(guān)閉子進(jìn)程中的監(jiān)聽套接字,只讓父進(jìn)程調(diào)用accept,然后把所接受的已連接套接字傳遞給某個子進(jìn)程。這種做法繞過了為所有子進(jìn)程的accept調(diào)用提供上鎖保護(hù)的需求,不過需要完成套接字描述符從父進(jìn)程傳遞給某個子進(jìn)程。為此父進(jìn)程需要跟蹤子進(jìn)程的忙閑狀態(tài),以便給空閑的子進(jìn)程傳遞新的套接字??梢栽谧舆M(jìn)程中建立狀態(tài)一個信息結(jié)構(gòu),父進(jìn)程通過管道獲取子進(jìn)程的狀態(tài)信息。缺點:代碼較為復(fù)雜。11.3并發(fā)式服務(wù)器6、每個客戶一個線程特點:用線程取代進(jìn)程,代價更小。主線程阻塞在accept上,當(dāng)返回一個客戶連接時,調(diào)用pthread_create創(chuàng)建一個新線程,并把已連接套接字作為參數(shù)傳遞給新線程的執(zhí)行函數(shù)11.3并發(fā)式服務(wù)器6、每個客戶一個線程特點:用線程取代進(jìn)程,代價更小。11.3并發(fā)式服務(wù)器7、預(yù)先創(chuàng)建線程池,每個線程各自accept特點:預(yù)先創(chuàng)建線程池性能會優(yōu)于臨時創(chuàng)建線程。使用互斥鎖保證任何時刻只有一個線程阻塞在accept上。11.3并發(fā)式服務(wù)器7、預(yù)先創(chuàng)建線程池,每個線程各自accept11.3并發(fā)式服務(wù)器7、預(yù)先創(chuàng)建線程池,每個線程各自accept11.3并發(fā)式服務(wù)器8、預(yù)先創(chuàng)建線程池,主線程統(tǒng)一accept特點:主線程統(tǒng)一accept然后把每個客戶端連接傳遞給池中某個可用線程。同一進(jìn)程內(nèi)的線程間共享數(shù)據(jù)非常方便。可以由主線程將已連接套接字描述符存入共享數(shù)組,并由線程池中的可以線程從中取出一個以服務(wù)相應(yīng)的客戶。這個共享數(shù)組需要使用互斥鎖和條件變量保護(hù)。11.3并發(fā)式服務(wù)器8、預(yù)先創(chuàng)建線程池,主線程統(tǒng)一accept11.3并發(fā)式服務(wù)器8、預(yù)先創(chuàng)建線程池,主線程統(tǒng)一accept11.3并發(fā)式服務(wù)器8、預(yù)先創(chuàng)建線程池,主線程統(tǒng)一accept線程池中的每個線程都試圖獲取保護(hù)clifd的互斥鎖,獲得之后比較iget和iput,如果相等表示無事可做,通過pthread_cond_wait睡眠在條件變量上。直到主線程獲取一個連接,然后發(fā)送信號通知。11.4I/O復(fù)用式服務(wù)器通過select、poll、epoll同時監(jiān)測多個文件描述符,當(dāng)有事件發(fā)生時進(jìn)行事件處理,比調(diào)整監(jiān)測的事件集合,然后再次阻塞在select、poll、epoll等I/O復(fù)用監(jiān)聽上。特點:不能再有其它的阻塞位置

事件處理可以快速返回。Select處理準(zhǔn)備FD11.4I/O復(fù)用式服務(wù)器統(tǒng)一事件源:進(jìn)程在運行時收到信號,會中斷當(dāng)前循環(huán)進(jìn)行信號處理函數(shù)。信號處理函數(shù)和程序主循環(huán)是兩條不同的執(zhí)行路線,信號處理函數(shù)也需要盡快處理完成,以確保信號不被屏蔽太久。一種有效的處理方式是,把信號的主要處理邏輯放在程序的主循環(huán)中,當(dāng)信號處理函數(shù)被觸發(fā)時,它只是簡單的把信號值傳遞給主循環(huán),主循環(huán)在根據(jù)收到的信號值執(zhí)行對應(yīng)的邏輯代碼。信號處理函數(shù)可以通過管道將信號值傳遞給主循環(huán)。主循環(huán)通過I/O復(fù)用從管道讀出信號值,這種把信號事件和其它I/O事件統(tǒng)一處理的方式叫統(tǒng)一事件源。11.4I/O復(fù)用式服務(wù)器統(tǒng)一事件源:11.4I/O復(fù)用式服務(wù)器統(tǒng)一事件源:11.4I/O復(fù)用式服務(wù)器統(tǒng)一事件源:11.4I/O復(fù)用式服務(wù)器統(tǒng)一事件源:11.4I/O復(fù)用式服務(wù)器統(tǒng)一事件源:11.4I/O復(fù)用式服務(wù)器統(tǒng)一事件源:11.5Reactor模式和Proactor模式I/O處理單元邏輯單元邏輯單元網(wǎng)絡(luò)存儲單元11.5Reactor模式和Proactor模式11.3并發(fā)式服務(wù)器適合消息處理密度高的場景,不適合長連接11.4I/O復(fù)用式服務(wù)器適合長連接,不適合處理耗時的消息處理Reactor模式:主線程(I/O處理單元)負(fù)責(zé)監(jiān)聽文件描述符上是否有事件發(fā)生,有的話立即將該事件通知工作線程(邏輯單元),除此之外,主線程不做任何實質(zhì)性的工作,讀寫數(shù)據(jù),接受新的連接,以及處理客戶請求均在工作線程中完成。使用epoll_wait實現(xiàn)的Reactor模式工作流程如下:1、主線程往epoll內(nèi)核事件表中注冊socket上的讀就緒事件2、主線程調(diào)用epoll_wait等待socket上有數(shù)據(jù)可讀3、當(dāng)socket上有數(shù)據(jù)可讀時,epoll_wait通知主線程,主線程將socket可讀事件放入請求隊列11.5Reactor模式和Proactor模式使用epoll_wait實現(xiàn)的Reactor模式工作流程如下:4、睡眠在請求隊列上的某個工作線程被喚醒,它從socket上讀取數(shù)據(jù),并處理客戶請求然后往epoll內(nèi)核事件表中注冊該socket上的寫就緒事件。5、主線程調(diào)用epoll_wait等待socket可寫6、當(dāng)socket可寫時,epoll_wait通知主線程,主線程將socket可寫事件放入請求隊列7、睡眠在請求隊列上的某個工作線程被喚醒,它往socket上寫入服務(wù)器處理客戶請求的結(jié)果。11.5Reactor模式和Proactor模式Proactor模式:Proactor模式將所有I/O操作都交給主線程和內(nèi)核來處理,工作線程僅負(fù)責(zé)業(yè)務(wù)邏輯。Proactor可以使用異步I/O實現(xiàn)。也可以使用同步I/O模擬實現(xiàn)。使用epoll_wait模擬實現(xiàn)的Reactor模式工作流程如下:1、主線程往epoll內(nèi)核事件表中注冊socket上的讀就緒事件2、主線程調(diào)用epoll_wait等待socket上有數(shù)據(jù)可讀3、當(dāng)socket上有數(shù)據(jù)可讀時,epoll_wait通知主線程,主線程從socket上讀取數(shù)據(jù),然后將讀取到的數(shù)據(jù)封裝為一個請求對象放入請求隊列11.5Reactor模式和Proactor模式使用epoll_wait模擬實現(xiàn)的Reactor模式工作流程如下:4、睡眠在請求隊列上的某個工作線程被喚醒,它獲得請求對象,并處理客戶請求然后往epoll內(nèi)核事件表中注冊該socket上的寫就緒事件。5、主線程調(diào)用epoll_wait等待socket可寫6、當(dāng)socket可寫時,epoll_wait通知主線程,主線程往socket上寫入服務(wù)器處理客戶請求的結(jié)果。11.6I/O框架庫libevent介紹開源社區(qū)提供了諸多優(yōu)秀的I/O框架庫,以庫函數(shù)的形式,封裝了較為底層的系統(tǒng)調(diào)用,解決了I/O事件、信號和定時事件的集中高效處理,在可移植性,穩(wěn)定性、性能等方面都較為出色,使開發(fā)者可以將精力放在業(yè)務(wù)邏輯上。常見的I/O框架庫有ACE、ASIO、Libevent、mina等。11.6I/O框架庫libevent介紹/11.6I/O框架庫libevent介紹/11.6I/O框架庫libevent介紹/libevent是一個事件觸發(fā)的網(wǎng)絡(luò)庫,適用于windows、linux、bsd等多種平臺,內(nèi)部使用select、epoll、kqueue等系統(tǒng)調(diào)用管理事件機制。編譯庫代碼,編譯腳本會判斷OS支持哪種類型的事件機制(select、epoll或kqueue),然后條件編譯相應(yīng)代碼,供上層使用的接口仍然是保持統(tǒng)一的libevent支持用戶使用三種類型的事件,網(wǎng)絡(luò)IO、定時器、信號,在定時器的實現(xiàn)上使用了RBtree的數(shù)據(jù)結(jié)構(gòu),以達(dá)到高效查找、排序、刪除定時器的目的。基于Reactor模式實現(xiàn)11.6I/O框架庫libevent介紹安裝方式示例程序示例程序創(chuàng)建event_base對象,一個event_base相對于一個Reactor創(chuàng)建信號處理器,指明了信號和處理函數(shù)將信號處理器添加到事件隊列開始執(zhí)行事件循環(huán)

注冊時間,參數(shù)NULL表示無超時設(shè)置函數(shù)原型base:事件處理器所從屬的reactor實例;event_base_new的返回值fd:和事件處理器關(guān)聯(lián)的句柄;events:事件類型EV_TIMEOUT,EV_READ,EV_WRITE,EV_SIGNAL,EV_PERSIST(永久事件)event_callback_fn:回調(diào)函數(shù)arg:參數(shù)函數(shù)原型事件類型:EV_TIMEOUT:

超時

EV_READ:

只要網(wǎng)絡(luò)緩沖中還有數(shù)據(jù),回調(diào)函數(shù)就會被觸發(fā)

EV_WRITE:

只要塞給網(wǎng)絡(luò)緩沖的數(shù)據(jù)被寫完,回調(diào)函數(shù)就會被觸發(fā)

EV_SIGNAL:

POSIX信號量

EV_PERSIST:

不指定這個屬性的話,回調(diào)函數(shù)被觸發(fā)后事件會被刪除

EV_ET:

Edge-Trigger邊緣觸發(fā),相當(dāng)于EPOLL的ET模式示例代碼2聲明一系列回調(diào)函數(shù)示例代碼2創(chuàng)建event_base對象,一個event_base相對于一個Reactorevconnlistener機制提供了監(jiān)聽和接受TCP連接的方法示例代碼2分配并返回一個新的連接監(jiān)聽器對象,新連接到來時,調(diào)用listener_cb回調(diào)函數(shù)示例代碼2flags:LEV_OPT_LEAVE_SOCKETS_BLOCKIN,默認(rèn)情況下連接監(jiān)聽器接收新套接字后,會將其設(shè)置為非阻塞,如果不想要這種行為,可以設(shè)置這個標(biāo)志。LEV_OPT_CLOSE_ON_FREE,釋放連接監(jiān)聽器時會關(guān)閉套接字EV_OPT_REUSEABLE,設(shè)置在TIME_WAIT狀態(tài)可以再次打開示例代碼2開始執(zhí)行事件循環(huán)創(chuàng)建信號處理器,指明了信號和處理函數(shù)示例代碼2創(chuàng)建和新連接關(guān)聯(lián)的bufferevent示例代碼2Libeve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論