91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Tomcat NIO中epoll多路復用是什么意思

發布時間:2021-11-18 09:56:13 來源:億速云 閱讀:315 作者:小新 欄目:大數據

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


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

Tomcat NIO中epoll多路復用是什么意思

  • 從 linux 操作系統角度看有一個 socket 監聽在某個端口,等待客戶端的連接請求,我們稱運行監聽 socket 的線程為 acceptor thread 。

  • 有多個客戶端的連接請求過來,每個請求經過3次握手,監聽線程 accept 請求,為每個連接請求在 server 端創建 socket 。

  • 對于服務端的 socket 會嘗試讀取客戶端發送的數據,如果客戶端不發送數據,那么這個讀取操作會一直阻塞,一直到有數據發送過來。

  • 從操作系統的角度看,當客戶端沒有數據發送的時候,服務端這個讀取數據的線程或進程就會進入 TASK_INTERRUPTIBLE 狀態,也就是平時常用的 top 命令中的 S 狀態。在操作系統的等待隊列里,等待有客戶端數據到來,然后喚醒這個讀取線程或者進程來讀取數據。

  • 基于以上,一般對于每個連接請求的服務端 socket 都會創建一個線程來讀取并操作數據。所以連接請求,服務端 socket ,服務端線程是一一對應的關系。

  • 對于上述模型,在并發連接比較少的情況下沒有問題。如果并發連接數量巨大,那么意味著操作系統要創建巨大數量的線程來支持并發,同時也需要對這些線程進行調度和上下文切換。這些大量多線帶來的工作量對于操作系統來說都是巨大的負擔,所以這種 IO 模型很難支持大量的并發。

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

Tomcat NIO中epoll多路復用是什么意思

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


綜合上述的傳統 IO 和 epoll 模式下的 IO ,我們總結如下:  
  • 傳統 IO 對于每個連接都需要操作系統分配一個單獨的線程(或者進程),在高并發下的大量線程(或者進程)會給操作系統帶來巨大負擔,所以傳統 IO 對高并發支持不友好。
  • epoll 模型下的 IO 會對 socket 注冊感興趣的事件(讀寫事件等),當事件發生的時候把就緒的 socket 放到 ready list 里,這個列表里的 socket 一定可以讀寫數據。對于檢查事件是否發生,把 socket 放入就緒列表里等任務都是由操作系統內核完成的,不由用戶空間的應用程序做,最大限度的利用了操作系統。
  • 用戶空間的線程利用包裝好的 java NIO API 發起對 ready list 輪詢的系統調用,這樣少量的用戶空間線程就可以完成對大量連接請求的支持,所以 epoll 模式下的 IO 對高并發的支持是友好的。
  • 對于戶空間線程我們一般稱之為事件輪詢線程,tomcat NIO 中一般叫 poller thread 。當 poller thread 發現有可用 socket 的時候一般不會自己處理讀取操作數據,而是把 socket 給預先定義好的線程池中的線程來讀取數據,操作數據。
  • 對于 tomcat 來說,上面的線程池就是 io 線程池,也就是我們平時配置的 tomcat 線程池,這里面的線程讀取數據,運行 servlet 。
  • 對于 epoll 下的 tomcat io 線程池來說,數據的讀取是同步的。從操作系統的角度來說,NIO API 發起讀數據的系統調用,這個線程會一直等到數據讀完返回。只是這個時候一定有數據可讀,不必等待過長的時間,所以 tomcat NIO 是同步非阻塞 IO。

關于“Tomcat NIO中epoll多路復用是什么意思”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太白县| 永德县| 塔城市| 资源县| 青神县| 平阳县| 新河县| 广元市| 乾安县| 梅州市| 静海县| 栾川县| 米泉市| 佳木斯市| 岑巩县| 屏边| 屯留县| 宁安市| 滕州市| 桂东县| 沈丘县| 资兴市| 中牟县| 桐柏县| 徐汇区| 连云港市| 麻栗坡县| 沙雅县| 临沧市| 芦溪县| 邹城市| 浏阳市| 鸡泽县| 江孜县| 兴城市| 兰坪| 龙门县| 石柱| 杭州市| 衡阳县| 色达县|