LT(Level Trigger,水平觸發(fā))模式和ET(Edge Trigger,邊沿觸發(fā))模式是兩種文件描述符準(zhǔn)備就緒的通知模式。
epoll默認(rèn)是水平觸發(fā)
兩者的區(qū)別在哪里呢?
水平觸發(fā):讀緩沖區(qū)非空就會一直觸發(fā),寫緩沖區(qū)只要不滿就會一直觸發(fā)寫事件。
邊緣觸發(fā):讀緩沖區(qū)空轉(zhuǎn)非空(有新消息)的時候觸發(fā)一次,寫緩沖區(qū)從滿到非滿的時候(空出來可以寫了)觸發(fā)一次。
水平觸發(fā)優(yōu)、缺點及應(yīng)用場景:
優(yōu)點:當(dāng)進(jìn)行socket通信的時候,保證了數(shù)據(jù)的完整輸出,進(jìn)行IO操作的時候,如果還有數(shù)據(jù),就會一直的通知你。
缺點:由于只要還有數(shù)據(jù),內(nèi)核就會不停的從內(nèi)核空間轉(zhuǎn)到用戶空間,所有占用了大量內(nèi)核資源,試想一下當(dāng)有大量數(shù)據(jù)到來的時候,每次讀取一個字節(jié),這樣就會不停的進(jìn)行切換。內(nèi)核資源的浪費嚴(yán)重。效率來講也是很低的。
- LT要避免寫的死循環(huán)問題,寫緩沖區(qū)滿的概率很低,只要緩沖區(qū)沒滿(空閑)就會不斷發(fā)信號,所以寫完數(shù)據(jù)后一定要記得取消寫事件。
邊沿觸發(fā)優(yōu)、缺點及應(yīng)用場景:
優(yōu)點:每次內(nèi)核只會通知一次,大大減少了內(nèi)核資源的浪費,提高效率。
缺點:不能保證數(shù)據(jù)的完整。不能及時的取出所有的數(shù)據(jù)。
應(yīng)用場景:處理大數(shù)據(jù)。使用non-block模式的socket。
- ET要避免"short read"的問題,比如用戶收到100個字節(jié),觸發(fā)了一次邊沿警告,讀了50個字節(jié),剩下50個字節(jié)沒讀。但是沒有警告。
在實踐中大家還是更傾向于LT,因為ET容易漏數(shù)據(jù)不安全。