這篇文章主要介紹了Linux中并發(fā)服務(wù)器的實(shí)現(xiàn)模式有哪些,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
公司主營業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出玉泉免費(fèi)做網(wǎng)站回饋大家。
1>單線程或者單進(jìn)程
相當(dāng)于短鏈接,當(dāng)accept之后,就開始數(shù)據(jù)的接收和數(shù)據(jù)的發(fā)送,不接受新的連接,即一個(gè)server,一個(gè)client
不存在并發(fā)。
2>循環(huán)服務(wù)器和并發(fā)服務(wù)器
1.循環(huán)服務(wù)器:一個(gè)server只能一次只能接收一個(gè)client,當(dāng)當(dāng)前client結(jié)束訪問之后才能進(jìn)行下一個(gè)client的連接。
2.并發(fā)服務(wù)器:一個(gè)server同一時(shí)間可以響應(yīng)很多客戶端的訪問。
3>select+多線程模式
并發(fā)服務(wù)器的三種實(shí)現(xiàn)方式
1.多進(jìn)程并發(fā)服務(wù)器
是指TCP連接后,每一個(gè)客戶機(jī)的請求并不由服務(wù)器直接處理,而是由服務(wù)器創(chuàng)建一個(gè)子進(jìn)程來處理
2.多線程并發(fā)服務(wù)器
多進(jìn)程服務(wù)器是對多進(jìn)程的服務(wù)器的改進(jìn),由于多進(jìn)程服務(wù)器在創(chuàng)建進(jìn)程時(shí)要消耗較大的系統(tǒng)資源,所以用線程來取代進(jìn)程,這樣服務(wù)處理程序可以較快的創(chuàng)建。據(jù)統(tǒng)計(jì),創(chuàng)建線程于創(chuàng)建進(jìn)程要快10100倍,所以又把線程稱為“輕量級”進(jìn)程。進(jìn)程與進(jìn)程不同的是:一個(gè)進(jìn)程內(nèi)所有線程共享相同的全局內(nèi)存,全局變量等信息。
是指TCP連接后,每一個(gè)客戶機(jī)的請求并不由服務(wù)器直接處理,而是由服務(wù)器創(chuàng)
3.多路復(fù)用I/O
I/O是為了解決線程/進(jìn)程阻塞在那個(gè)I/O調(diào)用中,常用select或者pool
4>epoll
在linux2.6之后有的epoll,實(shí)用的方法是:用一個(gè)線程專門進(jìn)行端口的監(jiān)聽,accept接收到連接的時(shí)候,把連接設(shè)置成非阻塞方式,把epoll時(shí)間設(shè)置成邊緣觸發(fā)方式,加入epoll管理。接收線程阻塞在epoll的等待事件函數(shù)。另外一個(gè)線程專門用于數(shù)據(jù)發(fā)送。
注意:
1.如果把epoll設(shè)置成水平觸發(fā)效率就下降采用select的水平。
2.Unix系統(tǒng)下有單個(gè)進(jìn)程打開的描述符的限制,還有系統(tǒng)內(nèi)打開的描述符的數(shù)目限制。系統(tǒng)內(nèi)打開的描述符數(shù)目限制由軟硬鏈接限制兩個(gè)。硬連接是根據(jù)機(jī)器的配置而不同。軟連接限制可以修改但是必須小于硬限制。
應(yīng)用:
Linux下大規(guī)模的TCP并發(fā)。
當(dāng)前并發(fā)還有其它的方式。比如線程池。進(jìn)程池等,每種模式都有他的優(yōu)缺點(diǎn),如果大規(guī)模的并發(fā),采用epoll會更好。
epoll的時(shí)間設(shè)置有邊緣觸發(fā)方式和水平觸發(fā)方式
1.水平觸發(fā)方式:
如果文件描述符已經(jīng)就緒可以非阻塞的執(zhí)行IO操作了,此時(shí)會觸發(fā)通知。允許在任意時(shí)候重復(fù)檢測IO的狀態(tài),沒有必要每次描述符就緒后盡可能多的執(zhí)行IO,select,poll就屬于水平觸發(fā)事件。
只要滿足要求就觸發(fā)一個(gè)事件。
2.邊緣觸發(fā)方式:
如果文件描述符自上次狀態(tài)改變后有新的IO活動(dòng)到來,此時(shí)會觸發(fā)通知。在收到一個(gè)IO事件通知盡可能多的執(zhí)行IO操作,因?yàn)槿绻僖淮瓮ㄖ袥]有執(zhí)行完IO那么就需要等到下一次新的IO活動(dòng)到來才能獲取就緒的描述符。信號驅(qū)動(dòng)式IO就屬于邊緣觸發(fā)。
每當(dāng)狀態(tài)改變就觸發(fā)一個(gè)事件。
eg:現(xiàn)在有一個(gè)1000個(gè)字節(jié)的報(bào)文,無論是水平觸發(fā)還是邊緣觸發(fā),都會發(fā)送一個(gè)只讀通知,當(dāng)收到了100個(gè)字節(jié)后,水平觸發(fā)因?yàn)檫€有字節(jié)沒有讀完,就會發(fā)送一個(gè)只讀通知,但是邊緣觸發(fā)會一直保持等待的通知,等待接下來的報(bào)文的到來,直到邊緣觸發(fā)返回EWOULDBLOCK就摒棄這個(gè)socket。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Linux中并發(fā)服務(wù)器的實(shí)現(xiàn)模式有哪些”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!