linux c 多线程socket编程,Linux多线程socket编程一些心得
前段時間將新的web模型辦到Linux上來,用epoll代替了IOCP,經(jīng)測試確實性能提高了很多,吞吐量也寓所提高,對于Linux下面的網(wǎng)絡(luò)編程不是三言兩語就能說得透的了,加上多線程就更麻煩了,但是epoll模型的精髓就是事件驅(qū)動,這種模型提供了保持連接socket直線增漲而性能不會直線下降的特性,縱觀epoll kueuen select等等,所有都是在解決一個socket不需要一個線程的問題,將事件去分開來。
在ningx(有人用他同時保持了3萬個處理連接)上的到了一些體會,這些不僅使用于web這樣模型的server,同樣適合于所有其他的比如游戲、ftp服務(wù)器等。
維持高在線人數(shù)的關(guān)鍵問題在于事件處理模型需要m:n,m遠(yuǎn)
nginx的做法是將處理程序嚴(yán)格區(qū)分開來(本次我作的Flower web server也是基于此原理),等待epoll等事件通知,他在全局范圍內(nèi)維護了兩個鏈表,一個讀連表,一個寫鏈表,epoll等系統(tǒng)網(wǎng)絡(luò)通知通知了某個socket可操作后他便將狀態(tài)保存在相應(yīng)的變量里面,然后采取m個線程輪詢執(zhí)行任務(wù),這樣線程就不用等待網(wǎng)絡(luò)io堵塞,正常的一個read socket數(shù)據(jù)需要循環(huán),直到數(shù)據(jù)讀完或者產(chǎn)生錯誤,但我的處理不是這樣的,我在全局范圍內(nèi)維護一個統(tǒng)一的socket fd表,這是Linux的特性決定的,因為Linux的socket fd是從很小的值開始的,并且同一時間內(nèi)不會重復(fù)(估計內(nèi)部有線程鎖),所有fd本身就是一個重要的標(biāo)識量,并且一個大的fd釋放后還會從小的開始重復(fù)利用,winsows下的就不一樣,他是一個長長的指針,所有我的全局狀態(tài)表就需要一個用fd作為索引的標(biāo)識就可以了,最大的fd也就是同時保持在線人數(shù)的大體數(shù)字,我設(shè)置了一個20000的狀態(tài)表,暫用棧內(nèi)存很小,基本上不會被用完。
然后我同樣對read和write設(shè)置兩個獨立的狀態(tài)鏈表,用m個線程來處理,所不同的是這兩個表只有一個fd項,其余的數(shù)據(jù)都是保存在堆分配的全局狀態(tài)表中,我對全局狀態(tài)表設(shè)置很多的狀態(tài)值,比如:read write readed writed needRepetRead needrepetWrite restart等等,這樣我可以將其他的處理分別用新的狀態(tài)鏈表來保持,鎖不同的是全局表的狀態(tài)不一樣,從而達(dá)到多個處理程序協(xié)作的問題,互斥鎖只存在于各個處理環(huán)節(jié),如果讀的環(huán)節(jié)慢了就可以加大讀的線程數(shù),寫的慢了可以加大寫的,處理的過程慢了可以加大處理的,這樣方便系統(tǒng)后期調(diào)試優(yōu)化,但是每一個環(huán)節(jié)都不會影響全局表的處理,不會因為一個線程堵塞或則死掉導(dǎo)致全局的狀態(tài)都沒法進行。
初步作出來的模型同樣采用sendfile+epoll情況下,經(jīng)測試我的server已經(jīng)略微超過nginx,下面就是進一步的規(guī)范和優(yōu)化擴展的部分了。(出自:凌曉web部落)
總結(jié)
以上是生活随笔為你收集整理的linux c 多线程socket编程,Linux多线程socket编程一些心得的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux指向域同步时间,linux在局
- 下一篇: linux打补丁前如何备份,关于Linu