1. 程式人生 > >Linux高手入門:Linux五種I/O模型

Linux高手入門:Linux五種I/O模型

Linux:一切皆檔案

Linux將所有外部裝置都看做檔案,對檔案的讀寫操作會呼叫核心提供的系統命令,返回一個file descriptor(fd,檔案描述符)。

Linux也把socket當成檔案,稱為socketfd(socket描述符)。

描述符是一個數字,該數字指向核心中的一個結構體(該結構體包含檔案路徑,資料區等屬性)。

模型一:阻塞I/O模型

在程序空間中呼叫recvfrom,該系統呼叫直到資料包到達且被複制到應用程序的緩衝區中或者發生錯誤時才返回,次期間將會一直等待。

程序從呼叫recvfrom方法開始到recvfrom方法返回的期間都是被阻塞的。

模型二:非阻塞I/O模型(輪詢式)

呼叫recvfrom方法後,如果核心該緩衝區沒有資料,就直接返回一個EWOULDBLOCK錯誤。

模型三:I/O複用模型(select/poll)

Linux提供了select/poll函式,程序通過將一定數量的fd傳遞給select/poll函式。

select函式會被阻塞,select/poll函式偵測多個fd是否處於就緒狀態。

select/poll是順序掃描fd是否就緒的,而且支援的fd數量是有限。

模型四:I/O複用模型(epoll)

Linux提供了一個epoll函式,epoll函式使用事件驅動方式代替順序掃描,因此效能更高。當有fd就緒時,立即呼叫回撥函式。

模型五:訊號驅動I/O模型

先開啟套介面的訊號驅動I/O功能,sigaction函式安裝一個訊號處理函式(sigaction函式立即返回,程序繼續工作,它是非阻塞的)。

當資料準備就緒時,就為該程序生成一個SIGIO訊號,通過訊號回撥通知應用程式呼叫recvfrom來讀取資料。

非同步I/O

呼叫系統函式通知核心啟動某個操作,並讓核心在整個操作完成後(包括將資料從核心複製到使用者自己的緩衝區)通知我們。

Linux I/O模型的總結

  • IO主要涉及兩步操作:
  • 等待核心資料準備完成
  • 資料從核心複製到使用者空間
  • I/O模式的改進就是不斷減少在這兩步所花的時間。
  • 阻塞I/O: 兩個階段阻塞
  • 非阻塞I/O: 待核心資料準備完成期間輪詢(等同阻塞,也可以多個I/O一起輪詢) ,資料從核心複製到使用者空間阻塞
  • I/O複用: 等待核心資料準備完成期間可以多個I/O輪詢,資料從核心複製到使用者空間阻塞
  • 訊號驅動I/O:資料從核心複製到使用者空間期間執行緒阻塞
  • 非同步I/O:完全不阻塞

Linux訊號驅動I/O與非同步I/O的區別

  • 訊號驅動I/O:核心通知程式何時可以開始一個I/O操作;
  • 非同步I/O: 核心通知程式I/O操作何時已完成,也就是說資料準備和資料複製到使用者空間都是系統完成的。

原文:Python運維圈