前幾天拜讀了 Dan Kegel 的一篇專文- The C10K problem, 講述伺服器要如何有效地處理網路上的事件通知, 這篇文章的內容對於各式處理 Network I/O 的手法和現有函式庫都講述的蠻詳盡的, 非常有價值. 文內就有解釋這兩個詞用於軟體處理事件行為的意義.
- Level-triggered 意指事件監看端 (作業系統/Kernel) 在每一次察覺到有新事件時, 都會通知事件接收端 (軟體程式).
- Edge-triggered 則指事件監看端 (作業系統/Kernel) 在察覺到有新事件時, 會依照事件接收端 (軟體程式) 的處理狀態 (state) 來決定是否需要通知. 大致流程為:
- 接收端處理狀態初始為 low
- 事件發生
- 監看端得知接收端狀態為 low, 遂通知接收端並且設定處理狀態為 high
- 該狀態會一直保持為 high 直到接收端將所有事件都處理完才會重置回 low, 而期間就算有新事件發生, 監看端也不會發出通知
舉一個生動一點的例子: 國王屬咐太監,如果有大臣來覲見就把它領來書房。這個例子中,國王即為事件接收端、太監則為事件監看端,而大臣的來訪即為事件。如果這個太監是按 Level-triggered 來行事,那麼每來一位大臣他就要領去書房一次。反之若太監以 Edge-triggered 來行事,當領了一位大臣去書房後,他就知道國王是「已經知道有大臣來訪」的狀態 (處理狀態為 high),後續再有大臣來,就會直接放行請大臣自己進去、不再通知國王。直到國王再主動跟太監說「我都謁見完了」(處理狀態重置為 low),之後太監再看到有大臣來訪才會再行通知。
如果要使用 Linux 平台上的 epoll()、或 BSD/MacOS 平台上的 kqueue() 來實作 Async I/O 時,這兩個詞的意義務必要先搞懂的。
沒有留言:
張貼留言