BIO NIO AIO

首先我們來分清楚同步異步,阻塞非阻塞


同步異步 指的是在客戶端

同步意味着 客戶端提出了一個請求以後,在迴應之前只能等待

異步意味着 客戶端提出一個請求以後,還可以繼續提其他請求

阻塞非阻塞 指的是服務器端

阻塞意味着 服務器接受一個請求後,在返回結果以前不能接受其他請求

非阻塞意味着 服務器接受一個請求後,儘管沒有返回結果,還是可以繼續接受其他請求



BIO:     同步並阻塞,服務器實現模式爲一個連接一個線程

NIO :同步非阻塞,服務器實現模式爲一個請求一個線程

AIO: 異步非阻塞,服務器實現模式爲一個有效請求一個線程

   同步IO和異步IO

         同步IO:線程啓動一個IO操作然後就立即進入等待狀態,直到IO操作完成後才醒來繼續執行
         異步IO:線程發送一個IO請求到內核(cpu),然後繼續處理其他的事情,內核完成IO請求後,將會通知線程IO操作完成了。

   阻塞IO和非阻塞IO

        阻塞IO:  資源不可用時,IO請求一直阻塞,直到反饋結果(有數據或超時)。
        非阻塞IO:資源不可用時,IO請求離開返回,返回數據標識資源不可用
    

     同步和異步最關鍵的區別:

            同步必須等待或者主動的去詢問IO是否完成,而異步是cpu完成後會主動通知應用程序

    (BIO)  同步阻塞IO:在此種方式下,用戶進程在發起一個IO操作以後,必須等待IO操作的完成,只有當真正完成了IO操作以後,用戶進程才能運行。JAVA傳統的IO模型屬於此種方式!

    (NIO) 同步非阻塞IO:在此種方式下,用戶進程發起一個IO操作以後邊可返回做其它事情, 但是用戶進程需要時不時的詢問IO操作是否就緒,這就要求用戶進程不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬於同步非阻塞IO。
     異步阻塞IO:此種方式下是指應用發起一個IO操作以後,不等待內核IO操作的完成,IO操作以後會通知應用程序,這其實就是同步和異步最關鍵的區別, 同步必須等待或者主動的去詢問IO是否完成,那麼爲什麼說是阻塞的呢?因爲此時是通過select系統調用來完成的,而select函數本身的實現方式是阻塞的,而採用select函數有個好處就是它可以同時監聽多個文件句柄,從而提高系統的併發性!

   (AIO)  異步非阻塞IO:在此種模式下,用戶進程只需要發起一個IO操作然後立即返回,等IO操作真正的完成以後,應用程序會得到IO操作完成的通知,此時用戶進程只需要對數據進行處理就好了,不需要進行實際的IO讀寫操作,因爲真正的IO讀取或者寫入操作已經由內核完成了。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章