您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Tomcat NIO中epoll多路復(fù)用是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
從 linux 操作系統(tǒng)角度看有一個 socket 監(jiān)聽在某個端口,等待客戶端的連接請求,我們稱運行監(jiān)聽 socket 的線程為 acceptor thread 。
有多個客戶端的連接請求過來,每個請求經(jīng)過3次握手,監(jiān)聽線程 accept 請求,為每個連接請求在 server 端創(chuàng)建 socket 。
對于服務(wù)端的 socket 會嘗試讀取客戶端發(fā)送的數(shù)據(jù),如果客戶端不發(fā)送數(shù)據(jù),那么這個讀取操作會一直阻塞,一直到有數(shù)據(jù)發(fā)送過來。
從操作系統(tǒng)的角度看,當(dāng)客戶端沒有數(shù)據(jù)發(fā)送的時候,服務(wù)端這個讀取數(shù)據(jù)的線程或進(jìn)程就會進(jìn)入 TASK_INTERRUPTIBLE 狀態(tài),也就是平時常用的 top 命令中的 S 狀態(tài)。在操作系統(tǒng)的等待隊列里,等待有客戶端數(shù)據(jù)到來,然后喚醒這個讀取線程或者進(jìn)程來讀取數(shù)據(jù)。
基于以上,一般對于每個連接請求的服務(wù)端 socket 都會創(chuàng)建一個線程來讀取并操作數(shù)據(jù)。所以連接請求,服務(wù)端 socket ,服務(wù)端線程是一一對應(yīng)的關(guān)系。
對于上述模型,在并發(fā)連接比較少的情況下沒有問題。如果并發(fā)連接數(shù)量巨大,那么意味著操作系統(tǒng)要創(chuàng)建巨大數(shù)量的線程來支持并發(fā),同時也需要對這些線程進(jìn)行調(diào)度和上下文切換。這些大量多線帶來的工作量對于操作系統(tǒng)來說都是巨大的負(fù)擔(dān),所以這種 IO 模型很難支持大量的并發(fā)。
從 linux 操作系統(tǒng)角度看有一個 socket 監(jiān)聽在某個端口,等待客戶端的連接請求,我們稱運行監(jiān)聽 socket 的線程為 acceptor thread 。
有多個客戶端的連接請求過來,每個請求經(jīng)過3次握手,監(jiān)聽線程 accept 請求,為每個連接請求在 server 端創(chuàng)建 socket 。
對于服務(wù)端的 socket 來說,linux 操作系統(tǒng)會為其注冊一系列感興趣的事件(例如讀事件,當(dāng)數(shù)據(jù)就緒可讀的時候觸發(fā)。寫事件,當(dāng) buffer 有緩沖,可以寫數(shù)據(jù)的時候觸發(fā))。這樣所有的服務(wù)端 socket 可以形成一個 intreast list 。
對于 individual 的 server 端 socket 來說,如果客戶端發(fā)送了數(shù)據(jù),linux 操作系統(tǒng)會觸發(fā)注冊的讀事件,然后會把這個 socket 加入一個就緒列表中,我們稱之為 ready list。對于 ready list 之中的 socket 是一定可以讀到數(shù)據(jù)的,因為已經(jīng)觸發(fā)了讀事件,即數(shù)據(jù)就緒可讀。
一般我們會有一個用戶空間的線程或者進(jìn)程來運行 java NIO 的 API ,在這個線程里通過來輪詢 ready list ,如果 list 里有 socket 則進(jìn)行讀取數(shù)據(jù)和操作數(shù)據(jù)。如果 ready list 沒有觸發(fā)事件的 socket ,對于操作系統(tǒng)來說,該線程會進(jìn)入 TASK_INTERRUPTIBLE 狀態(tài)( top 命令中的 S 狀態(tài)),在操作系統(tǒng)的等待隊列里,等待 ready list 有數(shù)據(jù),然后喚醒這個讀取線程讀取并操作數(shù)據(jù)。
對于 epoll 下的 tomcat io 線程池來說,數(shù)據(jù)的讀取是同步的。從操作系統(tǒng)的角度來說,NIO API 發(fā)起讀數(shù)據(jù)的系統(tǒng)調(diào)用,這個線程會一直等到數(shù)據(jù)讀完返回。只是這個時候一定有數(shù)據(jù)可讀,不必等待過長的時間,所以 tomcat NIO 是同步非阻塞 IO。
關(guān)于“Tomcat NIO中epoll多路復(fù)用是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。