真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

成都創(chuàng)新互聯(lián)專注于望城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供望城營銷型網(wǎng)站建設(shè),望城網(wǎng)站制作、望城網(wǎng)頁設(shè)計(jì)、望城網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造望城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供望城網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。


對(duì)于 linux 操作系統(tǒng),IO 多路復(fù)用使用的是 epoll 方式,對(duì)于 windows 操作系統(tǒng)中 IO 多路復(fù)用使用的是 iocp 方式,對(duì)于 mac 操作系統(tǒng) IO 多路復(fù)用使用的是 kqueue 方式。由于對(duì)于 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 有一個(gè)大致的對(duì)比。在 tomcat6 和之前的版本默認(rèn)都是使用的 BIO 模型,從 linux 操作系統(tǒng)的角度看,并沒有利用 epoll 模型,BIO 模型大致如下:

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

  • 從 linux 操作系統(tǒng)角度看有一個(gè) socket 監(jiān)聽在某個(gè)端口,等待客戶端的連接請(qǐng)求,我們稱運(yùn)行監(jiān)聽 socket 的線程為 acceptor thread 。

  • 有多個(gè)客戶端的連接請(qǐng)求過來,每個(gè)請(qǐng)求經(jīng)過3次握手,監(jiān)聽線程 accept 請(qǐng)求,為每個(gè)連接請(qǐng)求在 server 端創(chuàng)建 socket 。

  • 對(duì)于服務(wù)端的 socket 會(huì)嘗試讀取客戶端發(fā)送的數(shù)據(jù),如果客戶端不發(fā)送數(shù)據(jù),那么這個(gè)讀取操作會(huì)一直阻塞,一直到有數(shù)據(jù)發(fā)送過來。

  • 從操作系統(tǒng)的角度看,當(dāng)客戶端沒有數(shù)據(jù)發(fā)送的時(shí)候,服務(wù)端這個(gè)讀取數(shù)據(jù)的線程或進(jìn)程就會(huì)進(jìn)入 TASK_INTERRUPTIBLE 狀態(tài),也就是平時(shí)常用的 top 命令中的 S 狀態(tài)。在操作系統(tǒng)的等待隊(duì)列里,等待有客戶端數(shù)據(jù)到來,然后喚醒這個(gè)讀取線程或者進(jìn)程來讀取數(shù)據(jù)。

  • 基于以上,一般對(duì)于每個(gè)連接請(qǐng)求的服務(wù)端 socket 都會(huì)創(chuàng)建一個(gè)線程來讀取并操作數(shù)據(jù)。所以連接請(qǐng)求,服務(wù)端 socket ,服務(wù)端線程是一一對(duì)應(yīng)的關(guān)系。

  • 對(duì)于上述模型,在并發(fā)連接比較少的情況下沒有問題。如果并發(fā)連接數(shù)量巨大,那么意味著操作系統(tǒng)要?jiǎng)?chuàng)建巨大數(shù)量的線程來支持并發(fā),同時(shí)也需要對(duì)這些線程進(jìn)行調(diào)度和上下文切換。這些大量多線帶來的工作量對(duì)于操作系統(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)角度看有一個(gè) socket 監(jiān)聽在某個(gè)端口,等待客戶端的連接請(qǐng)求,我們稱運(yùn)行監(jiān)聽 socket 的線程為 acceptor thread 。

  • 有多個(gè)客戶端的連接請(qǐng)求過來,每個(gè)請(qǐng)求經(jīng)過3次握手,監(jiān)聽線程 accept 請(qǐng)求,為每個(gè)連接請(qǐng)求在 server 端創(chuàng)建 socket 。

  • 對(duì)于服務(wù)端的 socket 來說,linux 操作系統(tǒng)會(huì)為其注冊(cè)一系列感興趣的事件(例如讀事件,當(dāng)數(shù)據(jù)就緒可讀的時(shí)候觸發(fā)。寫事件,當(dāng) buffer 有緩沖,可以寫數(shù)據(jù)的時(shí)候觸發(fā))。這樣所有的服務(wù)端 socket 可以形成一個(gè) intreast list 。

  • 對(duì)于 individual 的 server 端 socket 來說,如果客戶端發(fā)送了數(shù)據(jù),linux 操作系統(tǒng)會(huì)觸發(fā)注冊(cè)的讀事件,然后會(huì)把這個(gè) socket 加入一個(gè)就緒列表中,我們稱之為 ready list。對(duì)于 ready list 之中的 socket 是一定可以讀到數(shù)據(jù)的,因?yàn)橐呀?jīng)觸發(fā)了讀事件,即數(shù)據(jù)就緒可讀。

  • 一般我們會(huì)有一個(gè)用戶空間的線程或者進(jìn)程來運(yùn)行 java NIO 的 API ,在這個(gè)線程里通過來輪詢 ready list ,如果 list 里有 socket 則進(jìn)行讀取數(shù)據(jù)和操作數(shù)據(jù)。如果 ready list 沒有觸發(fā)事件的 socket ,對(duì)于操作系統(tǒng)來說,該線程會(huì)進(jìn)入 TASK_INTERRUPTIBLE 狀態(tài)( top 命令中的 S 狀態(tài)),在操作系統(tǒng)的等待隊(duì)列里,等待 ready list 有數(shù)據(jù),然后喚醒這個(gè)讀取線程讀取并操作數(shù)據(jù)。

  • 基于上述,epoll 用少量的線程就可以支持大量的連接請(qǐng)求,從而避免了傳統(tǒng) IO 的問題。

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

關(guān)于“Tomcat NIO中epoll多路復(fù)用是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


當(dāng)前題目:TomcatNIO中epoll多路復(fù)用是什么意思
鏈接分享:http://weahome.cn/article/jjeiep.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部