邊緣觸發(Edge Trigger)和條件觸發(Level Trigger)
邊緣觸發是指每當狀態變化時發生一個io事件,條件觸發是只要滿足條件就發生一個io事件。舉個讀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%的毛病。
摘自某文檔。
Level Trigger:
1) The input signal is sampled when the clock signal is either HIGH or LOW.
2) It is sensitive to Glitches.
Example: Latch.
Edge Trigger:
1) The input signal is sampled at the RISING EDGE or FALLING EDGE of the clock signal.
2) It is not-sensitive to Glitches.
Example: Flipflop.