1. 程式人生 > >什麼是I/O,你真的懂了嗎?

什麼是I/O,你真的懂了嗎?

在計算機系統中I/O就是輸入(Input)和輸出(Output)的意思,針對不同的操作物件,可以劃分為磁碟I/O模型,網路I/O模型,記憶體對映I/O, Direct I/O、資料庫I/O等,只要具有輸入輸出型別的互動系統都可以認為是I/O系統,也可以說I/O是整個作業系統資料交換與人機互動的通道,這個概念與選用的開發語言沒有關係,是一個通用的概念。

在如今的系統中I/O卻擁有很重要的位置,現在系統都有可能處理大量檔案,大量資料庫操作,而這些操作都依賴於系統的I/O效能,也就造成了現在系統的瓶頸往往都是由於I/O效能造成的。因此,為了解決磁碟I/O效能慢的問題,系統架構中添加了快取來提高響應速度;或者有些高階伺服器從硬體級入手,使用了固態硬碟(SSD)來替換傳統機械硬碟;在大資料方面,Spark越來越多的承擔了實時性計算任務,而傳統的Hadoop體系則大多應用在了離線計算與大量資料儲存的場景,這也是由於磁碟I/O效能遠不如記憶體I/O效能而造成的格局(Spark更多的使用了記憶體,而MapReduece更多的使用了磁碟)。因此,一個系統的優化空間,往往都在低效率的I/O環節上,很少看到一個系統CPU、記憶體的效能是其整個系統的瓶頸。也正因為如此,Java在I/O上也一直在做持續的優化,從JDK 1.4開始便引入了NIO模型,大大的提高了以往BIO模型下的操作效率。

基本定義

這裡先給出BIO、NIO、AIO的基本定義與類比描述:

BIO (Blocking I/O):同步阻塞I/O模式,資料的讀取寫入必須阻塞在一個執行緒內等待其完成。這裡使用那個經典的燒開水例子,這裡假設一個燒開水的場景,有一排水壺在燒開水,BIO的工作模式就是, 叫一個執行緒停留在一個水壺那,直到這個水壺燒開,才去處理下一個水壺。但是實際上執行緒在等待水壺燒開的時間段什麼都沒有做。

NIO (New I/O):同時支援阻塞與非阻塞模式,但這裡我們以其同步非阻塞I/O模式來說明,那麼什麼叫做同步非阻塞?如果還拿燒開水來說,NIO的做法是叫一個執行緒不斷的輪詢每個水壺的狀態,看看是否有水壺的狀態發生了改變,從而進行下一步的操作。

AIO ( Asynchronous I/O):非同步非阻塞I/O模型。非同步非阻塞與同步非阻塞的區別在哪裡?非同步非阻塞無需一個執行緒去輪詢所有IO操作的狀態改變,在相應的狀態改變後,系統會通知對應的執行緒來處理。對應到燒開水中就是,為每個水壺上面裝了一個開關,水燒開之後,水壺會自動通知我水燒開了。

IO呼叫步驟

程序中的IO呼叫步驟大致可以分為以下四步:

程序向作業系統請求資料 ;

作業系統把外部資料載入到核心的緩衝區中;

作業系統把核心的緩衝區拷貝到程序的緩衝區 ;

程序獲得資料完成自己的功能 ;

當作業系統在把外部資料放到程序緩衝區的這段時間(即上述的第二,三步),如果應用程序是掛起等待的,那麼就是同步IO,反之,就是非同步IO,也就是AIO 。

如果覺得內容不錯,記得關注和分享哦!!!

原文出處:https://baijiahao.baidu.com/s?id=1573787612000452