<一>:IO 模型的種類: 異步
阻塞型、非阻塞型、複用型、信號驅動型、異步ide
<二>:IO 模型中概念:spa
1>. 同步/異步:插件
a. 關注消息通知機制。 線程
b. 同步是指等待對方返回消息。 進程
c. 異步是指被調用者經過狀態、通知或回調機制通知調用者被調用者的運行狀態。事件
2>. 阻塞/非阻塞: 內存
a. 關注調用者在等待結果返回以前所處的狀態;資源
b. 阻塞: blocking, 調用結果返回以前, 調用者被掛起;同步
c. 非阻塞: nonblocking , 調用結果返回以前, 調用者不會被掛起;
<三>:完成一次IO請求, 由兩個階段組成。
請求磁盤數據時, 使用到內核內存, 進程內存。 當接受到用戶請求時,內核先將請求的數據加載至內核內存中,在從內核內存加載到進程內存。
第一步: 等待數據, 即數據從磁盤到內核內存。
第二步: 複製數據, 即數據從內核內存到進程內存。
<四>:如何判斷IO模型?
IO模型的種類就是根據進程在IO請求的兩個階段時所處的狀態分類的。
5種IO模型具體特徵?
1>. 阻塞型IO
IO請求的兩個階段,進程都是出於掛起狀態的。
2>. 非阻塞型IO
IO請求第1階段進程並無出於阻塞模型, 在第2階段出於阻塞狀態。 可是第1階段, 進程出於忙等狀態, 不能處理任何請求。
3>. 複用型IO調用:
在非阻塞IO模型的前提,每一個進程能夠監控多路IO的狀態信號。
複用型IO在系統中實現方式?
select()是BSD(類Unix)系統中內核插件。
poll()是有Linux系統內核插件。
不管是select(), 仍是poll()插件,都是能夠使一個進程能夠同時監控多路IO狀態信號。 採用這種進制的IO模型爲複用型IO調用。
4>. 信號驅動模型:
IO請求的第一階段, 進程是處於釋放狀態的,該期間進程接受別其餘客戶端請求。當IO第一階段處理完以後,被調用者會通知進程資源加載完成,進程便處於阻塞狀態,當IO請求第二階段完成以後,進程將數據發往客戶端。
event-drivent(事件驅動在系統中實現):
1>. epoll (Linux) : 經過libevent庫提供
2>. Kqueue (BSD)
3>. /dev/poll (Solaris)
5>. 異步模型:
IO請求的第1、二階段, 進程都是處於釋放狀態的。進程僅僅負責接受客戶端請求,以後的全部的工做進程都不須要負責。
<五>: Nginx的三大特徵:
1>. Event-driven: 事件驅動
2>. Asynchronous: 異步
3> non-blockign: 非阻塞。
<六>: Httpd IO模型:
httpd各工做模式完成一次客戶端的響應的須要的過程:
1>. prework : 二層模型, 主進程生成子進程,每個進程僅能處理完一個用戶請求,才能處理下一個請求。子進程接受一個用戶請求,須要請求磁盤數據資源,進程處於睡眠狀態,只有將請求的數據加載完,進程纔會被喚醒。
2>.worker: 三層模型, 主進程生成子進程,子進程生成線程,線程用來處理用戶請求。 當請求磁盤數據資源時,線程處於睡眠狀態,只有將請求的數據加載完,線程纔會被喚醒。
3>. event: 事件驅動,從生成進程角度來看上是二層模型, 從工做的模式角度來看是三層模型。 event事件驅動模型, 主進程生成子進程,每一個子進程處理多個請求。 請求磁盤數據資源時,該子進程並無處於睡眠狀態。 該進程能夠接受處理的別的客戶端請求。