I/O操作中的常用術語
上節我們介紹了常用的I/O模型。在I/O操作中的我們經常會遇到常用術語:
·阻塞和非阻塞。
·同步與非同步。
那麼這些術語有怎樣的聯絡和區別呢?
阻塞和非阻塞
阻塞和非阻塞描述的是使用者執行緒呼叫核心I/O操作的方式。
·阻塞是指I/O操作需要徹底完成後才返回使用者空間。
·非阻塞是指I/O操作被呼叫後立即返回給使用者一個狀態值,無須等到I/O操作徹底完成。
以生活中家庭主婦為例。家庭主婦往往要做非常多的家務,比如煮開水、拖地等。阻塞是指,家庭主婦先去煮開水,她必須等到水開了才能離開去做其他家務;非阻塞是指,家庭主婦先去把水煮上,不用等水開就離開去拖地了,當然,在拖地過程中,她會時不時停下來去檢查水是否已經開了。
非阻塞的優點是家庭主婦的能力得到了釋放,可以多工(煮開水、拖地)“併發”了。
同步與非同步
同步和非同步描述的是使用者執行緒與核心的互動方式。
·同步是指使用者執行緒發起I/O請求後需要等待或者輪詢核心I/O操作完成後才能繼續執行。·非同步是指使用者執行緒發起I/O請求後仍繼續執行,當核心I/O操作完成後會通知使用者執行緒,或者呼叫使用者執行緒註冊的回撥函式。
還是以生活中家庭主婦為例。在阻塞和非阻塞的例子中,家庭主婦需要時不時停下拖地這個動作,而去檢查水是否已經開了(輪詢),這其實一定程度上是一種浪費,因為拖地這個任務被經常打斷。那麼是否有一種機制,當開水煮好後再通知主婦過去關火呢?這就是非同步的優點,非同步相當於水壺上的報警器,當水煮好後,水壺會發出提示聲,以告知家庭主婦水已經煮好了,此時家庭主婦才停下拖地去關火。
非同步的優點是減少了輪詢。
總結
一個I/O操作其實分成了兩個步驟:發起I/O請求和實際的I/O操作。
阻塞I/O和非阻塞I/O的區別在於第一步,即發起I/O請求是否會被阻塞,如果阻塞直到I/O操作完成,那麼就是傳統的阻塞I/O;如果不阻塞,那麼就是非阻塞I/O。
同步I/O和非同步I/O的區別就在於第二個步驟是否阻塞,如果實際的I/O讀寫阻塞請求程序,那麼就是同步I/O。