五種IO模型

<一>:IO 模型的種類: 

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

 

<二>:IO 模型中概念:

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請求的第一、二階段, 進程都是處於釋放狀態的。進程僅僅負責接受客戶端請求,之後的所有的工作進程都不需要負責。

 

<五>: Nginx的三大特徵:

1>. Event-driven: 事件驅動

2>. Asynchronous: 異步

3> non-blockign: 非阻塞。

 

 

<六>: Httpd IO模型:

httpd各工作模式完成一次客戶端的響應的需要的過程:

1>. prework : 二層模型, 主進程生成子進程,每一個進程僅能處理完一個用戶請求,才能處理下一個請求。子進程接受一個用戶請求,需要請求磁盤數據資源,進程處於睡眠狀態,只有將請求的數據加載完,進程纔會被喚醒。

2>.worker: 三層模型, 主進程生成子進程,子進程生成線程,線程用來處理用戶請求。 當請求磁盤數據資源時,線程處於睡眠狀態,只有將請求的數據加載完,線程纔會被喚醒。

3>. event: 事件驅動,從生成進程角度來看上是二層模型, 從工作的模式角度來看是三層模型。 event事件驅動模型, 主進程生成子進程,每個子進程處理多個請求。 請求磁盤數據資源時,該子進程並沒有處於睡眠狀態。 該進程可以接受處理的別的客戶端請求。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章