伴隨着異步I/O的還有事件驅動和單線程,它們構成Node的基調
利用單線程,遠離多線程死鎖、狀態同步等問題;利用異步I/O,讓單線程遠離阻塞,以更好地使用CPU
異步 I/O實現現狀
類比:
- 點菜的人 -> 應用層
- 點菜員 -> 觀測者
- 點菜 -> 事件
- 廚師(廚房) -> 系統內核
- 一個點菜臺 -> 一I/O線程
操作系統對I/O的實現
- 阻塞I/O:點菜排隊,你站在點菜臺前點完菜後等待廚師把你的菜做好再到下一個人(肯德基)
非阻塞I/O:點菜排隊,你點完菜後拿着小票在一邊等待,下一個人來點菜(飯店)
- 使用輪播技術
- 大部分輪詢技術:你需要不時地去點菜臺詢問菜是否做好了,期間不幹別的事情
- epoll輪詢技術:你站在一旁發呆,什麼事也不幹,菜燒好了有服務員叫號通知
理想的非阻塞異步I/O :
點完菜,拿着小票在一旁刷個微博,逛個朋友圈,菜做好了服務員叫號,你去取
現實的異步I/O:
到a點菜臺點海鮮,拿個小票,到b點菜臺點甜點,拿個小票……到一旁玩手機,哪個點菜臺叫號了就去拿哪個
Node架構
Node的異步I/O
不多說,上圖,最清晰
執行每次循環叫做Tick
可以想象每次廚師出來詢問點菜員是否還有客人點菜,就和上圖判斷是否還有事件一樣
fs.open 調用圖解
這是一個例子
整個異步調用的流程
總結
每次不知道異步是啥東西,就想自己在飯店是怎麼點菜的就行了