【Linux】 --- Linux五種IO模型

一、什麼是IO

我們知道Linux下一切皆文件,那麼怎麼樣對這些文件進行有效的管理呢,那麼文件描述符應運而生,文件描述符是Linux下抽象出的一種標識文件的概念或者術語。它是一個非負整數。Linux下通過一個文件描述符集合來映射管理所有文件。I/O呢?I/O(input/output),即輸入和輸出端口,操作系統每一個設備都有一個專有的I/O地址用來處理輸入輸出信息。CPU與外部設備之間的通信連接和數據交換都需要通過I/O地址來實現。Linux內核將所有外部設備都看作一個文件來操作,應用程序通過調用文件操作的系統調用來與內核進行交互,來實現設備的訪問和操作。Linux下I/O操作又分爲Linux系統提供的I/O方法和C接口提供的I/O操作方法,兩者區別在於C標準在用戶空間進行了一層封裝,基於流式的操作方法,通過在用戶空間創建緩衝區來減少系統調用的次數來提高效率。在Linux的緩存I/O機制中,操作系統會將I/O的數據緩存在文件系統的page cache中,數據會先被拷貝到page cache中,操作系統定時將page cache中的數據刷新到磁盤。

二、阻塞和非阻塞、同步和異步

1.同步和異步

這兩個概念與消息的通知機制有關。

同步
  所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。比如,調用readfrom系統調用時,必須等待IO操作完成才返回。

異步
  異步的概念和同步相對。當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。比如:調用aio_read系統調用時,不必等IO操作完成就直接返回,調用結果通過信號來通知調用者。

2.阻塞與非阻塞

阻塞與非阻塞與等待消息通知時的狀態有關。

阻塞 
  阻塞調用是指調用結果返回之前,當前線程會被掛起。函數只有在得到結果之後纔會返回。  
  阻塞和同步是完全不同的概念。首先,同步是對於消息的通知機制而言,阻塞是針對等待消息通知時的狀態來說的。而且對於同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。

非阻塞
  非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回,並設置相應的errno。
  雖然表面上看非阻塞的方式可以明顯的提高CPU的利用率,但是也帶了另外一種後果就是系統的線程切換增加。增加的CPU執行時間能不能補償系統的切換成本需要好好評估。

事例
  以小明下載文件爲例,對上述概念做一梳理:
   
①、同步阻塞:小明一直盯着下載進度條,到 100% 的時候就完成。
 
  同步:等待下載完成通知;
  阻塞:等待下載完成通知過程中,不能做其他任務處理;

②、同步非阻塞:小明提交下載任務後就去幹別的,每過一段時間就去瞄一眼進度條,看到 100% 就完成。

同步:等待下載完成通知;
  非阻塞:等待下載完成通知過程中,去幹別的任務了,只是時不時會瞄一眼進度條;【小明必須要在兩個任務間切換,關注下載進度】

③、異步阻塞:小明換了個有下載完成通知功能的軟件,下載完成就“叮”一聲。不過小明仍然一直等待“叮”的聲音(看起來很傻,不是嗎)。

異步:下載完成“叮”一聲通知;
  阻塞:等待下載完成“叮”一聲通知過程中,不能做其他任務處理;

④、異步非阻塞:仍然是那個會“叮”一聲的下載軟件,小明提交下載任務後就去幹別的,聽到“叮”的一聲就知道完成了。
  
  異步:下載完成“叮”一聲通知;
  非阻塞:等待下載完成“叮”一聲通知過程中,去幹別的任務了,只需要接收“叮”聲通知。

三、五種IO模型

1、阻塞 I/O
2、非阻塞 I/O
3、I/O 多路複用
4、信號驅動 I/O( SIGIO)
5、異步 I/O

一般來說,程序進行輸入操作有兩步:
1.等待有數據可以讀
2.將數據從系統內核中拷貝到程序的數據區。

五種Linux IO模型詳解(https://blog.csdn.net/z_ryan/article/details/80873449)

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