什麼是邊緣觸發和水平觸發

水平觸發(level-triggered,也被稱爲條件觸發)LT: 只要滿足條件,就觸發一個事件(只要有數據沒有被獲取,內核就不斷通知你)
邊緣觸發(edge-triggered)ET: 每當狀態變化時,觸發一個事件
“舉個讀socket的例子,假定經過長時間的沉默後,現在來了100個字節,這時無論邊緣觸發和條件觸發都會產生一個read ready notification通知應用程序可讀。應用程序讀了50個字節,然後重新調用api等待io事件。這時條件觸發的api會因爲還有50個字節可讀從 而立即返回用戶一個read ready notification。而邊緣觸發的api會因爲可讀這個狀態沒有發生變化而陷入長期等待。 因此在使用邊緣觸發的api時,要注意每次都要讀到socket返回EWOULDBLOCK爲止,否則這個socket就算廢了。而使用條件觸發的api 時,如果應用程序不需要寫就不要關注socket可寫的事件,否則就會無限次的立即返回一個write ready notification。大家常用的select就是屬於條件觸發這一類,長期關注socket寫事件會出現CPU 100%的毛病。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章