socket 模型簡介
共同點:
ServerSocket serverSocket = new ServerSocket(80);
sokcet s = serverSocket.accept();
區別:
1 原始:(執行緒池)
每來一個請求分配新的一個執行緒來處理,繼續等待下一個請求,這個過程中每一個執行緒一直等待資料的到來。這種情況導致隨併發量多 執行緒數增加,系統消耗比較大
2 select(2個執行緒)
每來一個請求則把s給select,繼續等待下一個請求。來資料時select裡copy一個套接字,來處理緩衝區資料(這個過程很耗時),因當時的條件所限制select裡只能放64個套接字,也就是說併發最大量為64. 一個執行緒處理接受,另一個程式處理套接字處理資料
3 poll(2個執行緒)
每來一個請求把s給poll(push進去),繼續等待下一個請求,來資料時從push裡彈出套接字(不用copy了),處理緩衝區的資料。支援併發可以數千個。
一個執行緒處理接受,另一個程式處理套接字處理資料
4 epoll(2個執行緒)
每來一個請求把s給epoll(push進去),來資料時快取,需要處理資料時,把緩衝區的資料和套接字一起返回,這樣節省了readBuffer的時間,效率更高
一個執行緒處理接受,另一個程式處理套接字處理資料
下面深入講一下epoll模型和iocp模型的異同之處
目前國內的網遊研發,在伺服器使用的開發平臺方面,win和linux的比例各佔多少,我一時半會也沒有準確資料,但從我瞭解的這麼多公司情況來看,用win系統的還是比較多一點,這些企業一般都是比較單純的網遊公司,而用linux的則多數是一些傳統的網際網路公司,比如網易和騰訊。
網遊伺服器用win還是linux,向來都是大家關注的話題。我想,原因可能很多,但此處不想過多論述這個問題,為避免多費口舌,我還是明確表明一下自己的觀點:我是推薦用linux作開發的,雖然我也是剛轉來作linux平臺下的開發。
那麼,說具體一點。但凡作過比較深入的網路程式設計的人,都會知道,在win平臺下,高效的IO模型是IOCP,而在linux底下則是epoll。那麼,epoll與iocp之間到底有哪些異同之處呢?
首先,我們看一下它們相同的地方。
兩者都是處理非同步IO的高效模型,這種高效,除了“非同步處理”這個共同的特徵之外,二者都可以透過指標攜帶應用層資料:在IOCP裡,應用層資料可以透過單控制程式碼資料和單IO資料來與IOCP底層通訊;而在epoll裡,可以透過epoll_data裡的"void *ptr"來傳遞。這是一種很重要的思想,也是它們高效的原因所在:當事件的通知到來時,它不僅告訴你發生了什麼樣的事件,還同時告訴這次事件所操作的資料是哪些。
那麼,epoll和iocp到底又有什麼不同呢?
以我目前粗淺的使用經驗來看,至少可以得到以下結論:
1.iocp是在IO操作完成之後,才透過get函式返回這個完成通知的;而epoll則不是在IO操作完成之後才通知你,它的工作原理是,你如果想進行IO操作時,先向epoll查詢是否可讀或可寫,如果處於可讀或可寫狀態後,epoll會透過epoll_wait函式通知你,此時你再進行進一步的recv或send操作。
2.在1的基礎上,我們其實可以看到,epoll僅僅是一個非同步事件的通知機制,其本身並不作任何的IO讀寫操作,它只負責告訴你是不是可以讀或可以寫了,而具體的讀寫操作,還要應用層自己來作;但iocp的封裝就要多一些,它不僅會有完成之後的事件通知,更重要的是,它同時封裝了一部分的IO控制邏輯。從這一點上來看,iocp的封裝似乎更全面一點,但是,換個角度看,epoll僅提供這種機制也是非常好的,它保持了事件通知與IO操作之間彼此的獨立性,使得epoll的使用更加靈活。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750220/viewspace-930476/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Unix domain socket 簡介AI
- Epoll 模型簡介模型
- Linux Socket 程式設計簡介Linux程式設計
- Select 模型簡介模型
- python基礎學習-socket簡介Python
- 8 語言模型簡介模型
- 擔當力模型簡介模型
- 信貸風控模型開發----模型簡介模型
- 封裝Socket.BeginReceive/EndReceive支援Timeout簡介封裝
- Java記憶體模型 - 簡介Java記憶體模型
- Java記憶體模型簡介Java記憶體模型
- 盒子模型Box Model簡介模型
- ASP.NET MVC – 模型簡介ASP.NETMVC模型
- Socket程式設計模型程式設計模型
- 網路 IO 模型簡單介紹模型
- Apache Kafka資料模型概念簡介 - BaeldungApacheKafka模型
- Akka系列(一):Akka簡介與Actor模型模型
- Python線性分類模型簡介Python模型
- 深度學習 CNN 和 RNN 等模型簡介深度學習CNNRNN模型
- 簡單的介紹 Eloquent 模型生命週期模型
- Nelsen-Siegel—Svensson擴充套件模型簡介套件模型
- 機器學習中的邏輯迴歸模型簡介機器學習邏輯迴歸模型
- LDA主題模型簡介及Python實現LDA模型Python
- 常見物聯網模型優缺點簡介模型
- EAV(實體-屬性-值)模型簡單介紹模型
- Linux 的 Socket IO 模型趣解Linux模型
- Socket高效能IO模型淺析模型
- socket程式設計的select模型程式設計模型
- 朝花夕拾之socket的基本使用以及mina框架簡單介紹框架
- socket.io和node.js搭建即時通訊系統簡答介紹Node.js
- PHP socket 的簡單理解PHP
- 簡單的Socket通訊
- CloudNotes之領域建模篇:領域模型簡介Cloud模型
- 幽默講解 Linux 的 Socket IO 模型Linux模型
- [iOS] Socket & CocoaAsyncSocket介紹與使用iOS
- socket 完成簡單的通訊
- 大規模 Transformer 模型 8 位元矩陣乘簡介ORM模型矩陣
- Socket Server的N種併發模型彙總Server模型