一文搞懂BIO、NIO、I/O多路複用與異步AIO

一文搞懂BIO、NIO、I/O多路複用與異步AIO

1. IO操做本質

1. 內存分爲內核緩衝區和用戶緩衝區python

2. 用戶的應用程序不能直接操做內核緩衝區,須要將數據從內核拷貝到用戶才能使用nginx

3. 而IO操做、網絡請求加載到內存的數據一開始是放在內核緩衝區的windows

4. 數據的複製過程是不消耗CPU的bash

2. BIO 阻塞模式I/O

舉個例子:
一我的去 商店買一把菜刀,
他到商店問老闆有沒有菜刀(發起系統調用)
若是有(表示在內核緩衝區有須要的數據)
老闆直接把菜刀給買家(從內核緩衝區拷貝到用戶緩衝區)
這個過程買家一直在等待

若是沒有,商店老闆會向工廠下訂單(IO操做,等待數據準備好)
工廠把菜刀運給老闆(進入到內核緩衝區)
老闆把菜刀給買家(從內核緩衝區拷貝到用戶緩衝區)
這個過程買家一直在等待
是同步io

 

 3. NIO 非阻塞模式I/O

用戶進程發起請求,若是數據沒有準備好,那麼馬上告知用戶進程未準備好;此時用戶進程可選擇繼續發起請求、或者先去作其餘事情,稍後再回來繼續發請求,直到被告知數據準備完畢,能夠開始接收爲止; 數據會由用戶進程完成拷貝網絡

舉個例子:
一我的去 商店買一把菜刀,
他到商店問老闆有沒有菜刀(發起系統調用)
老闆說沒有,在向工廠進貨(返回狀態)
買家去別地方玩了會,又回來問,菜刀到了麼(發起系統調用)
老闆說尚未(返回狀態)
買家又去玩了會(不斷輪詢)
最後一次再問,菜刀有了(數據準備好了)
老闆把菜刀遞給買家(從內核緩衝區拷貝到用戶緩衝區)

整個過程輪詢+等待:輪詢時沒有等待,能夠作其餘事,從內核緩衝區拷貝到用戶緩衝區須要等待
是同步io

4. I/O多路複用模型

相似BIO,只不過找了一個代理,來掛起等待,並能同時監聽多個請求; 數據會由用戶進程完成拷貝異步

舉個例子:多我的去 一個商店買菜刀,
多我的給老闆打電話,說我要買菜刀(發起系統調用)
老闆把每一個人都記錄下來(放到select中)
老闆去工廠進貨(IO操做)
有貨了,再挨個通知買到的人,來取刀(通知/返回可讀條件)
買家來到商店等待,老闆把到給買家(從內核緩衝區拷貝到用戶緩衝區)

多路複用:老闆能夠同時接受不少請求(select模型最大1024個,epoll模型),
可是老闆把到給買家這個過程,還須要等待,
是同步io

select本質也是輪詢最多能夠監聽1024個,而epoll模型是事件驅動,好了會主動告訴你socket

-select:小明,你寫好了麼?小紅你寫好了麼?.......
-epoll:同窗寫好了,舉手告訴老師來檢查(nginx、tornado用的是epoll)windows平臺不支持epoll,用的是select函數

5. 異步IO-AIO

發起請求馬上獲得回覆,不用掛起等待; 數據會由內核進程主動完成拷貝,目前不成熟tornado

舉個例子:仍是買菜刀
如今是網上下單到商店(系統調用)
商店確認(返回)
商店去進貨(io操做)
商店收到貨把貨發個賣家(從內核緩衝區拷貝到用戶緩衝區)
買家收到貨(指定信號)

整個過程無等待
異步io

 

 

  • 同步I/O與異步I/O判斷依據是,是否會致使用戶進程阻塞
  • BIO中socket直接阻塞等待(用戶進程主動等待,並在拷貝時也等待)
  • NIO中將數據從內核空間拷貝到用戶空間時阻塞(用戶進程主動詢問,並在拷貝時等待)
  • IO Multiplexing中select等函數爲阻塞、拷貝數據時也阻塞(用戶進程主動等待,並在拷貝時也等待)
  • AIO中從始至終用戶進程都沒有阻塞(用戶進程是被動的)
相關文章
相關標籤/搜索