天天看點

Linux網絡I/O模型Linux網絡I/O模型簡介

Linux網絡I/O模型簡介

Linux的核心把所有外部裝置都當做檔案進行操作,并傳回一個檔案描述符fd(file descriptor),同樣對socket的進行的操作也回傳回一個socketfd,是一個數字,并指向核心中的一個結構體。

UNIX提供的五種網絡I/O模型

1.阻塞I/O模型: 預設情況下,所有檔案操作都是阻塞的,以socket為例:在程序空間中調用recvfrom,其系統調用直到資料包到達并且被複制到應用程序的緩沖區中或者發生錯誤時才傳回,在此期間一直會等待,

程序在從調用recvfrom開始到它傳回的整段時間内都是阻塞的。

Linux網絡I/O模型Linux網絡I/O模型簡介

2.非阻塞I/O模型:recvfrom從應用層到核心層的時候,如果該緩沖區内沒有資料的話,就傳回一個EWOULDBLOCK的錯誤,一般對非阻塞模型輪詢檢查這個狀态,檢查核心是否有資料傳回。

Linux網絡I/O模型Linux網絡I/O模型簡介

3.I/O複用模型:Linux提供select/poll,程序通過将一個或者多個fd傳遞給select/poll系統調用,阻塞在select操作上,這樣select/poll可以幫我們偵測多個fd是否處于就緒狀态。select/poll是順序掃描fd是否就緒,支援的fd數量有限,是以使用受到了一些制約。Linux還提供了一個epoll系統調用,epoll使用基于事件驅動的方式代替順序掃描,是以性能更高。當有fd就緒時,立即回調rollback。

Linux網絡I/O模型Linux網絡I/O模型簡介

4.信号驅動I/O模型:首先開啟套接口信号驅動I/O功能,并通過系統調用sigaction執行一個信号處理函數(此系統調用立即傳回,程序繼續工作,非阻塞)。當資料準備就緒時,就為該程序生成一個SIGIO信号,通過信号回調通知應用程式調用recvfrom來讀取資料,并通知主循環函數處理資料。

Linux網絡I/O模型Linux網絡I/O模型簡介

5.異步I/O:告知核心啟動某個操作,并讓核心在整個操作完成後(包括将資料從核心複制到使用者自己的緩沖區)通知我們。這種模型與信号驅動的主要差別是:信号驅動I/O由核心通知我們何時可以開始下一個I/O操作;異步I/O模型由核心通知我們I/O操作何時已經完成。

Linux網絡I/O模型Linux網絡I/O模型簡介

繼續閱讀