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

下載本文檔

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

文檔簡(jiǎn)介

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

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

注冊(cè)時(shí)間,參數(shù)NULL表示無(wú)超時(shí)設(shè)置函數(shù)原型base:事件處理器所從屬的reactor實(shí)例;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:

超時(shí)

EV_READ:

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

EV_WRITE:

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

EV_SIGNAL:

POSIX信號(hào)量

EV_PERSIST:

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

EV_ET:

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論