在系列文的第二篇我就提到過, 一個非同步運行框架, 應該要含有兩種架構, 一個是能夠 multi-thread 操作資料的介面, 一個是能夠進行 thread schedule 的 scheduler。
其中, 以 .Net 為例, 整個 Task 以及 Threadpool , 就是一個是能夠 multi-thread 操作資料的介面, scheduler 的部分則是外包給了外部檔案完成, 我們沒讀到。也因此, 我們迴避掉了不少困難的部分, 但在讀 node 的過程, 這兩個都是不可迴避的, 難度也因此相應提高, 所以我會在開始讀之前把在讀的過程中可能遇到的概念聊一下。
以下都是聊聊他們在 linux 中的樣子, node 會以他們為基礎, 去實踐自己的框架。
https://zh.wikipedia.org/wiki/Epoll
簡單來說,
epoll 是一種非同步監聽 IO 的方法, 其介面延續了 unix 核心 everything is a file 的精神, 利用對文件的讀寫來操作, 底層實踐則是透過給註冊的事件追加 callback function , 該 callback function 的功能是把發生的事件放入一個虛擬文件, 而 epoll 的等待是去讀該虛擬文件, 讀到事件就得知該事件發生。
以下簡述流程 :
若是拿出我在第二天寫的 httpServer 所使用的非同步方法, 可以發現高下立判, 如果使用這種演算法只要用以下方法設計, 效能遠超我在第二天撰寫的版本
如此一來我不需要建立那麼多 thread 在那邊空等, 只要利用一條 epoll 的 thread 就可以快速的處理所有連線並且資料都會自動的寫入虛擬文件。接著就是無腦的處理虛擬文件即可。
因為 epoll 版 httpServer 很多人寫了, 就跳過不實作了, 改成用 windows 的 IOCP 撰寫 httpServer, 感覺會比較有趣。
所以明天來聊一下 IOCP 這個非同步監聽 IO 的方法吧
明天見 !