Linux網絡IO模型簡介
Linux的內核將所有外設看作一個文件來操作,對於一個文件的讀寫操作,會調用內核提供的系統命令,返回一個fd (file description 文件描述符),而對於一個socket的讀寫也會有相應的描述符,稱爲socketfd(socket 描述符),描述符就是一個數字,它指向內核中的一個結構體(文件路徑,數據區等一些屬性)。
一、阻塞IO模型
java進程讀取數據,調用recvfrom,其系統調用直到數據包到達(磁盤到內核緩衝區),且被複制(從內核緩衝區到進程緩衝區)或者發生錯誤,才返回,在此期間進程一致阻塞,因此稱爲阻塞IO模型。
eg:釣魚的時候,一直拿着魚竿,等魚兒咬鉤將魚兒拉上來。魚兒相當於數據包,釣魚者相當於進程。
二、非阻塞IO模型
recvfrom調用後,如果內核緩衝區沒有數據,則返回一個error,然後直接返回,等待一段時間再去看內核緩衝區有沒有數據,如此這般輪詢。
eg:釣魚的時候,可以去喝喝水,聊聊天,隔段時間看看魚竿有沒有動靜。
三、IO複用信號模型
Linux提供select/poll,進程通過將一個或多個fd傳遞個select或poll系統調用,阻塞在select操作上,這樣select/poll可以同時偵測多個fd是否處於就緒狀態,某個fd就緒就將內核緩衝區的數據拷貝到進程緩衝區。
eg:同時擺上多個魚竿,由垂釣者看着,某個有動靜就將某個拉上來。
、四、信號驅動IO模型
進程讀取數據時,系統調用recvfrom直接返回,此時進程是非阻塞的,當內核緩衝區數據準備好後,通知recvfrom進行數據的複製。(會註冊一個信號處理函數),
eg:買了一個帶有提醒功能的魚竿釣魚。
五、異步IO模型
進程讀取數據,在整個操作完成之後(磁盤到內核緩衝區,內核緩衝區到進程緩衝區)通知進程IO操作已經完成。
eg:魚竿具有自動釣魚功能,可以將魚兒收到魚簍中。
信號驅動與異步IO的比較
信號驅動的內核緩衝區到進程緩衝區這個過程依然是同步的,它的通知,僅是代表IO操作可以進行。
異步IO整個過程都是異步的,它的通知代表IO操作已經完成。