【源起Netty 前傳】Linux網絡模型小記

引言

以前的兩篇文章 FastThreadLocal怎麼Fast?ScheduledThreadPoolExecutor源碼解讀 搞的我心力交瘁,且讀源碼過程當中深感功力不足,遂決定「磨刀」——先達到較熟練使用netty的程度,再回過頭來繼續啃源碼!至於「磨刀石」嘛,選擇了《Netty權威指南》(第二版)……哎呦,不錯奧!java

正文

其實本篇文章更像是一篇讀書筆記,記錄了Linux網絡模型的相關知識。爲何要關注Linux網絡模型?由於java的各I/O模型與之關係緊密!編程

書中根據UNIX網絡編程,做了5種I/O模型分類:segmentfault

阻塞I/O模型

clipboard.png

最簡單的一種,等待直至完成的過程,很少做解釋。網絡

非阻塞I/O模型

clipboard.png

這種也很好理解,由阻塞I/O的死等系統響應進化成屢次調用查看數據就緒狀態異步

I/O複用模型

clipboard.png

select/poll,以及它的加強版epoll就屬於該種模型。與非阻塞I/O模型相比,愚覺得有兩點優點:spa

  1. 不須要用戶進程進行掃描以確認數據就緒狀態,改成系統層面幫你「掃描」。此時用戶進程阻塞在select事件上,數據就緒系統予以通知。
  2. epoll 基於事件驅動的方式代替掃描

這裏多提一句,epoll把消息通知給用戶空間時避免了內存複製(0拷貝),使用的mmap技術,即內核和用戶空間映射到同一內存實現。netty

信號驅動I/O模型

clipboard.png

應用進程創建SIGIO信號處理程序時,是非阻塞的。而數據就緒時,以SIGIO信號的形式通知到用戶進程。code

異步I/O模型

clipboard.png

特色是,幾乎所有交由系統處理,數據處理完畢後,才通知到用戶進程。blog

後記

以上的描述中,是否是不少詞句都在java I/O相關的世界中聽到過?是的——阻塞I/O對應BIO,epoll之於NIO,NIO的多路複用技術對標I/O複用模型,以及AIO和異步I/O模型……進程

好了,that's all,小記就要有小記的樣子。最後,再次推薦《Netty權威指南》!

相關文章
相關標籤/搜索