標籤:五種i/o模型
I/O操作如何完成?
由於進程無法直接操作I/O裝置,因此必須通過系統調用請求kernel來協助完成I/O操作,核心會為每一個I/O裝置維護一個buffer。其工作流程為:
對於輸入而言,等待(wait)資料輸入至buffer中需要時間,在從buffer複製(copy)到使用者進程緩衝區中也需要時間。因此,根據等待模式不同,I/O動作可以分為5種模式:
linux中的5種I/O模型
1、阻塞I/O模型
在這個模型下。當進程執行系統調用時,如果在使用者進程空間的緩衝區中沒有找到相應的資料,則進程將處於阻塞狀態。當核心從磁碟上讀取資料到核心空間的buffer中,並且buffer中的資料複製到使用者進程空間的緩衝區中這段時間裡,進程都將處於阻塞狀態。當資料到達使用者進程緩衝區中,進程就會解除阻塞狀態,再有進程將資料返回給用戶端。
由於進程處於阻塞狀態,因此很少佔用cpu,只是等待cpu的響應。因此,這種模型可以提高cpu的使用效率。在這種模型下,如果使用者進程空間中依然沒有資料,此時將進程喚醒,仍然沒有什麼用,因此,我們將這種睡眠叫做不可中斷睡眠。
其工作原理:
650) this.width=650;" title="阻塞.jpg" alt="wKioL1UNpEiQ47KkAAB_ZN6P_zo675.jpg" src="http://s3.51cto.com/wyfs02/M00/5B/95/wKioL1UNpEiQ47KkAAB_ZN6P_zo675.jpg" />
2、非阻塞I/O模型
在這種模型下。進程執行系統調用,如果在使用者進程空間緩衝區中沒有找到資料,則進程不會處於阻塞狀態。而是進程不斷的詢問使用者進程空間緩衝區中是否有資料。如果沒有,立即返回EWOULDBLOCK,此時由於進程處於非阻塞狀態,因此,該進程可以做其他的事情。
在這種模型下,進程需要不斷的詢問使用者進程緩衝區中是否有資料,因此,會造成cpu大量的進行環境切換(進程切換),會大量的消耗cpu。這種模型很少被人使用。
其工作原理:
650) this.width=650;" title="非阻塞.jpg" alt="wKiom1UNozTT3rREAADccB1KF6w256.jpg" src="http://s3.51cto.com/wyfs02/M00/5B/9B/wKiom1UNozTT3rREAADccB1KF6w256.jpg" />
3、I/O多工
在這種模型下,進程會受阻於select,poll或epoll函數。這兩個函數可以阻塞多個I/O操作,可以同時對多個讀操作和多個寫操作進行檢測,直到資料變成可讀或可寫時,即資料已經載入到buffer中。才真正調用I/O操作函數,然後再將buffer中的資料複製到使用者進程緩衝區中,然後進程讀取其資料,最後返回給用戶端。
其工作原理:
650) this.width=650;" title="io複用.jpg" alt="wKioL1UNpIHT0lz1AAC_a-DKGVE425.jpg" src="http://s3.51cto.com/wyfs02/M01/5B/95/wKioL1UNpIHT0lz1AAC_a-DKGVE425.jpg" />
4、訊號驅動I/O模型
在這種模型,當核心將資料讀取到核心空間中的buffer中時,核心會為進程產生一個SIGIO訊號。告知進程資料已準備好了,然後進程執行系統調用,將buffer中的資料拷貝至使用者進程緩衝區中,最後進程讀取相應的資料返回給用戶端。
其工作原理:
650) this.width=650;" title="訊號驅動.jpg" alt="wKiom1UNo2ijq31PAAC8jA4bqhc022.jpg" src="http://s3.51cto.com/wyfs02/M01/5B/9B/wKiom1UNo2ijq31PAAC8jA4bqhc022.jpg" />
5、非同步I/O模型
在這種模型下,資料從磁碟載入到buffer中,再將buffer中的資料複製到使用者進程緩衝區。當資料複製完成後,核心會發生一個訊號給進程,這樣進程會在使用者進程緩衝區中讀取資料,然後再返回給用戶端。
其工作原理:
非同步I/O模型與訊號驅動I/O模型的主要區別在於;訊號驅動模型是由核心告知何時啟動I/O操作;而非同步I/O模型是由核心告知I/O操作何時完成。
650) this.width=650;" title="非同步.jpg" alt="wKioL1UNpWyBar0uAACjJgFeix0731.jpg" src="http://s3.51cto.com/wyfs02/M02/5B/95/wKioL1UNpWyBar0uAACjJgFeix0731.jpg" />
5種不同的I/O模型比較
650) this.width=650;" title="io比較.png" alt="wKiom1UNpFygobn8AAI9_RjwEU8611.jpg" src="http://s3.51cto.com/wyfs02/M02/5B/9B/wKiom1UNpFygobn8AAI9_RjwEU8611.jpg" />
同步I/O:synchronous I/O,引起請求進程阻塞,直到I/O完成。在阻塞I/O模型和非阻塞I/O模型中讀寫操作使用的是同步I/O
非同步I/O:asynchronous I/O ,不導致請求進程阻塞。在I/O多工模型和非同步I/O模型中使用的是非同步I/O
水平觸發:隔一段時間通知一次,直到進程看到
邊緣觸發:只發送一次通知,不管進程是否看到
進程和線程的特點
進程特點:
1、對於多進程模型而言,一個進程響應一個請求
2、進程量大,進程切換次數過多
3、每個進程的地址空間是獨立,很多空間是重複的資料,所以記憶體使用量效率較低
線程特點:
1、每個線程響應一個請求:
2、線程依然切換:切換較之進程屬於輕量級
3、同一個進程的線程可以共用進程的諸多資源,比如開啟的檔案;
4、對記憶體的需求較之進程略有下降;
5、快速切換時會帶來線程抖動
本文出自 “linux學習之路” 部落格,轉載請與作者聯絡!
linux的五種I/O模型