jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
          http://blog.csdn.net/proad/archive/2008/04/16/2296925.aspx


          1. 常用服務器模型
          a.迭代服務器:只有一個進程/線程處理請求。一般為單進程,加上select多路復用,非阻塞socket。
          b.迭代/并發(fā)混合型服務器:平時迭代處理,對消耗大的請求并發(fā)處理。處理請求時設置一個超時,當請求的處理時間超時時,創(chuàng)建一個進程/線程,把處理轉給新的進程/線程處理,主進程/線程繼續(xù)處理其他請求。
          c.并發(fā)服務器:多個進程/線程并發(fā)處理請求。

          2. 以上三類的服務器比較
          迭代服務器:最簡單,性能不高。
          并發(fā)服務器:性能較高,但結構相對比較復雜,開發(fā)難度中等。
          迭代/并發(fā)混合型服務器:性能不錯,但結構通常比單純的并發(fā)服務器更復雜。

          3. 多進程的并發(fā)服務器
          a. 每個連接fork一個進程:主進程accpet連接,有新連接到來時fork一個進程,然后繼續(xù)accept,等待新的連接。數據傳輸由子進程處理,處理完后子進程exit。每個子進程只處理一個連接。
          b. Prefork進程:主進程預先fork一些進程,各個子進程競爭accept,然后處理數據傳輸。一個子進程可以處理一個連接,也可以同時處理多個連接(通過select等)。
          c. Prefork進程:由父進程accept請求,通過流管道轉發(fā)fd到子進程,子進程收到fd后,處理數據傳輸,處理結束后通知父進程。父進程處理的事情比較簡單,容易監(jiān)控子進程。

          以上3種方式性能比較:
          a.每個連接fork一個進程:處理smtp等狀態(tài)較多,數據量比較大時比較簡單實用,總體性能不大好。
          b.Prefork進程,各個子進程競爭accept:比較簡單,性能不錯。
          c.Prefork進程,由父進程accept請求,通過流管道轉發(fā)fd到子進程:代碼復雜,性能一般不如上一種。

          4. 多線程的并發(fā)服務器
          a.每個連接一個線程
          b.Prethread多個線程,各個線程互斥accept
          c.Prethread多個線程,主線程accept并分發(fā)連接給子線程

          5. 多進程與多線程的比較
          使用線程的模型:性能比使用進程要高,但代碼比較復雜,對代碼質量要求更高,線程出錯后可能會影響到所有線程,多進程的模式一個進程出錯一般不會影響其他進程。
          多線程模型共享數據比較簡單有效,多進程模型共享數據比較麻煩,效率也不如線程。

          6. 一些流行的網絡服務器采用的模型

          Sendmail: 采用多進程,每個連接fork一個進程.
          每個連接fork一個子進程
          子進程只處理一個連接
          子進程fork一個localmail進程(可以由用戶自己編寫),通過管道把數據轉給localmail處理,把郵件處理業(yè)務邏輯獨立出來
          優(yōu)點:結構簡單,不用維護復雜的狀態(tài)機

          Apache1.3:采用多進程, prefork進程
          子進程競爭accept,每次只處理一個連接
          主進程不accept,根據負載情況調整子進程數量
          子進程運行一段時間后,主進程會讓它退出,然后創(chuàng)建一個新的進程,防止內存泄漏等
          主進程通過shared memory監(jiān)控子進程

          移動QQ: Prefork多個進程,競爭accept,
          典型的一問一答TCP服務器,結構簡單
          每個進程通過select可以同時處理多個連接
          采用這種結構的原因有:
          每秒請求<1000,可以滿足要求
          結構簡單,容易開發(fā)、維護

          posted on 2010-04-16 11:36 jinfeng_wang 閱讀(1402) 評論(0)  編輯  收藏 所屬分類: viewLinuxwebsite
          主站蜘蛛池模板: 玛曲县| 乌鲁木齐县| 林西县| 温宿县| 平阴县| 遂平县| 鲁山县| 永年县| 津南区| 遂宁市| 扶沟县| 广灵县| 巴南区| 盘锦市| 太白县| 湘阴县| 门头沟区| 台前县| 临潭县| 卢湾区| 宽城| 新巴尔虎左旗| 临城县| 象山县| 夏津县| 临沧市| 观塘区| 涞水县| 东至县| 浦北县| 巴中市| 尖扎县| 固原市| 木里| 商洛市| 理塘县| 桐梓县| 诸城市| 胶南市| 鹿泉市| 马关县|