五種IO模型

<一>:IO 模型的種類: 異步

阻塞型、非阻塞型、複用型、信號驅動型、異步ide

 

<二>:IO 模型中概念:spa

1>. 同步/異步:插件

a. 關注消息通知機制。 線程

b. 同步是指等待對方返回消息。 進程

c. 異步是指被調用者經過狀態、通知或回調機制通知調用者被調用者的運行狀態。事件

 

2>. 阻塞/非阻塞: 內存

a. 關注調用者在等待結果返回以前所處的狀態;資源

b. 阻塞: blocking, 調用結果返回以前, 調用者被掛起;同步

c. 非阻塞: nonblocking , 調用結果返回以前, 調用者不會被掛起;

 

<三>:完成一次IO請求, 由兩個階段組成。

請求磁盤數據時, 使用到內核內存, 進程內存。 當接受到用戶請求時,內核先將請求的數據加載至內核內存中,在從內核內存加載到進程內存。

第一步: 等待數據, 即數據從磁盤到內核內存。

第二步: 複製數據, 即數據從內核內存到進程內存。

 

<四>:如何判斷IO模型?

IO模型的種類就是根據進程在IO請求的兩個階段時所處的狀態分類的。

 

5IO模型具體特徵?

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事件驅動模型, 主進程生成子進程,每一個子進程處理多個請求。 請求磁盤數據資源時,該子進程並無處於睡眠狀態。 該進程能夠接受處理的別的客戶端請求。 

相關文章
相關標籤/搜索