青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
spserver 是一個實現(xiàn)了半同步/半異步(Half-Sync/Half-Async)和領導者/追隨者(Leader/Follower) 模式的服務器框架,能夠簡化 TCP server 的開發(fā)工作。
spserver 使用 c++ 實現(xiàn),目前實現(xiàn)了以下功能:
1.封裝了 TCP server 中接受連接的功能;
2.使用非阻塞型I/O和事件驅(qū)動模型,由主線程負責處理所有 TCP 連接上的數(shù)據(jù)讀取和發(fā)送,因此連接數(shù)不受線程數(shù)的限制;
3.主線程讀取到的數(shù)據(jù)放入隊列,由一個線程池處理實際的業(yè)務。
4.一個 http 服務器框架,即嵌入式 web 服務器(請參考:
SPWebServer:一個基于 SPServer 的 web 服務器框架

0.6 版本之前只包含 Half-Sync/Half-Async 模式的實現(xiàn),0.6 版本開始包含 Leader/Follower 模式的實現(xiàn)
0.7 版本開始支持 ssl 。把 socket 相關(guān)的操作抽象為一個 IOChannel 層,關(guān)于 openssl 的部分單獨實現(xiàn)為一個 plugin 的形式,對于不使用 ssl 功能的用戶,不需要引入 ssl 相關(guān)的頭文件和庫。
0.7.5 增加了一個 sptunnel 程序,是一個通用的 ssl proxy 。類似 stunnel 。
0.9.0 移植 spserver 到 windows 平臺,需要在 windows 下編譯 libevent 和 pthread 。
0.9.1 在 windows 平臺,去掉了對 libevent 和 pthread 依賴,完全使用 iocp 和 windows 的線程機制實現(xiàn)了半同步半異步的框架。
0.9.2 移植了所有的功能到 windows 平臺,同時新增加了 xyssl 的插件。

主頁:
http://code.google.com/p/spserver/

源代碼下載:
http://spserver.googlecode.com/files/spserver-0.6.src.tar.gz
http://code.google.com/p/spserver/downloads/list


在實現(xiàn)并發(fā)處理多事件的應用程序方面,有如下兩種常見的編程模型:
ThreadPerConnection的多線程模型和事件驅(qū)動的單線程模型。

ThreadPerConnection的多線程模型
優(yōu)點:簡單易用,效率也不錯。在這種模型中,開發(fā)者使用同步操作來編寫程序,比如使用阻塞型I/O。使用同步操作的程序能夠隱式地在線程的運行堆棧中維護應用程序的狀態(tài)信息和執(zhí)行歷史,方便程序的開發(fā)。
缺點:沒有足夠的擴展性。如果應用程序只需處理少量的并發(fā)連接,那么對應地創(chuàng)建相應數(shù)量的線程,一般的機器都還能勝任;但如果應用程序需要處理成千上萬個連接,那么為每個連接創(chuàng)建一個線程也許是不可行的。

事件驅(qū)動的單線程模型
優(yōu)點:擴展性高,通常性能也比較好。在這種模型中,把會導致阻塞的操作轉(zhuǎn)化為一個異步操作,主線程負責發(fā)起這個異步操作,并處理這個異步操作的結(jié)果。由于所有阻塞的操作都轉(zhuǎn)化為異步操作,理論上主線程的大部分時間都是在處理實際的計算任務,少了多線程的調(diào)度時間,所以這種模型的性能通常會比較好。
缺點:要把所有會導致阻塞的操作轉(zhuǎn)化為異步操作。一個是帶來編程上的復雜度,異步操作需要由開發(fā)者來顯示地管理應用程序的狀態(tài)信息和執(zhí)行歷史。第二個是目前很多廣泛使用的函數(shù)庫都很難轉(zhuǎn)為用異步操作來實現(xiàn),即是可以用異步操作來實現(xiàn),也將進一步增加編程的復雜度。

并發(fā)系統(tǒng)通常既包含異步處理服務,又包含同步處理服務。系統(tǒng)程序員有充分的理由使用異步特性改善性能。相反,應用程序員也有充分的理由使用同步處理簡化他們的編程強度。

針對這種情況,ACE 的作者提出了 半同步/半異步 (Half-Sync/Half-Async) 模式。
引用

《POSA2》上對這個模式的描述如下:
半同步/半異步 體系結(jié)構(gòu)模式將并發(fā)系統(tǒng)中的異步和同步服務處理分離,簡化了編程,同時又沒有降低性能。該模式介紹了兩個通信層,一個用于異步服務處理,另一個用于同步服務處理。

目標:
需要同步處理的簡易性的應用程序開發(fā)者無需考慮異步的復雜性。同時,必須將性能最大化的系統(tǒng)開發(fā)者不需要考慮同步處理的低效性。讓同步和異步處理服務能夠相互通信,而不會使它們的編程模型復雜化或者過度地降低它們的性能。

解決方案:
將系統(tǒng)中的服務分解成兩層,同步和異步,并且在它們之間增加一個排隊層協(xié)調(diào)異步和同步層中的服務之間的通信。在獨立線程或進程中同步地處理高層服務(如耗時長的數(shù)據(jù)庫查詢或文件傳輸),從而簡化并發(fā)編程。相反,異步地處理底層服務(如從網(wǎng)絡連接上讀取數(shù)據(jù)),以增強性能。如果駐留在相互獨立的同步和異步層中的服務必須相互通信或同步它們的處理,則應允許它們通過一個排隊層向?qū)Ψ絺鬟f消息。

模式原文:Half-Sync/Half-Async: An Architectural Pattern for Efficient and Well-structured Concurrent I/O
http://www.cs.wustl.edu/~schmidt/PDF/HS-HA.pdf
中文翻譯:http://blog.chinaunix.net/u/31756/showart_245841.html

如果上面關(guān)于 半同步/半異步 的說明過于抽象,那么可以看一個《POSA2》中提到的例子:
許多餐廳使用 半同步/半異步 模式的變體。例如,餐廳常常雇傭一個領班負責迎接顧客,并在餐廳繁忙時留意給顧客安排桌位,為等待就餐的顧客按序排隊是必要的。領班由所有顧客“共享”,不能被任何特定顧客占用太多時間。當顧客在一張桌子入坐后,有一個侍應生專門為這張桌子服務。




下面來看一個使用 spserver 實現(xiàn)的簡單的 line echo server 。

Java代碼 復制代碼
  1. class?SP_EchoHandler?:?public?SP_Handler?{ ??
  2. public: ??
  3. ??SP_EchoHandler(){} ??
  4. ??virtual?~SP_EchoHandler(){} ??
  5. ??
  6. ??//?return?-1?:?terminate?session,?0?:?continue ??
  7. ??virtual?int?start(?SP_Request?*?request,?SP_Response?*?response?)?{ ??
  8. ????request->setMsgDecoder(?new?SP_LineMsgDecoder()?); ??
  9. ????response->getReply()->getMsg()->append( ??
  10. ??????"Welcome?to?line?echo?server,?enter?'quit'?to?quit.\r\n"?); ??
  11. ??
  12. ????return?0;??? ??
  13. ??}????? ??
  14. ??
  15. ??//?return?-1?:?terminate?session,?0?:?continue ??
  16. ??virtual?int?handle(?SP_Request?*?request,?SP_Response?*?response?)?{ ??
  17. ????SP_LineMsgDecoder?*?decoder?=?(SP_LineMsgDecoder*)request->getMsgDecoder(); ??
  18. ??
  19. ????if(?0?!=?strcasecmp(?(char*)decoder->getMsg(),?"quit"?)?)?{ ??
  20. ??????response->getReply()->getMsg()->append(?(char*)decoder->getMsg()?); ??
  21. ??????response->getReply()->getMsg()->append(?"\r\n"?); ??
  22. ??????return?0;????????? ??
  23. ????}?else?{???? ??
  24. ??????response->getReply()->getMsg()->append(?"Byebye\r\n"?); ??
  25. ??????return?-1;???????? ??
  26. ????}??????????? ??
  27. ??}????? ??
  28. ??virtual?void?error(?SP_Response?*?response?)?{} ??
  29. ??
  30. ??virtual?void?timeout(?SP_Response?*?response?)?{} ??
  31. ??
  32. ??virtual?void?close()?{} ??
  33. }; ??
  34. ??
  35. class?SP_EchoHandlerFactory?:?public?SP_HandlerFactory?{ ??
  36. public: ??
  37. ??SP_EchoHandlerFactory()?{} ??
  38. ??virtual?~SP_EchoHandlerFactory()?{} ??
  39. ??
  40. ??virtual?SP_Handler?*?create()?const?{ ??
  41. ????return?new?SP_EchoHandler(); ??
  42. ??} ??
  43. }; ??
  44. ??
  45. int?main(?int?argc,?char?*?argv[]?) ??
  46. { ??
  47. ??int?port?=?3333; ??
  48. ??
  49. ??SP_Server?server(?"",?port,?new?SP_EchoHandlerFactory()?); ??
  50. ??server.runForever(); ??
  51. ??
  52. ??return?0; ??
  53. }??


在最簡單的情況下,使用 spserver 實現(xiàn)一個 TCP server 需要實現(xiàn)兩個類:SP_Handler 的子類 和 SP_HandlerFactory 的子類。
SP_Handler 的子類負責處理具體業(yè)務。
SP_HandlerFactory 的子類協(xié)助 spserver 為每一個連接創(chuàng)建一個 SP_Handler 子類實例。

1.SP_Handler 生命周期
SP_Handler 和 TCP 連接一對一,SP_Handler 的生存周期和 TCP 連接一樣。
當 TCP 連接被接受之后,SP_Handler 被創(chuàng)建,當 TCP 連接斷開之后,SP_Handler將被 destroy。

2.SP_Handler 函數(shù)說明
SP_Handler 有 5 個純虛方法需要由子類來重載。這 5 個方法分別是:
start:當一個連接成功接受之后,將首先被調(diào)用。返回 0 表示繼續(xù),-1 表示結(jié)束連接。
handle:當一個請求包接收完之后,將被調(diào)用。返回 0 表示繼續(xù),-1 表示結(jié)束連接。
error:當在一個連接上讀取或者發(fā)送數(shù)據(jù)出錯時,將被調(diào)用。error 之后,連接將被關(guān)閉。
timeout:當一個連接在約定的時間內(nèi)沒有發(fā)生可讀或者可寫事件,將被調(diào)用。timeout 之后,連接將被關(guān)閉。
close:當一個 TCP 連接被關(guān)閉時,無論是正常關(guān)閉,還是因為 error/timeout 而關(guān)閉。

3.SP_Handler 函數(shù)調(diào)用時機
當需要調(diào)用 SP_Handler 的 start/handle/error/timeout 方法時,相關(guān)的參數(shù)將被放入隊列,然后由線程池來負責執(zhí)行 SP_Handler 對應的方法。因此在 start/handle/error/timeout 中可以使用同步操作來編程,可以直接使用阻塞型 I/O 。
在發(fā)生 error 和 timeout 事件之后,close 緊跟著這兩個方法之后被調(diào)用。
如果是程序正常指示結(jié)束連接,那么在主線程中直接調(diào)用 close 方法。

4.高級功能--MsgDecoder
這個 line echo server 比起常見的 echo server 有一點不同:只有在讀到一行時才進行 echo。
這個功能是通過一個稱為 MsgDecoder 的接口來實現(xiàn)的。不同的 TCP server 在應用層的傳輸格式上各不相同。
比如在 SMTP/POP 這一類的協(xié)議中,大部分命令是使用 CRLF 作為分隔符的。而在 HTTP 中是使用 Header + Body 的形式。
為了適應不同的 TCP server,在 spserver 中有一個 MsgDecoder 接口,用來處理這些應用層的協(xié)議。
比如在這個 line echo server 中,把傳輸協(xié)議定義為:只有讀到一行時將進行 echo 。
那么相應地就要實現(xiàn)一個 SP_LineMsgDecoder ,這個 LineMsgDecoder 負責判斷目前的輸入緩沖區(qū)中是否已經(jīng)有完整的一行。

MsgDecoder 的接口如下:

Java代碼 復制代碼
  1. class?SP_MsgDecoder?{ ??
  2. public: ??
  3. ??virtual?~SP_MsgDecoder(); ??
  4. ??
  5. ??enum?{?eOK,?eMoreData?}; ??
  6. ??virtual?int?decode(?SP_Buffer?*?inBuffer?)?=?0; ??
  7. };??


decode 方法對 inBuffer 里面的數(shù)據(jù)進行檢查,看是否符合特定的要求。如果已經(jīng)符合要求,那么返回 eOK ;如果還不滿足要求,那么返回 eMoreData。比如 LineMsgDecoder 的 decode 方法的實現(xiàn)為:

Java代碼 復制代碼
  1. int?SP_LineMsgDecoder?::?decode(?SP_Buffer?*?inBuffer?) ??
  2. {??????????????? ??
  3. ??if(?NULL?!=?mLine?)?free(?mLine?); ??
  4. ??mLine?=?inBuffer->getLine(); ??
  5. ???????? ??
  6. ??return?NULL?==?mLine???eMoreData?:?eOK; ??
  7. }?????


spserver 默認提供了幾個 MsgDecoder 的實現(xiàn):
SP_DefaultMsgDecoder :它的 decode 總是返回 eOK ,即只要有輸入就當作是符合要求了。
??? 如果應用不設置 SP_Request->setMsgDecoder 的話,默認使用這個。
SP_LineMsgDecoder : 檢查到有一行的時候,返回 eOK ,按行讀取輸入。
SP_DotTermMsgDecoder :檢查到輸入中包含了特定的 <CRLF>.<CRLF> 時,返回 eOK。

具體的使用例子可以參考示例:testsmtp 。

5.高級功能--實現(xiàn)聊天室
spserver 還提供了一個廣播消息的功能。使用消息廣播功能可以方便地實現(xiàn)類似聊天室的功能。具體的實現(xiàn)可以參考示例:testchat 。

6.libevent
spserver 使用 c++ 實現(xiàn),使用了一個第三方庫--libevent,以便在不同的平臺上都能夠使用最有效的事件驅(qū)動機制(Currently, libevent supports /dev/poll, kqueue(2), select(2), poll(2) and epoll(4). )。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美jizz19hd性欧美| 久久精品国产2020观看福利| 在线观看不卡av| 欧美色播在线播放| 国语自产精品视频在线看| 在线亚洲一区二区| 亚洲国产欧美国产综合一区 | 欧美成人精品一区二区| 韩国福利一区| 久久久久久夜| 性欧美1819性猛交| 国产欧美一区二区三区在线看蜜臀| 亚洲小视频在线观看| 日韩视频在线免费| 欧美日韩一区二区在线观看视频| 一区二区不卡在线视频 午夜欧美不卡在| 欧美成人综合| 欧美国产激情| 一区二区三区高清视频在线观看| 亚洲精品护士| 欧美激情一区二区三区高清视频| 亚洲精品一区二区三区福利| 亚洲第一网站| 欧美日本中文字幕| 亚洲视频一二三| 亚洲一级片在线看| 国产午夜精品久久久久久免费视 | 99精品久久久| 欧美另类变人与禽xxxxx| 亚洲乱码国产乱码精品精| 亚洲国产mv| 欧美成人自拍视频| 亚洲视频自拍偷拍| 久久国产精品一区二区| 亚洲高清二区| 在线亚洲+欧美+日本专区| 国产女人水真多18毛片18精品视频| 久久精品国产一区二区电影| 久久一区二区三区四区五区| 亚洲免费观看| 亚洲一区二区三区欧美| 红桃视频亚洲| 日韩一区二区福利| 国产视频一区二区三区在线观看| 久久综合久久综合久久| 欧美精品观看| 欧美日韩中文字幕日韩欧美| 久久爱另类一区二区小说| 久久亚洲精品中文字幕冲田杏梨| 亚洲欧洲视频| 亚洲欧美国产制服动漫| 精品9999| 宅男精品视频| 韩日精品在线| 99国产精品一区| 一区二区亚洲精品国产| 日韩手机在线导航| 激情欧美亚洲| 在线视频亚洲一区| 亚洲欧洲视频在线| 久久精品久久综合| 亚洲欧美日韩在线| 欧美国产视频一区二区| 亚洲高清不卡| 亚洲视频在线观看一区| 在线免费观看日本一区| 亚洲影院色在线观看免费| 亚洲国产裸拍裸体视频在线观看乱了中文 | 在线成人h网| 亚洲图中文字幕| 亚洲人成人99网站| 久久精品成人一区二区三区| 亚洲午夜精品| 欧美国产精品va在线观看| 久久全球大尺度高清视频| 国产精品户外野外| 亚洲精品一级| 99re6热只有精品免费观看 | 美乳少妇欧美精品| 久久漫画官网| 国产日韩精品在线播放| 一区二区三区欧美在线观看| 亚洲国产日韩欧美在线99| 亚洲欧美国产日韩天堂区| 欧美日韩国产限制| 亚洲高清在线精品| 亚洲国产婷婷| 美女视频黄a大片欧美| 麻豆精品一区二区av白丝在线| 国产欧美另类| 亚洲欧美日韩天堂| 午夜精品久久久久久久久久久久| 欧美日韩成人网| 亚洲美女性视频| 亚洲图片在线观看| 国产精品国产亚洲精品看不卡15| 99在线|亚洲一区二区| 一本色道久久88综合日韩精品 | 亚洲综合欧美日韩| 欧美午夜精品伦理| 亚洲专区免费| 久久激情久久| 狠狠久久亚洲欧美| 麻豆久久精品| 亚洲欧洲在线视频| 中文日韩在线视频| 国产精品免费网站| 久久成人精品一区二区三区| 久久综合九色综合欧美狠狠| 亚洲精品1区2区| 欧美人成在线视频| 亚洲一区二区三区精品视频| 久久久久久综合| 亚洲国产日本| 欧美色视频一区| 午夜国产精品影院在线观看| 久久影视精品| 99国产精品99久久久久久粉嫩 | 99热精品在线| 国产精品激情| 久久亚洲综合| 亚洲欧洲一区| 欧美一区二区三区久久精品| 激情久久久久久久久久久久久久久久| 亚洲国产精品999| 夜夜爽av福利精品导航| 国产美女精品一区二区三区 | 亚洲伦理久久| 国产精品久久久久久久久久免费看| 欧美一区二区国产| 亚洲国产日韩一区| 欧美一区二区三区四区在线| 亚洲国产小视频| 国产精品成人免费| 久久―日本道色综合久久| 99re6这里只有精品| 欧美视频在线观看 亚洲欧| 欧美中文在线字幕| 亚洲激情欧美| 久久久久国产成人精品亚洲午夜| 91久久精品日日躁夜夜躁国产| 国产精品一区二区你懂得| 久久这里只有精品视频首页| 亚洲免费影视| 亚洲免费高清视频| 女人色偷偷aa久久天堂| 午夜激情亚洲| 夜夜嗨av一区二区三区免费区| 韩日视频一区| 国产精品每日更新在线播放网址| 欧美成人国产| 久久亚洲私人国产精品va| 亚洲欧美精品一区| 亚洲最新中文字幕| 亚洲国产影院| 欧美高清成人| 老司机凹凸av亚洲导航| 欧美在线视频免费播放| 亚洲午夜女主播在线直播| 亚洲精品乱码久久久久久蜜桃91| 韩国福利一区| 国产日韩欧美三区| 国产女同一区二区| 欧美视频二区| 欧美日韩国产亚洲一区| 欧美高清自拍一区| 久久久久久久成人| 欧美一区二区视频网站| 亚洲欧美激情视频在线观看一区二区三区| 亚洲人成毛片在线播放| 欧美二区在线| 欧美高清不卡| 欧美韩日视频| 亚洲福利视频专区| 亚洲第一色中文字幕| 亚洲第一精品在线| 欧美国产免费| 亚洲国产成人久久综合| 欧美二区在线看| 亚洲国产精品va在线看黑人| 亚洲国产另类久久精品| 亚洲高清久久网| 亚洲人成人77777线观看| 亚洲毛片一区| 亚洲视频在线播放| 欧美一区二区在线播放| 久久精品在线免费观看| 老司机精品视频一区二区三区| 久久一区欧美| 欧美成人黄色小视频| 欧美日韩国产首页| 国产精品自拍网站| 极品少妇一区二区三区| 亚洲国产女人aaa毛片在线| 99视频精品在线| 羞羞答答国产精品www一本| 国产精品一二三| 国产一区二区三区久久 | 久久久www免费人成黑人精品| 欧美一区二区在线视频|