linux中五種高階IO模型總結

2021-10-03 15:19:55 字數 2217 閱讀 5445

高階io模型:

高階io其實是相對於基礎io的乙個優化,一般基礎io都是像read,write這樣的函式來供我們呼叫io介面,當我們呼叫它們時,它們一般情況下就是阻塞接收(也就是我們的程式在執行read函式時停下來,如果檔案中有資料了,再進行讀取,等io操作完畢後,才能繼續執行下面的程式,當然我們也可以設定為非阻塞的形式,也就是當檔案裡沒有資料時,我們不停止程式進行等待,而是直接報錯返回;基礎io在我們對自己磁碟或硬碟上的檔案進行操作時,還是可以很好的使用的,但如果在網路程式設計中,還是使用像這樣的io函式,那效能會很低,因為我們如果是服務端,要接收客戶端傳送過來的資料,所以我們會使用recv這樣的函式(tcp),這個函式在進行接收資料時,一般情況下是阻塞接收的,也就是當資料到達服務端之前它會一直阻塞程式,而服務端在接收資料時,是先把網絡卡流進來的資料儲存在接收緩衝區中,這個緩衝區在核心中,所以當我們真正開始接收資料時,是從這個緩衝區中來接收資料的,也就是我們在接收資料時經過很長的等待時間,所以要阻塞程式很長時間,後面的程式都不能執行;還有就是可能同時有多個客戶端的資料要傳送給服務端,所以會有很多客戶端的socket需要進行監視,而使用recv函式只會監視乙個socket,並且會對程式進行阻塞,所以在監視的那麼socket資料來臨之前,其它的客戶端傳送的資料都不會被接收,所以造成效能下降,在使用基礎io時,還會有很多其它的問題,不過主要是在進行網路通訊時,這種問題會變得很明顯,所以有時也把它叫做網路io模型,通過這幾個io模型,在不同的環境下對基礎io進行優化,使用它們的效能變得更好,效率更高並且能夠節約時間

第一種模型就是阻塞io,以recv函式為例,它的方式就是在客戶端傳送過來資料之前,一直阻塞在那個io函式上,直到核心的接收緩衝區接收到資料,並且通知程序可以接收資料時,才會進行資料的接收,等接收資料完成之後,才會繼續執行接下來的程式

第二種模型就是非阻塞io,以recv函式為例,它的方式就是當程式執行到那個io函式時,先判斷有沒有有資料可以接收,如果有資料能夠接收,那麼就直接接收資料,然後繼續執行程式,如果沒有資料可以接收,那麼不阻塞程式,直接報錯返回;因為我們肯定是要接收客戶端的資料報的,但我們使用的是非阻塞io模型,所以我們得用輪詢的方式來迴圈判斷有沒有資料可以接收,也就是當這個io函式報錯返回時,我們讓它從頭再開始執行程式,然後執行到這個函式時,又會進行判斷,有沒有資料可以接收,使用這種方式的好處是,我們不用一直等待在這個io函式處,就可以直接執行下面的程式,然後等迴圈過去時,再接收資料,雖然可能會接收的遲一些,但也提高了效能和效率,不過這種輪詢的方式,需要不停的往復迴圈,所以對cpu的消耗比較大

第三種模型是訊號驅動io,以recv函式為例,它的方式就是用sigaction函式對sigio訊號進行處理,訊號到來時,說明有資料可以被接收了,這時就可以呼叫接收資料的io函式進行資料的接收,使用這種方式我們不用進行阻塞等待,可以直接通過訊號知道什麼時候可以接收資料,然後呼叫對應的io函式就可以了,不過使用這種方式,當訊號到來時,所有的執行緒都得掛起,然後呼叫接收資料的io函式進行接收,這樣顯然是不好的,因為所有的執行緒掛起,就表示所有的執行緒都得等待這個io函式接收資料,並且什麼都做不了

第四種模型是非同步io,以recv函式為例,要說非同步io就得先說同步的概念,我們在正常處理乙個recv函式時,是我們程序先執行程式,然後執行到recv函式處了,然後進行recv函式呼叫,接著等待接收資料,當可以接收資料時,然後進行接收,最後返回,也就是說從開始執行recv到最後接收資料完成,都是由這個程序做的,當它做完接收資料的事後,才能執行下面的程式,而非同步io就是指當我們的程式執行到recv函式處時,不必等待它接收資料完成,就可以直接返回(不是報錯返回,和非阻塞不同),然後這個recv函式不在由這個程序來執行,而是由核心來執行,也就是說程式在沒有接收到資料的時候也可以繼續往下執行,而接收資料的任務由核心來完成,當核心接收完資料後,會傳送乙個訊號,讓我們捕捉,告訴我們接收資料完成了,也就是說接收資料和程序執行程式是分開的,是同時進行的,所以這個io函式在執行時,不是由它的呼叫者執行的,而由核心執行,是分開來執行的,所以就非同步了

第五種模型是多路轉接io,以recv函式為例,我們在接收資料時使用recv函式,來等待乙個客戶端資料的到來,然後我們就可以使用這個函式來接收資料了,但有一點這個函式只能等待乙個客戶端,因為它只能監視乙個socket,但是通常我們乙個服務端,可能同時要接收好多客戶端傳送過來的資料,這時這個函式就不能很好的完成任務了,因為它只能監視乙個socket,而其它客戶端的資料就算傳送過來了,也不能接收,所以我們開發了多路轉接io模型,它可以同時監視多個檔案描述符,也就是可以同時監視多個socket,當乙個或多個客戶端的資料到來,我們就可以通過程序,有客戶端資料到來,並且告訴服務端是哪些客戶端的資料到來了,然後客戶端就可以呼叫recv函式來接收客戶端傳送過來的資料了

linux 五種高階IO模型

阻塞io模型 在核心將資料準備好,系統呼叫會一直等待,所有的套接字預設都是阻塞io方式 阻塞io是最常見的io模型 非阻塞io模型 非阻塞io往往需要程式設計師迴圈的方式反覆嘗試讀取檔案描述符,這個過程稱為輪詢,這對於cpu來說的話是較大的浪費,一般只有特定的場景下才能使用 訊號驅動io模型 核心將...

Linux五種IO模型

五種io模型的理解 阻塞io 收銀台等待 在核心將資料準備好之前,系統調 會 直等待.所有的套接字,預設都是阻塞 式.阻塞io 座位等待 往往需要程式設計師迴圈的方式反覆嘗試讀寫檔案描述符,這個過程稱為輪詢.訊號驅動io 等服務員叫 核心將資料準備好的時候,使 sigio訊號通知應用程式進行io操作...

Linux 五種I O模型

首先,我們來看一下,有哪五種i o模型 小結 非阻塞i o,記錄鎖,系統v流機制,i o多路轉接 也叫i o多路復用 readv和writev函式以及儲存對映i o mmap 這些統稱為高階i o。首先,我們來看乙個介面 int fcntl int fd,int cmd,arg 功能 針對描述符提供...