天天看點

阻塞非阻塞同步異步與IO模型

文章目錄

    • 1. 阻塞與非阻塞
    • 2. 同步與異步
    • 3. 阻塞IO模型
    • 4. 非阻塞IO模型
    • 5. IO複用模型
    • 6. 信号驅動IO模型
    • 7. 異步IO模型

1. 阻塞與非阻塞

阻塞與非阻塞是針對做一件事情的時候,如果遇到一個需要耗時操作,是等待完成,還是不等待。

舉個例子,燒開水。當經曆了拿鍋、接水、點火等操作,來到了一個耗時操作,燒水。

燒水是一個耗時操作,如果:

  1. 阻塞,意思就是,你就在這個地方等水燒開,其他什麼也不幹。
  2. 非阻塞,就表示水已經燒上了,你可以走開,去客廳看會兒電視,然後可以每隔幾分鐘來廚房看一下水燒開了沒

阻塞雖然有點傻,但是它能及時相應水燒開這個事件。

非阻塞,在輪詢檢查中間可能水就已經燒開了,讓你不能及時了解到水燒開這個事件。

2. 同步與異步

同步與異步是在做一件事情的時候,需要做另一件事情,是等待另一件事情完成,還是不等待。

例如:在解析HTML文檔的時候,發現需要一些資料,這些資料可以通過JavaScript去擷取,那麼:

  1. 同步,就是在JavaScript去拿資料這段時間,解析動作停止了,直到JavaScript把資料拿回來
  2. 異步,就是可以單獨啟用一個線程去執行JavaScript拿資料這個操作,這樣解析動作可以繼續,當拿到資料資料之後,拿資料的線程通知主線程就可以

3. 阻塞IO模型

使用者程式執行recvfrom系統調用,然後就在這個地方等到recvfrom完成,什麼都不做。

4. 非阻塞IO模型

戶程式執行recvfrom系統調用,然後直接就走了,然後開始輪詢檢查,核心緩沖區資料是否準備好。

5. IO複用模型

非阻塞IO模型的輪詢機制不錯,但是每一個IO都來輪詢,有點浪費,是以IO複用模型通過一個select(poll)系統調用統一輪詢。

當使用者執行一個讀操作時,把對應檔案或者套接字的fd傳遞給select,select就可以一直周遊fd,看有哪些fd的資料準備好了,準備好了就通知對應的程序。

6. 信号驅動IO模型

通過sigaction系統調用,當資料準備好了通知使用者程式調用recvfrom。

信号驅動IO模型和IO複用模型差不多,不過沒有select的fd數量限制問題。

7. 異步IO模型

異步IO模型就是,使用者程式說我要讀xxx資料,然後就走了。然後系統執行讀操作,并把資料從核心空間拷貝到使用者空間之後,在通知使用者程式,完全的VIP服務。

和信号驅動IO模型相比,異步IO模型更加智能,不需要使用者程式在調用recvfrom了,相當于資料準備好,并且幫你讀完了再通知你,而不是通知你來讀資料。