Linux IO模型漫談(2)


不管Linux的IO模型的阻塞同步分類是如何分類,幾種IO模型的具體實現是確定的。這里借用《Unix 網絡編程:卷一》的圖片說明。

1 阻塞式IO模型

clip_image001

這個模型也是最容易理解的

程序調用和我們基本的程序編寫是一致的:

fd = connect()

write(fd)

read(fd)

close(fd)

程序的read必須在write之后執行,當write阻塞住了,read就不能執行下去

2 非阻塞IO模型

clip_image002

從圖中可以看出來,這是一個輪詢的過程

每次用戶詢問內核是否有數據報准備好(文件描述符緩沖區是否就緒),當數據報准備好的時候,就進行拷貝數據報的操作。當數據報沒有准備好的時候,也不阻塞程序,內核直接返回未准備就緒的信號,等待用戶程序的下一次輪詢。

3 I/O復用模型

clip_image003

IO復用模型是多了一個select函數,select函數有一個參數是文件描述符集合,意思就是對這些的文件描述符進行循環監聽,當某個文件描述符就緒的時候,就對這個文件描述符進行處理。

這種IO模型是屬於阻塞的IO。但是由於它可以對多個文件描述符進行阻塞監聽,所以它的效率比阻塞IO模型高效。

4 信號驅動IO模型

clip_image004

信號驅動IO模型是應用進程告訴內核:當你的數據報准備好的時候,給我發送一個信號哈,並且調用我的信號處理函數來獲取數據報。這個模型是由信號進行驅動。

5 異步IO模型

clip_image005

異步IO使用的不再是read和write的系統接口了,應用工程序調用aio_XXXX系列的內核接口。

當應用程序調用aio_read的時候,內核一方面去取數據報內容返回,另外一方面將程序控制權還給應用進程,應用進程繼續處理其他事務。這樣應用進程就是一種非阻塞的狀態。

當內核的數據報就緒的時候,是由內核將數據報拷貝到應用進程中,返回給aio_read中定義好的函數處理程序。

Creative Commons License

本文基於署名-非商業性使用 3.0許可協議發布,歡迎轉載,演繹,但是必須保留本文的署名葉劍峰(包含鏈接http://www.cnblogs.com/yjf512/),且不得用於商業目的。如您有任何疑問或者授權方面的協商,請與我聯系


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM