LInux五大網路IO模型

2021-10-05 21:26:26 字數 2150 閱讀 1208

在網路環境下,通俗的講,將io分為兩步:

1.等;

2.資料搬遷。

如果要想提高io效率,需要將等的時間降低。

五種io模型包括:阻塞io、非阻塞io、訊號驅動io、io多路轉接、非同步io。其中,前四個被稱為同步io。

在介紹五種io模型時,我會舉生活中釣魚的例子,加深理解。

1.阻塞io(blocking i/o)

a拿著一支魚竿在河邊釣魚,並且一直在魚竿前等,在等的時候不做其他的事情,十分專心。只有魚上鉤的時,才結束掉等的動作,把魚釣上來。

在核心將資料準備好之前,系統呼叫會一直等待所有的套接字,預設的是阻塞方式。

其實,我們例子中所說的魚竿就是這乙個檔案描述符。這個模型是我們最常見的,程式呼叫和我們編寫的基本程式是一致的。

fd=connect();

write(fd);

read(fd);

close(fd);

程式的read必須在write之後執行,當write阻塞住了,read就不能執行下去,一直處於等待狀態。

2.非阻塞io(noblocking i/o)

b也在河邊釣魚,但是b不想將自己的所有時間都花費在釣魚上,在等魚上鉤這個時間段中,b也在做其他的事情(一會看看書,一會讀讀報紙,一會又去看其他人的釣魚等),但b在做這些事情的時候,每隔乙個固定的時間檢查魚是否上鉤。一旦檢查到有魚上鉤,就停下手中的事情,把魚釣上來。

其實,b在檢查魚竿是否有魚,是乙個輪詢的過程。

每次客戶詢問核心是否有資料準備好,即檔案描述符緩衝區是否就緒。當有資料報準備好時,就進行拷貝資料報的操作。當沒有資料報準備好時,也不阻塞程式,核心直接返回未準備就緒的訊號,等待使用者程式的下乙個輪尋。

但是,輪尋對於cpu來說是較大的浪費,一般只有在特定的場景下才使用。

3.訊號驅動io(signal blocking i/o)

c也在河邊釣魚,但與a、b不同的是,c比較聰明,他給魚竿上掛乙個鈴鐺,當有魚上鉤的時候,這個鈴鐺就會被碰響,c就會將魚釣上來。

訊號驅動io模型,應用程序告訴核心:當資料報準備好的時候,給我傳送乙個訊號,對sigio訊號進行捕捉,並且呼叫我的訊號處理函式來獲取資料報。

4.io多路轉接(i/o multiplexing)

d同樣也在河邊釣魚,但是d生活水平比較好,d拿了很多的魚竿,一次性有很多魚竿在等,d不斷的檢視每個魚竿是否有魚上鉤。增加了效率,減少了等待的時間。

io多路轉接是多了乙個select函式,select函式有乙個引數是檔案描述符集合,對這些檔案描述符進行迴圈監聽,當某個檔案描述符就緒時,就對這個檔案描述符進行處理。

其中,select只負責等,recvfrom只負責拷貝。

io多路轉接是屬於阻塞io,但可以對多個檔案描述符進行阻塞監聽,所以效率較阻塞io的高。

5.非同步io(asynchronous i/o)

e也想釣魚,但e有事情,於是他雇來了f,讓f幫他等待魚上鉤,一旦有魚上鉤,f就打**給e,e就會將魚釣上去。

當應用程式呼叫aio_read時,核心一方面去取資料報內容返回,另一方面將程式控制權還給應用程序,應用程序繼續處理其他事情,是一種非阻塞的狀態。

當核心中有資料報就緒時,由核心將資料報拷貝到應用程式中,返回aio_read中定義好的函式處理程式。

很少有linux系統支援,windows的iocp就是該模型。

可以看出,阻塞程度:阻塞io>非阻塞io>多路轉接io>訊號驅動io>非同步io,效率是由低到高的。

五大IO模型

乙個輸入操作通常包括兩個階段 對於乙個套接字上的輸入操作,第一步通常涉及等待資料從網路中到達。當所等待資料到達時,它被複製到核心中的某個緩衝區。第二步就是把資料從核心緩衝區複製到應用程序緩衝區。unix 有五種 i o 模型 應用程序被阻塞,直到資料從核心緩衝區複製到應用程序緩衝區中才返回。應該注意...

數字家庭五大網路應用方案全解析

家 庭閘道器是運營商進入家庭網路的關鍵,也是運營商網路和業務優勢的集中體現。作為家庭網路與電信運營商網路聯絡與互通的樞紐,家庭閘道器在數字家庭網路中承擔 著核心作用。一方面,家庭閘道器為家庭內部各終端提供聯網手段,並負責公網與家庭網路中各子網 pc 家電 照明 安防等 的互通和遠端管理與控制。另 一...

數字家庭五大網路應用方案全解析

家 庭閘道器是運營商進入家庭網路的關鍵,也是運營商網路和業務優勢的集中體現。作為家庭網路與電信運營商網路聯絡與互通的樞紐,家庭閘道器在數字家庭網路中承擔 著核心作用。一方面,家庭閘道器為家庭內部各終端提供聯網手段,並負責公網與家庭網路中各子網 pc 家電 照明 安防等 的互通和遠端管理與控制。另 一...