五種IO模型

五種IO模型

以前,我看過別人針對五種IO模型舉過一個很合適的例子,那麼今天我將以生動的例子幫助大家更好的理解這五種IO模型。

阻塞IO

假如A在河邊釣魚的時候,非常的專心,生怕魚兒溜掉,故此,A就一直盯着魚竿,一直等着魚兒上鉤,專心的做這一件事情,直到魚兒上鉤,才結束這個動作,這就是阻塞IO。在內核把數據準備好之前,系統調用會一直處於阻塞狀態。

在這裏插入圖片描述

非阻塞IO

假如B也在河邊釣魚,B不想像A一樣把所有的時間都花在等魚兒上鉤這件事情上,所以他的做法就是在等待魚兒上鉤的同時,自己也可以看看書,刷刷小編的博客,聊天等等。但是B也不是就不管魚兒了,他會每隔一段固定時間都來看一下,有沒有魚兒上鉤,如果有魚兒上鉤,他就結束這個動作,這就是非阻塞IO。
非阻塞IO往往需要程序員循環的方式反覆嘗試讀取文件描述符,這個過程稱爲輪詢,這對於cpu來說的話是較大的浪費,一般只有特定的場景下才能使用。
在這裏插入圖片描述

信號驅動IO

假如C也在河邊釣魚,他認爲A、B不夠聰明,故此,他想了一種辦法,就是在魚竿上掛上了一個鈴鐺,當有魚兒上鉤的時候,鈴鐺就會被觸發,發出響聲,他就可以過去將魚兒釣上來了。信號驅動IO模型,應用進程告訴內核:當數據報準備好的時候,給我發送一個信號,對SIGIO信號進行捕捉,並且調用我的信號處理函數來獲取數據報。
在這裏插入圖片描述
IO多路轉接

假如D也在河邊釣魚,但是D是一個土豪,他一個人就拿了好多魚竿擺在哪裏,這樣很明顯就增加了魚兒上鉤的機會。他只需要不斷地查看每個魚竿是否有魚兒上鉤就行了,提高了效率。 實際上最核心在於IO多路轉接能夠同時等待多個文件描述符的就緒狀態。
在這裏插入圖片描述

異步IO

假如E也想釣魚,但是他又有點忙,所以他僱傭了一個人專門幫他看着魚竿,一旦有魚兒上鉤,就讓這個人通知他,他過來將魚兒釣上來。由內核在數據拷貝完成時, 通知應用程序(信號驅動是告訴應用程序何時可以開始拷貝數據).
在這裏插入圖片描述

任何IO過程中, 都包含兩個步驟. 第一是等待, 第二是拷貝. 而且在實際的應用場景中, 等待消耗的時間往往都遠遠高於拷貝的時間. 讓IO更高效, 最核心的辦法就是讓等待的時間儘量少.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章