這篇文章將為大家詳細(xì)講解有關(guān)Tomcat NIO中epoll多路復(fù)用是什么意思,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)專注于望城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供望城營銷型網(wǎng)站建設(shè),望城網(wǎng)站制作、望城網(wǎng)頁設(shè)計(jì)、望城網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造望城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供望城網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
從 linux 操作系統(tǒng)角度看有一個(gè) socket 監(jiān)聽在某個(gè)端口,等待客戶端的連接請(qǐng)求,我們稱運(yùn)行監(jiān)聽 socket 的線程為 acceptor thread 。
有多個(gè)客戶端的連接請(qǐng)求過來,每個(gè)請(qǐng)求經(jīng)過3次握手,監(jiān)聽線程 accept 請(qǐng)求,為每個(gè)連接請(qǐng)求在 server 端創(chuàng)建 socket 。
對(duì)于服務(wù)端的 socket 會(huì)嘗試讀取客戶端發(fā)送的數(shù)據(jù),如果客戶端不發(fā)送數(shù)據(jù),那么這個(gè)讀取操作會(huì)一直阻塞,一直到有數(shù)據(jù)發(fā)送過來。
從操作系統(tǒng)的角度看,當(dāng)客戶端沒有數(shù)據(jù)發(fā)送的時(shí)候,服務(wù)端這個(gè)讀取數(shù)據(jù)的線程或進(jìn)程就會(huì)進(jìn)入 TASK_INTERRUPTIBLE 狀態(tài),也就是平時(shí)常用的 top 命令中的 S 狀態(tài)。在操作系統(tǒng)的等待隊(duì)列里,等待有客戶端數(shù)據(jù)到來,然后喚醒這個(gè)讀取線程或者進(jìn)程來讀取數(shù)據(jù)。
基于以上,一般對(duì)于每個(gè)連接請(qǐng)求的服務(wù)端 socket 都會(huì)創(chuàng)建一個(gè)線程來讀取并操作數(shù)據(jù)。所以連接請(qǐng)求,服務(wù)端 socket ,服務(wù)端線程是一一對(duì)應(yīng)的關(guān)系。
對(duì)于上述模型,在并發(fā)連接比較少的情況下沒有問題。如果并發(fā)連接數(shù)量巨大,那么意味著操作系統(tǒng)要?jiǎng)?chuàng)建巨大數(shù)量的線程來支持并發(fā),同時(shí)也需要對(duì)這些線程進(jìn)行調(diào)度和上下文切換。這些大量多線帶來的工作量對(duì)于操作系統(tǒng)來說都是巨大的負(fù)擔(dān),所以這種 IO 模型很難支持大量的并發(fā)。
從 linux 操作系統(tǒng)角度看有一個(gè) socket 監(jiān)聽在某個(gè)端口,等待客戶端的連接請(qǐng)求,我們稱運(yùn)行監(jiān)聽 socket 的線程為 acceptor thread 。
有多個(gè)客戶端的連接請(qǐng)求過來,每個(gè)請(qǐng)求經(jīng)過3次握手,監(jiān)聽線程 accept 請(qǐng)求,為每個(gè)連接請(qǐng)求在 server 端創(chuàng)建 socket 。
對(duì)于服務(wù)端的 socket 來說,linux 操作系統(tǒng)會(huì)為其注冊(cè)一系列感興趣的事件(例如讀事件,當(dāng)數(shù)據(jù)就緒可讀的時(shí)候觸發(fā)。寫事件,當(dāng) buffer 有緩沖,可以寫數(shù)據(jù)的時(shí)候觸發(fā))。這樣所有的服務(wù)端 socket 可以形成一個(gè) intreast list 。
對(duì)于 individual 的 server 端 socket 來說,如果客戶端發(fā)送了數(shù)據(jù),linux 操作系統(tǒng)會(huì)觸發(fā)注冊(cè)的讀事件,然后會(huì)把這個(gè) socket 加入一個(gè)就緒列表中,我們稱之為 ready list。對(duì)于 ready list 之中的 socket 是一定可以讀到數(shù)據(jù)的,因?yàn)橐呀?jīng)觸發(fā)了讀事件,即數(shù)據(jù)就緒可讀。
一般我們會(huì)有一個(gè)用戶空間的線程或者進(jìn)程來運(yùn)行 java NIO 的 API ,在這個(gè)線程里通過來輪詢 ready list ,如果 list 里有 socket 則進(jìn)行讀取數(shù)據(jù)和操作數(shù)據(jù)。如果 ready list 沒有觸發(fā)事件的 socket ,對(duì)于操作系統(tǒng)來說,該線程會(huì)進(jìn)入 TASK_INTERRUPTIBLE 狀態(tài)( top 命令中的 S 狀態(tài)),在操作系統(tǒng)的等待隊(duì)列里,等待 ready list 有數(shù)據(jù),然后喚醒這個(gè)讀取線程讀取并操作數(shù)據(jù)。
對(duì)于 epoll 下的 tomcat io 線程池來說,數(shù)據(jù)的讀取是同步的。從操作系統(tǒng)的角度來說,NIO API 發(fā)起讀數(shù)據(jù)的系統(tǒng)調(diào)用,這個(gè)線程會(huì)一直等到數(shù)據(jù)讀完返回。只是這個(gè)時(shí)候一定有數(shù)據(jù)可讀,不必等待過長的時(shí)間,所以 tomcat NIO 是同步非阻塞 IO。
關(guān)于“Tomcat NIO中epoll多路復(fù)用是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。