談談網路編程(基於C++)__Linux

來源:互聯網
上載者:User

這篇文章講了一點網路編程的一些新路,一點體悟。學習就是這種不斷總結提高的過程。

設計到進程,線程,線程池,reactior和proactor並發編程模式,IOCP,linux下的epoll。。。。。




我從事的是企業級的軟體開發,縱觀當今的企業級軟體,單機模型已經越來越少,更多的是C/S模型,目前 client 和 server 之間通訊是通過 socket 技術來實現的。

  上面提到了 socket 技術,自然要學習 TCP/IP 協議,對於 TCP/IP 的理論,學習 Richard 的《TCP/IP 詳解卷1:協議》我認為是不二的選擇,這本書涵蓋內容很多,如果對於只是實現C/S通訊的網路程式庫而言,僅需要瞭解其中介紹 UDP 和 TCP 的章節就好,紮實的理論基礎會為你以後遇到網路傳輸中出現的問題給予很好的解釋,也便於你解決這些問題。理論聯絡實現,還是 Richard 的《UNIX 網路編程卷1:套介面 API》(俗稱 UNP1),這本書我一直在看,但是還沒看完,我認為這是網路編程的聖經,你掌握了這本書,基本也就掌握了網路編程,甚至細枝末節也能覆蓋到。

  以下只涉及 TCP 協議

  緊接著學習轉為實踐,想想網路通訊的情境:一個 server 要對應成百上千..個客戶,這樣必須要考慮到 server 的處理能力。

  最簡單的模型就是你用一個進程來處理所有的用戶端串連,my god。你想想,在處理過程中如果有上百個串連同時請求服務,我們採用這種模式,首先下一個串連要等著上一個串連處理完(同步),這個在處理的串連還很有可能阻塞在資料操作(I/O)上,這樣處理串連的效率之差及用戶端的響應之慢我想幾乎沒有人能忍受吧。

  好,為了提高效率,我們改進一下,對每一個客戶串連產生一個線程(windows)或進程(linux)來處理,拋開線程或進程的環境切換損耗不談,也不談 SMP,就單單看產產生千上百個線程和進程的可行性,對不起,咱作業系統可是有線程或進程資源上限的。

  為瞭解決線程頻繁切換造成的資源損耗和資源數限制問題,我們再改進一下,採用一個線程池來處理部分串連,其他串連排隊等候,畢竟咱 cpu 不多,同時也就能處理那麼幾個串連,響應效率和處理效率依然提不上去。

  想一個問題,其實我們的網路耗時一般都是在資料操作上(I/O),為了增加用戶端的響應,我們可以把一次網路接入分為處理串連的線程和進行邏輯處理的線程,這樣就可以極大地提高用戶端的響應,但是記住一定要在邏輯處理線程中維護住這個串連的會話。這樣彷彿還不錯,no,no,其實也不好,你並不知道什麼時候有資料到來需要處理,你必須要輪詢來確定可不可以進行資料操作….,效率還是不好啊。

  好了,咱不自己獨創技術了,選用經典的 Reactor 和 Proactor 並發編程模式,他們都是基於事件驅動的,咱呢就是把網路中需要處理的事件註冊到事件管理器中去(比如網路行為事件,IO 操作事件…..),然後等事件狀態就緒了,他就用回調的方式通知咱去處理,怎麼樣,這樣至少 CPU 不會閑著了,只用一個線程就可以處理幾乎所有的事件了。但是 Reactor 和 Proactor 還是有很大區別的,Reactor 對於I/O這一步是需要自己處理的,但是 Proactor 對於I/O這一步是由作業系統完成的,然後把完成事件通知你,然後你就可以進行下一步操作了(比如從緩衝區 buf 裡讀資料),比自己操作I/O這種方式快多了吧。目前,我在 windows 下寫網路程式庫採用的是 Proactor 模式:用 windows 自己提供的完成連接埠模型(IOCP)實現,在 linux 下,由於 linux 沒有很好的非同步I/O機制,只好採用 Reactor 方式了:使用的是 linux 特有的 epoll。

  談一些我自己的看法:從我的理解上,對於大部分網路程式庫而言,很多都是I/O密集型的,這樣彷彿採用 Proactor 模式更有優勢,但是 linux 下沒有和 windows 下 IOCP 類似的機制,但是可以採用 epoll 加任務隊列的方式實現一套,但是彷彿很複雜,我想自己實現就算了吧。好在“山窮水複疑無路,柳暗花明又一村”,boost asio 已經為我們封轉好了 windows 和 linux 下的 Proactor 實現,windows 採用的是完成連接埠,linux 下採用的是 epoll 加任務隊列的方式實現。下一步我準備把目前 linux 下採用 epoll 方式實現的 Reactor 網路程式庫改為 boost asio 的實現。

  今天,對於網路編程先總體並且概括的介紹下吧,其實還有很多問題沒有涉及,我本人對網路編程十分的感興趣,現在也在從事這方面的工作,所以以後有機會希望和大家一起分享一些更細緻全面的知識,鑒於本人水平有限,希望大家能對文章中出現的錯誤給予批評指正,我們一起進步……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.