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