1. 程式人生 > >java之NIO select基本設計思路梳理

java之NIO select基本設計思路梳理

  1. 目的:主要是為了喚醒阻塞在selector.select上的執行緒,讓該執行緒及時去處理其他事情,例如註冊channel,改變interestOps、判斷超時等等。這些都是控制訊號signal。
  2. signal的缺陷:OS的訊號signal的deliver類似非同步交付存在的問題:即直接丟給目的地,而不管目的地是否有人來取,進一步,這裡的訊號是一次性的而非持續快取的物體,即相當於敲一下門而不是把包裹實體放到門口一直存在。所以,如果敲門的時候沒有人,那麼這個敲門的資訊就被永遠miss了。(鎖機制中park和unpark對傳統wait notify的改進類似,參考《java多執行緒程式設計-ReentrantLock筆記》
    )於是,如果signal要給select()發訊息,而signal在select()執行前就被捕獲了,那麼select()會丟失這個訊號。
  3. pipe替代signal:pipe可以喚醒接收端執行緒,可以實現wakeup。同時,由於pipe的內容不是一次性的會一直快取不丟失,避免了signal的問題。
  4. windows使用loopback connection的socketChannel模擬pipe:在windows中,由於OS沒有實現pipe(?),所以需要用一些機制實現,目前採用建立socket連線,一個serverfd,一個clientfd。serverfd註冊到selector中,控制訊號通過傳送到clientfd實現喚醒select()。