阻塞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更高效,最核心的辦法就是讓等待的時間盡量少。
-
內核
+關注
關注
3文章
1402瀏覽量
40904 -
應用程序
+關注
關注
38文章
3312瀏覽量
58507
發布評論請先 登錄
相關推薦
Linux驅動開發之IO模型介紹
【微五科技CF3310開發板試用體驗】之安全算法小盤點
網絡IO模型:阻塞與非阻塞

多路IO復用模型和異步IO模型介紹

介紹reactor的四種模型

評論