當前位置:編程學習大全網 - 源碼下載 - Tomcat NIO線程模型的深入分析

Tomcat NIO線程模型的深入分析

Tomcat有兩個核心組件:連接器和容器。連接器負責網絡訪問請求。Connector目前支持三種模式:BIO、NIO和APR,後續文章將重點比較NIO和APR,Tomcat5以後的版本將開始支持NIO。容器組件實現servlet的容器管理功能;服務服務將連接器和容器包裝成外部可用的服務;很多服務運行在Tomcat這個大的服務器服務上,服務器有服務的所有實例,生命周期接口可以控制所有服務的生命周期。

Tomcat的NIO實現主要在連接器組件中,這是Tomcat中的兩個核心組件之壹。它的主要任務是接收瀏覽器發送的tcp連接請求,並創建壹個請求和壹個響應對象分別與請求者交換數據。然後會生成壹個線程來處理請求,並將生成的請求和響應對象傳遞給處理請求的線程,處理請求的線程就是容器組件要做的事情。

整個連接器組件由三部分組成:Http11NioProtocol、Mapper和CoyoteAdapter。Http11NioProtocol包括NioEndpoint和HTTP 11連接處理程序。NioEndpoint是Http11NioProtocol中負責接收和處理socket的主模塊。http 11 connection handler是連接處理程序。NioEndpoint主要實現socket請求監控線程接受器、socket Nipol線程和請求處理線程池。

NioEndpoint的內部處理流程如下:

接受器接收套接字線程。雖然是基於NIO的連接器,但它仍然以傳統的serverSocket.accept()方式接收socket,獲取SocketChannel對象,然後封裝在壹個tomcat實現類org中。阿帕奇。Tomcat.util.net.NIOChannel對象。然後,NioChannel對象被封裝在PollerEvent對象中,PollerEvent對象被推入事件隊列。這是典型的生產者-消費者模式。接受者通過隊列與輪詢線程通信。接受者是事件隊列的生產者,輪詢者是事件隊列的消費者。

選擇器對象在輪詢器輪詢器線程中維護,NIO根據選擇器完成邏輯。連接器中不僅有壹個選擇器,還有壹個選擇器在socket中讀寫數據時控制超時,這個在後面的BlockSelector中介紹。您可以首先將輪詢器線程中維護的這個選擇器標記為主選擇器。輪詢器是NIO實現的主線程。首先,作為事件隊列的消費者,我們從隊列中取出PollerEvent對象,然後用OP_READ事件將該對象中的通道註冊到主選擇器中。然後,主選擇器執行select操作,遍歷可以讀取數據的套接字,從工作線程池中獲取可用的工作線程,然後將套接字傳遞給工作線程。整個過程是典型的NIO實現。

Worker Worker線程獲得Poller發送的套接字後,將套接字封裝在SocketProcessor對象中。然後從Http11NioProcessor中取出Http11NioProcessor的對象,從HTTP 11 NIO處理器中調用CoyoteAdapter的邏輯,就像BIO實現壹樣。在Worker線程中,它將從套接字讀取http請求,將其解析為HttpservletRequest對象,將其調度到相應的servlet並完成邏輯,然後通過套接字將響應發送回客戶端。在socket讀寫數據的過程中,與典型的非阻塞NIO不同,OP_READ或OP_WRITE事件不註冊到主選擇器,而是直接通過socket完成讀寫,此時socket是阻塞的,但在超時控制中,使用了NIO選擇器機制。但這個選擇器不是Poller線程維護的主選擇器,而是BlockPoller線程維護的選擇器,稱為輔助選擇器。

nioendpoint對象中維護了壹個nioselepool對象,這個nioselepool中維護了壹個BlockPoller線程,這是NIO基於輔助選擇器的邏輯。例如,當壹個servlet被執行時,它得到壹個響應並將數據寫入壹個套接字。最後的寫入過程調用NioBlockingSelector的write方法。

接受者監聽的Socket請求,經過NioEndpoint內部的NIO線程模型處理後,會轉化為運行在執行者中的SocketProcessor,在運行過程中會交給HTTP 11連接處理程序進行處理,HTTP 11連接處理程序會從並發HashMap下載

同時,我們可以看到,接受者線程將把接收到的socketChannel(壹個套接字請求)封裝成壹個並發的LinkedQueue

壹個或多個接受者線程,每個線程都有自己的選擇器。Acceptor只負責接受新的連接,壹旦連接建立,就會在其他工作線程中註冊。

多個工作線程,有時稱為IO線程,專門負責IO讀寫。實現的壹個方法是,和Netty壹樣,每個Worker線程都有自己的選擇器,可以負責多個連接的IO讀寫事件,每個連接都屬於壹個線程。另壹種方法是用壹個特殊的線程來監控IO事件,這些線程有自己的選擇器。壹旦監視到IO讀寫事件,IO操作就不會像第壹種方式那樣打包到可運行線程池中執行。這種情況下,每個連接可能同時被多個線程操作,相比第壹種方式提高了並發性,但也可能導致多線程的問題,所以我們在處理時要更加小心。Tomcat的NIO模型是第二個。

所以壹般的參數是接受者線程的數量和工作者線程的數量。

參考官方文件https://tomcat.apache.org/tomcat-8.5-doc/config/http.html?. SPM = 5176.100239 . blogcont 39093.5 . vomyf 0

這些參數主要包括以下內容:

1)接受計數

在被服務器套接字通道接受之前,連接被臨時存儲在該隊列中,acceptCount是該隊列的最大長度。ServerSocketChannel accept是連續地從這個隊列中取出連接的請求。因此,當ServerSocketChannel accept沒有及時取出時,可能會造成隊列的積壓,壹旦連接滿了,就會被拒絕;

2)acceptorThreadCount

接受者線程只負責從上面的隊列中取出已經建立連接的請求。啟動時,ServerSocketChannel用於偵聽連接端口(如8080),多個接受者線程可以調用ServerSocketChannel的accept方法來獲取新的連接。參數acceptorThreadCount實際使用的受體線程數;

從tomcat的整體架構入手,介紹了tomcat中NIO的相關類,以及tomcat中壹個網絡請求的處理流程。最後介紹了tomcat中幾個關鍵參數對NIO線程模式的作用和影響,相信對想要了解Tomcat的NIO線程模式的同學有所幫助。

  • 上一篇:怎麽接入人工客服聯系,不是機器人那種
  • 下一篇:恒大地產股票代碼是多少?
  • copyright 2024編程學習大全網