1. 程式人生 > >AIO,BIO,NIO區別

AIO,BIO,NIO區別

連接 同時 一個 等待 而且 聊天 可能 我不 進程

AIO,BIO,NIO都進程進行IO的三種不同方式。

對於網絡模型,這三種方式具體表現如下:

BIO:最常見的阻塞同步IO,是指客戶端請求時,服務端會起一個線程,或者是在線程池調一個線程去處理讀寫,並維護連接。如果此時是長連接的話,這種方式無法達到較高並發量,因為線程本身不能起太多。

試想如下場景:做一個聊天服務器,你要對每個用戶維護一個長連接。如果你用戶量很高,有10w個同時在線,那你要起10w個線程,顯然不實際。而且這10w個用戶可能只有一部分在發送信息,那一定有很多線程是在阻塞態的,能不能讓一個線程去阻塞呢?

NIO:非阻塞同步IO,linux下的select,poll,epoll可以視為NIO的實現。非阻塞是指服務端不會等待IO事件,而是把等待交給內核或者一個專門的線程去做,利用異步回調的方式,將IO前的等待和執行IO的時間分離。

繼續上面的場景:如果這時候10w個用戶在線,如果把等待都交給一個線程或者內核去做,像select,poll都是采用輪詢的方式,即——我不知道誰要發生IO事件,那一個個問一下好了。如果用戶數量少也沒關系,但是用戶數量到10w以上級別的話,你輪詢一次也要10w次,十分浪費資源。epoll利用信號機制,當可讀或者可寫時,內核會發信號提醒,然後用戶態調用回調函數執行對應事件。

AIO:非阻塞異步IO,aio其實和epoll原理很像,但是epoll是信號提醒之後還要自己進行IO操作,而aio是先給內核制定對應內存,讓內核有空就去讀寫,然後讀寫完發送信號告訴進程,由進程處理。其實從網絡編程來說,我覺得aio和epoll差別不算太大,因為像TCP和UDP,內核都有維護一塊緩存暫時存放數據,epoll也只是將數據從內核讀出來而已。

AIO,BIO,NIO區別