Linux下典型IO模型 +select多路轉接模型(概念)

**目錄**
     1.         阻塞IO
     2.         非阻塞IO
     3.         信號驅動IO
     4.         異步IO  (同步概念)
     5.         select「多路轉接」IO(篇幅所限放置下一篇博客中,持續更新哦)

在咱們開始描述以前,請有必要的瞭解這個概念
任何在IO過程當中,其本質上均發生了倆個行爲,「等待」,「拷貝」,等待數據準備完成,從內核中拷貝到用戶空間
能夠想象,IO過程當中浪費的大量時間均是在等待消耗,那麼反之,爲提升IO效率,最爲核心的思想就是想辦法讓「等待時間」儘可能少!異步

阻塞IOide

  • 發起一個功能操做,當要求進行獲取數據時,若是內核沒有將數據準備好,則一直會等待———直到數據準備好後才繼續;
  • 全部的套接字,默認的方式都是阻塞方式
    Linux下典型IO模型 +select多路轉接模型(概念)Linux下典型IO模型 +select多路轉接模型(概念)
    非阻塞IO
  • 發起一個功能操做,要求獲取數據時,內核表示未將數據準備完成,則執行的系統調用接口會當即返回而且報出響應錯誤(通常爲EWOULDBLOCK)
  • 非阻塞IO減小了等待時間,可是不成功返回時是意義不大的,因此通常程序猿在使用過程當中,會對非阻塞接口進行反覆調用(目的是反覆嘗試獲取讀寫的文件描述符),這即是「輪詢」方式,對cpu利用有較大的浪費;

Linux下典型IO模型 +select多路轉接模型(概念)

信號驅動IO函數

  • 信號驅動IO,顧名思義,在IO處理方式中引入了信號的處理模式
  • 發起一個功能操做,要求獲取數據時,發送請求後再也不關注,待到內核將數據準備好,發送SIGIO信號通知進程完成後續IO操做
  • 注意這裏SIGIO監測的是「內核將數據準備好or not」,而不是已經完成「拷貝」的第二次行爲
    Linux下典型IO模型 +select多路轉接模型(概念)
    異步IO
  • 發起一個功能操做,須要請求數據時,發送請求後再也不關注,待到內核將數據準備 + 數據拷貝完成時,再通知進程,執行後續IO操做
  • 須要關注的是 它與信號驅動IO的區別,在於數據的拷貝是否發生在「通知」以前;

Linux下典型IO模型 +select多路轉接模型(概念)

異步/同步概念code

  • 異步:
    • 爲完成一個功能,發出調用,調用發出以後就返回了,根據被調用者狀態,通知調用者,此時能夠處理這個調用真正處理結果了
      • 同步
      • 爲了完成一個功能,發出調用,等待被調用狀態就緒則繼續,不然一直等待

到這裏相信你們都很疑惑,那麼「異步/同步」與「阻塞/非阻塞」不是同樣的嗎?
答:阻塞與非阻塞,主要強調操做是否當即返回;
異步與同步,主要強調功能完成的時序性,關注的是 「消息通訊機制」
這裏引用經典實例來輔助理解:
異步通訊機制:
Linux下典型IO模型 +select多路轉接模型(概念)
異步與同步的標準模板是這樣的:blog

所謂同步,就是在發出一個調用時,在沒有獲得結果以前,該調用就不返回。可是一旦調用返回,就獲得返回值了。換句話說,就是由調用者主動等待這個調用的結果。
而異步則是相反,調用在發出以後,這個調用就直接返回了,因此沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會馬上獲得結果。而是在調用發出後,被調用者經過狀態、通知來通知調用者,或經過回調函數處理這個調用。接口

阻塞與非阻塞:進程

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.

Linux下典型IO模型 +select多路轉接模型(概念)

因爲篇幅所制,將select多路複用IO模型以及poll,epollIO模型,以及相應TCP通訊代碼,將在將來幾篇博客上附上連接;
到這裏你們就清楚了吧!哈哈,感謝您的觀看;回調函數

相關文章
相關標籤/搜索