swoole - 五種IO模式簡介

近期在學習swoole,需要學習的有網絡知識,其中IO模式是重點,下面就來先看看描述

對於一次IO訪問(以read舉例),數據會先被拷貝到操作系統內核的緩衝區中,然後纔會從操作系統內核的緩衝區拷貝到應用程序的內存地址空間。所以說,當一個read操作發生時,它會經歷兩個階段:
1. 等待內核緩衝區中數據準備 (Waiting for the data to be ready)
2. 將數據從內核緩衝區拷貝到進程中 (Copying the data from the kernel to the process)

正式因爲這兩個階段,linux系統產生了下面五種IO模式的方案:

  1. 阻塞 I/O(blocking IO)
  2. 非阻塞 I/O(nonblocking IO)
  3. I/O 多路複用( IO multiplexing)
  4. 異步 I/O(asynchronous IO)
  5. 信號驅動 I/O( signal driven IO)

當一個進程需要read數據時,它需要先從內核緩存區中讀取數據,當在內核中數據還未準備好時,則該進程會被阻塞(block),直到數據準備好爲止。

非阻塞 I/O(nonblocking IO)

一個進程需要read數據時,它需要先從內核緩存區中讀取數據,當在內核中數據還未準備好時,內核立即返回error,用戶進程得知error後,會繼續read,直到數據準備好爲止。

I/O 多路複用( IO multiplexing)

上述阻塞IO和非阻塞IO,當時一個用戶進程對應一個IO操作,IO多路複用則通過一定的機制實現了一個進程可以對應多個IO操作。

IO多路複用主要有select、poll、epoll三種模式,select/poll相差不大,主要是通過輪詢來不斷的檢測是否有描述符已就緒,select默認情況下支持最多監控1024個描述符,poll則沒有這個限制(底層通過鏈表實現,可動態增加);epoll不是通過輪詢,而是通過回調(callback)方式主動通知已有描述符已就緒,相比較select/poll效率有明顯提升。

不管哪種模式的IO多路複用,還都是同步IO,比如當監控的所有的描述符都還沒有準備就緒,那麼該進程還是阻塞在此,下面將介紹異步IO

異步 I/O(asynchronous IO)

相比較同步IO,異步IO就顯得更加高大上了,基本原理是用戶進程發起read操作之後,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到一個asynchronous read之後,首先它會立刻返回,所以不會對用戶進程產生任何block。然後kernel會等待數據準備完成,然後將數據拷貝到用戶內存,當這一切都完成之後,kernel會給用戶進程發送一個signal,告訴它read操作完成了,用戶進程收到signal後獲取已準備好的數據。

信號驅動 I/O( signal driven IO)

信號驅動IO和異步IO類似,甚至有些人認爲信號驅動IO就是異步IO,當kernel準備好數據後,會發送signal給用戶進程,告訴進程數據已經準備就緒,這時進程會主動去read數據將數據拷貝到用戶內存,這一步是由應用程序自己操作的,而異步IO則是由kernal實現,區別在此。

後面的文章用代碼來解析一下這5種模式。
 

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