溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Tomcat NIO中epoll多路復(fù)用是什么意思

發(fā)布時間:2021-11-18 09:56:13 來源:億速云 閱讀:314 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)Tomcat NIO中epoll多路復(fù)用是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。


對于 linux 操作系統(tǒng),IO 多路復(fù)用使用的是 epoll 方式,對于 windows 操作系統(tǒng)中 IO 多路復(fù)用使用的是 iocp 方式,對于 mac 操作系統(tǒng) IO 多路復(fù)用使用的是 kqueue 方式。由于對于 tomcat 服務(wù)器來說基本主要部署在 linux 操作系統(tǒng)上,所以我們主要介紹 linux 的 epoll 模型。epoll 是 event poll 的簡稱,在 linux 內(nèi)核版本 2.6 開始支持,所以如果你的 tomcat 服務(wù)器如果希望默認(rèn)使用 NIO,除了自己版本在 tomcat7 以上之外,還需要部署在 linux 內(nèi)核版本大于 2.6 的操作系統(tǒng)之上。
在介紹 epoll 多路復(fù)用之前,我們先簡單描述一下傳統(tǒng) IO,也就是 BIO(block IO),從而和 epoll IO 有一個大致的對比。在 tomcat6 和之前的版本默認(rèn)都是使用的 BIO 模型,從 linux 操作系統(tǒng)的角度看,并沒有利用 epoll 模型,BIO 模型大致如下:

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ā)。

為了解決傳統(tǒng) IO 模型帶來的問題,linux 內(nèi)核(2.6版本及以上)提供了 epoll 模型,epoll 是event poll ,這種 IO 模型是基于事件的非阻塞 IO 。從 linux 操作系統(tǒng)的角度看,epoll 模型大致如下:

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 來說,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 用少量的線程就可以支持大量的連接請求,從而避免了傳統(tǒng) IO 的問題。


綜合上述的傳統(tǒng) IO 和 epoll 模式下的 IO ,我們總結(jié)如下:  
  • 傳統(tǒng) IO 對于每個連接都需要操作系統(tǒng)分配一個單獨的線程(或者進(jìn)程),在高并發(fā)下的大量線程(或者進(jìn)程)會給操作系統(tǒng)帶來巨大負(fù)擔(dān),所以傳統(tǒng) IO 對高并發(fā)支持不友好。
  • epoll 模型下的 IO 會對 socket 注冊感興趣的事件(讀寫事件等),當(dāng)事件發(fā)生的時候把就緒的 socket 放到 ready list 里,這個列表里的 socket 一定可以讀寫數(shù)據(jù)。對于檢查事件是否發(fā)生,把 socket 放入就緒列表里等任務(wù)都是由操作系統(tǒng)內(nèi)核完成的,不由用戶空間的應(yīng)用程序做,最大限度的利用了操作系統(tǒng)。
  • 用戶空間的線程利用包裝好的 java NIO API 發(fā)起對 ready list 輪詢的系統(tǒng)調(diào)用,這樣少量的用戶空間線程就可以完成對大量連接請求的支持,所以 epoll 模式下的 IO 對高并發(fā)的支持是友好的。
  • 對于戶空間線程我們一般稱之為事件輪詢線程,tomcat NIO 中一般叫 poller thread 。當(dāng) poller thread 發(fā)現(xiàn)有可用 socket 的時候一般不會自己處理讀取操作數(shù)據(jù),而是把 socket 給預(yù)先定義好的線程池中的線程來讀取數(shù)據(jù),操作數(shù)據(jù)。
  • 對于 tomcat 來說,上面的線程池就是 io 線程池,也就是我們平時配置的 tomcat 線程池,這里面的線程讀取數(shù)據(jù),運行 servlet 。
  • 對于 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é)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(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)容。

AI