轉(zhuǎn)載請注明原文地址:http://www.cnblogs.com/ygj0930/p/6543960.html 一:事件分離器 在IO讀寫時(shí),把 IO請求 與 讀寫操作 分離調(diào)配進(jìn)行,需要用到事件分離器。根據(jù)處理機(jī)制的不同,事件分離器又分為:同步的Reactor和異步的Proactor。 Reactor模型:
Proactor模型:
同步和異步的區(qū)別就在于 讀 操作由誰完成:同步的Reactor是指程序發(fā)出讀請求后,由分離器監(jiān)聽到可以進(jìn)行讀操作時(shí)(需要獲得讀操作條件)通知事件處理器進(jìn)行讀操作,異步的Proactor是指程序發(fā)出讀請求后,操作系統(tǒng)立刻異步地進(jìn)行讀操作了,讀完之后在通知分離器,分離器激活處理器直接取用已讀到的數(shù)據(jù)。
二:同步阻塞IO(BIO) 我們熟知的Socket編程就是BIO,一個(gè)socket連接一個(gè)處理線程(這個(gè)線程負(fù)責(zé)這個(gè)Socket連接的一系列數(shù)據(jù)傳輸操作)。阻塞的原因在于:操作系統(tǒng)允許的線程數(shù)量是有限的,多個(gè)socket申請與服務(wù)端建立連接時(shí),服務(wù)端不能提供相應(yīng)數(shù)量的處理線程,沒有分配到處理線程的連接就會(huì)阻塞等待或被拒絕。
三:同步非阻塞IO(NIO) New IO是對BIO的改進(jìn),基于Reactor模型。我們知道,一個(gè)socket連接只有在特點(diǎn)時(shí)候才會(huì)發(fā)生數(shù)據(jù)傳輸IO操作,大部分時(shí)間這個(gè)“數(shù)據(jù)通道”是空閑的,但還是占用著線程。NIO作出的改進(jìn)就是“一個(gè)請求一個(gè)線程”,在連接到服務(wù)端的眾多socket中,只有需要進(jìn)行IO操作的才能獲取服務(wù)端的處理線程進(jìn)行IO。這樣就不會(huì)因?yàn)榫€程不夠用而限制了socket的接入??蛻舳说膕ocket連接到服務(wù)端時(shí),就會(huì)在事件分離器注冊一個(gè) IO請求事件 和 IO 事件處理器。在該連接發(fā)生IO請求時(shí),IO事件處理器就會(huì)啟動(dòng)一個(gè)線程來處理這個(gè)IO請求,不斷嘗試獲取系統(tǒng)的IO的使用權(quán)限,一旦成功(即:可以進(jìn)行IO),則通知這個(gè)socket進(jìn)行IO數(shù)據(jù)傳輸。 NIO還提供了兩個(gè)新概念:Buffer和Channel
四:異步阻塞IO(AIO) NIO是同步的IO,是因?yàn)槌绦蛐枰狪O操作時(shí),必須獲得了IO權(quán)限后親自進(jìn)行IO操作才能進(jìn)行下一步操作。AIO是對NIO的改進(jìn)(所以AIO又叫NIO.2),它是基于Proactor模型的。每個(gè)socket連接在事件分離器注冊 IO完成事件 和 IO完成事件處理器。程序需要進(jìn)行IO時(shí),向分離器發(fā)出IO請求并把所用的Buffer區(qū)域告知分離器,分離器通知操作系統(tǒng)進(jìn)行IO操作,操作系統(tǒng)自己不斷嘗試獲取IO權(quán)限并進(jìn)行IO操作(數(shù)據(jù)保存在Buffer區(qū)),操作完成后通知分離器;分離器檢測到 IO完成事件,則激活 IO完成事件處理器,處理器會(huì)通知程序說“IO已完成”,程序知道后就直接從Buffer區(qū)進(jìn)行數(shù)據(jù)的讀寫。 也就是說:AIO是發(fā)出IO請求后,由操作系統(tǒng)自己去獲取IO權(quán)限并進(jìn)行IO操作;NIO則是發(fā)出IO請求后,由線程不斷嘗試獲取IO權(quán)限,獲取到后通知應(yīng)用程序自己進(jìn)行IO操作。 |
|