1. 程式人生 > >同步IO,非同步IO,阻塞IO,非阻塞IO

同步IO,非同步IO,阻塞IO,非阻塞IO

  • 這裡在呼叫recv前先呼叫select或者poll,這2個系統呼叫都可以在核心準備好資料(網路資料到達核心)時告知使用者程序,這個時候再呼叫recv一定是有資料的。因此這一過程中它是阻塞於select或poll,而沒有阻塞於recv,有人將非阻塞IO定義成在讀寫操作時沒有阻塞於系統呼叫的IO操作(不包括資料從核心複製到使用者空間時的阻塞,因為這相對於網路IO來說確實很短暫),如果按這樣理解,這種IO模型也能稱之為非阻塞IO模型,但是按POSIX來看,它也是同步IO,那麼也和樓上一樣稱之為同步非阻塞IO吧。

    這種IO模型比較特別,分個段。因為它能同時監聽多個檔案描述符(fd)。這個時候C同學來裝水,發現有一排水龍頭,舍管阿姨告訴他這些水龍頭都還沒有水,等有水了告訴他。於是等啊等(select呼叫中),過了一會阿姨告訴他有水了,但不知道是哪個水龍頭有水,自己看吧。於是C同學一個個開啟,往杯子裡裝水(recv)。這裡再順便說說鼎鼎大名的epoll(高效能的代名詞啊),epoll也屬於IO複用模型,主要區別在於舍管阿姨會告訴C同學哪幾個水龍頭有水了,不需要一個個開啟看(當然還有其它區別)。

    image