水平觸發(level triggered,也稱條件觸發):
select()和poll()將就緒的檔案描述符告訴程序後,如果程序沒有對其進行io操作,那麼下次呼叫select()和poll()的時候將再次報告這些檔案描述符,所以它們一般不會丟失就緒的訊息。
邊緣觸發(edge triggered):只告訴程序哪些檔案描述符剛剛變為就緒狀態,它只說一遍,如果我們沒有採取行動,那麼它將不會再次告知,這種方式稱為邊緣觸發。
兩者都會帶來一系列問題:例如當100位元組到達後,應用程式只讀取了一部分,然後重新等待,此時水平觸發的api會始終提醒應用程式;而邊緣觸發的則不會發出任何提醒。因此後者應執行到recv返回ewouldblock為止。而對於水平觸發而言,如果關注了socket可寫事件,當寫緩衝始終可用的時候,就會一直得到可寫提醒,造成cpu負載過高。
水平觸發與邊緣觸發
今天開始封裝c的socket的基礎,在封裝的時候意識到這樣乙個問題,如果我現在fd的接收緩衝區中有2048位元組的資料,但是我唯讀出來1024個位元組的資料,當我下次select的時候 這之間沒有網路資料過來 還會檢測到該select可讀嗎?這樣就引申出來水linux的io多路復用中的水平觸發模式和...
水平觸發與邊緣觸發
1.水平觸發level trigger lt 狀態達到 當被監控的檔案描述符上有可讀寫事件發生時,會通知使用者程式去讀寫,如果使用者一次讀寫沒取完資料,他會一直通知使用者,如果這個描述符是使用者不關心的,它每次都返回通知使用者,則會導致使用者對於關心的描述符的處理效率降低。復用型io中的select...
linux C epoll 水平觸發與邊緣觸發詳解
poll有兩種觸發方式 水平觸發與邊緣觸發的區別 水平觸發 只要緩衝區有資料就會一直觸發 邊沿觸發 只有在緩衝區增加資料的那一刻才會觸發 使用邊沿觸發 include include include include include int main int argc,char ar return 0...