首頁>技術>

1. 什麼是IO?

  簡單來說就是輸入輸出
2. 網路IO經歷步驟使用者在獲取網路資源是在進入網絡卡,經過網路七層模型將請求交給nginx使用者程序使用者程序無法直接獲取磁碟上的資源,會將請求獲取什麼資源翻譯並轉發給核心,核心驅動磁碟尋道找到檔案(最耗時間的環節)檔案同樣也不能直接交給使用者程序,首先磁碟將檔案放至核心緩衝區,然後核心告知使用者程序請求的資源結果已準備好(耗時比較短)核心緩衝區將檔案複製一份至使用者程序緩衝區,使用者程序拿到檔案 構建響應報文,透過http回傳給使用者

總結:

IO總共要經歷兩個階段

1.磁碟讀取資料,將資料複製至核心緩衝區

2.將核心緩衝區資料複製至使用者程序緩衝區

3. 網路IO模型種類同步阻塞

比如你要去完成這樣一件事情,把水燒開,灌入暖瓶

現在給你一口普通的鍋,你也不知道水什麼時候可以燒開,你決定守在旁邊等待水開。

這個時候的你是什麼也做不了的,是不是覺得很浪費時間

當水開了就需要你把水灌入暖瓶,你還是做不了其他的事情

同步非阻塞

比如還是燒一鍋開水,你還是不知道水什麼時候會開,你選擇了另外一個策略,去忙其它的事情但是要時不時看下水開沒開

改進了什麼呢?

你可以在空擋時間忙其它的事情

增加了什麼麻煩呢?你得時不時的確認水開沒開(就意味著得不停的呼叫cpu,佔用cpu資源)可能你上一次剛看的時候水沒開,等你剛看完水開了,那就得等下一次檢視的時候才能發現,增加了延遲,等你知道了水開了,自己去把水灌好非同步阻塞

這個就比較二了

假如給你一個智慧熱水壺,水開了會自動的提醒你的,但是你還是要傻傻的等

完全沒有利用好智慧熱水壺的優勢(不做解釋)

同步非同步:關注的是訊息的通知機制

阻塞非阻塞:關注的是在收到結果之前呼叫者的狀態是等待還是忙自己的事情

IO多路複用

還拿燒水的例子

不要你來管水開沒開,直接交給一個代理,假如代理名叫select,select在那幫你監控水開沒開,捎帶他還會看飯有沒有煮好,你把所有的事情都交代給它,可以去忙自己的事情了在飯還沒熟,水還沒開的時候select就處於一個等待的狀態,假如這個時候水開了select會水開了的結果寫到一個小黑板你可以看到並知道水開了,不需要你去檢視水開沒開,接下來由你將燒開的水灌進暖瓶(使用者程序前半部分不阻塞,後半部份阻塞)

select、poll、epoll的區別

無論是select、poll、epoll都可以面對多個使用者程序的請求,它相當於一個代理人,收集很多使用者程序的請求,他幫你從磁碟上獲取資料,複製到核心中,那麼這個資料準備沒準備好它的實現機制是不一樣的

通知方式:假設有一個使用者資料準備好了,那麼還有很多使用者資料還沒有準備好,那麼如何通知?

select和poll是遍歷掃描,效率低下

epoll採用回撥機制,epoll會主動通知,效率更高(nginx支援)

訊號驅動IO

舉例:比如我們的智慧熱水壺我麼設定好燒水以後,會給你一個反饋結果為設定成功,然後你就可以去忙其他的事情了,等到水燒開了會發給你一條短息,這個時候你再回去把水灌入暖瓶

通知機制:水平觸發:多次通知邊緣觸發:只通知一次

總結:說了這麼多 nginx 屬於IO多路複用 的 epoll

12
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Spring——迴圈依賴&示例解析(圖文並茂)