五種IO模型(小白都能看懂是講解)

2021-10-07 07:45:51 字數 1581 閱讀 7959

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

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

阻塞io、非阻塞io、訊號驅動io、多路復用io、非同步io。

前四個被稱為同步io。

最傳統的一種io模型,即在讀寫資料過程中會發生阻塞現象。

當使用者執行緒發出io請求之後,核心會去檢視資料是否就緒,如果沒有就緒就會等待資料就緒,而使用者執行緒就會處於阻塞狀態,使用者執行緒交出cpu。當資料就緒之後,核心會將資料拷貝到使用者執行緒,並返回結果給使用者執行緒,使用者執行緒才解除block狀態。

列舉乙個生活的列子:

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

當使用者執行緒發起乙個read操作後,並不需要等待,而是馬上就得到了乙個結果。如果結果是乙個error時,它就知道資料還沒有準備好,於是它可以再次傳送read操作。一旦核心中的資料準備好了,並且又再次收到了使用者執行緒的請求,那麼它馬上就將資料拷貝到了使用者執行緒,然後返回。

列舉乙個生活的列子:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

————————————————

小白都能看懂的block

首先說明一下,我自己也是乙個小白 這是我對block的一點認識或總結,有不對的地方,希望大家指出來 block就是乙個 塊,用來執行一小段程式的,通常我們定義乙個block 可以用它的基本模型,返回值型別 變數的名字 引數型別 例如 int myblock int 這就是定義了乙個block 這個變...

SQL基本語法 小白都能看懂

本篇主要從以下四個方面介紹,主要是比較基礎的語法,讓每一位學習者都能看懂。本文中資料庫名為testdemo,資料表的名字為tb user 1.ddl 資料庫定義語言 ddl主要是針對建立表時對錶結構的定義,使用中主要體現在以下三個關鍵字上 注 資料庫標準中要求關鍵字都應大寫,為了學習方便,這裡進行小...

小白都能看懂的softmax詳解

softmax把一些輸入對映為0 1之間的實數,並且歸一化保證和為1,因此多分類的概率之和也剛好為1 或參考 小白都能看懂的softmax詳解 在機器學習尤其是深度學習中,softmax是個非常常用而且比較重要的函式,尤其在多分類的場景中使用廣泛。他把一些輸入對映為0 1之間的實數,並且歸一化保證和...