<一>:IO 模型的種類:
阻塞型、非阻塞型、複用型、信號驅動型、異步
<二>:IO 模型中概念:
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請求的第一、二階段, 進程都是處於釋放狀態的。進程僅僅負責接受客戶端請求,之後的所有的工作進程都不需要負責。
<五>: Nginx的三大特徵:
1>. Event-driven: 事件驅動
2>. Asynchronous: 異步
3> non-blockign: 非阻塞。
<六>: Httpd IO模型:
httpd各工作模式完成一次客戶端的響應的需要的過程:
1>. prework : 二層模型, 主進程生成子進程,每一個進程僅能處理完一個用戶請求,才能處理下一個請求。子進程接受一個用戶請求,需要請求磁盤數據資源,進程處於睡眠狀態,只有將請求的數據加載完,進程纔會被喚醒。
2>.worker: 三層模型, 主進程生成子進程,子進程生成線程,線程用來處理用戶請求。 當請求磁盤數據資源時,線程處於睡眠狀態,只有將請求的數據加載完,線程纔會被喚醒。
3>. event: 事件驅動,從生成進程角度來看上是二層模型, 從工作的模式角度來看是三層模型。 event事件驅動模型, 主進程生成子進程,每個子進程處理多個請求。 請求磁盤數據資源時,該子進程並沒有處於睡眠狀態。 該進程可以接受處理的別的客戶端請求。